aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2018-02-20 16:45:00 +0200
committerAvi Levkovich <avi@twine-s.com>2018-02-20 16:45:00 +0200
commit6c208c90bc45aff4a7fa214356a42fe7757c5e6f (patch)
tree0d77bc6a0ecfbb53cf42c5462ee19212197ee1bd /Software/Visual_Studio/MachineStudio
parentb0823127f152fe97a6e8fce29e427c7f3db9cf5a (diff)
parent1a573aaa346ec4b8bd58a0e35ab9df571a09b855 (diff)
downloadTango-6c208c90bc45aff4a7fa214356a42fe7757c5e6f.tar.gz
Tango-6c208c90bc45aff4a7fa214356a42fe7757c5e6f.zip
MERGE
Diffstat (limited to 'Software/Visual_Studio/MachineStudio')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml.cs10
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/ByteArrayToFileSizeConverter.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/EventTypeActionsToStringConverter.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/LiquidTypeRmlsToStringConverter.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/RolesPermissionsToStringConverter.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/UsersRolesToStringConverter.cs6
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/CustomAttributes/DBViewAttribute.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/DBModule.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/RegisteredView.cs44
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/ViewsManager.cs12
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/CloseEntityEditViewMessage.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/OpenEntityEditViewMessage.cs21
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Tango.MachineStudio.DB.csproj105
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModelLocator.cs55
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ActionTypesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CatsViewVM.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CctsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ContactsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs39
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EventTypesViewVM.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberShapesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberSynthsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPackFormulasViewVM.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs)7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LinearMassDensityUnitsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesRmlsViewVM.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs)6
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesViewVM.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs32
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaColorsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaConditionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaMaterialsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaPurposesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MidTankTypesViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesGroupsViewVM.cs33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RmlsViewVM.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatView.xaml9
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatsView.xaml7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationView.xaml14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationsView.xaml14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypeView.xaml4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypesView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml)16
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml.cs)4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml)17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml.cs)4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackView.xaml25
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPacksView.xaml15
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml)20
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml.cs30
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionsView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachinesView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml63
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml.cs)4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml32
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml.cs30
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml46
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml.cs)4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlView.xaml14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlsView.xaml14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml3
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml32
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml.cs68
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/DataCaptureModule.cs84
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/capture-device.pngbin0 -> 1812 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/data-capture.jpgbin0 -> 121309 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/recordings.pngbin0 -> 858 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/tape.pngbin0 -> 713 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/video-frame.pngbin0 -> 97254 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/AssemblyInfo.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.Designer.cs62
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.resx117
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.Designer.cs30
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.settings7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Recording/DataRecording.cs52
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Tango.MachineStudio.DataCapture.csproj182
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModelLocator.cs33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModels/MainViewVM.cs326
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml251
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml.cs (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml.cs)8
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml50
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/app.config11
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/packages.config8
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopCMYKToColorConverter.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopLabToColorConverter.cs52
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToColorConverter.cs44
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetLimitConverter.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetValueConverter.cs52
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/InkVolumeToLiquidRmlFactor.cs34
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobProgressToPositionConverter.cs43
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobToColumnDefinitionsConverter.cs37
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/ObjectsNotEqualToBooleanConveter.cs30
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/OneToPercentConverter.cs23
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentLengthToWidthConverter.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverter.cs48
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverterMulti.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverter.cs41
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverterMulti.cs46
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/DeveloperModule.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/White-Background.jpgbin0 -> 606699 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/black-screen.jpgbin0 -> 15003 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/calendar.pngbin0 -> 1240 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/camera.pngbin0 -> 1360 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/color-palette.pngbin0 -> 1880 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/colorspace.pngbin0 -> 4232 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/description.pngbin0 -> 576 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/graphs.pngbin0 -> 1666 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/inter-segment.pngbin0 -> 1983 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/line_graph.pngbin0 -> 14612 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/lubrication.pngbin0 -> 1380 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/machine-trans.pngbin0 -> 45618 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/name.pngbin0 -> 600 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/no-signal.jpgbin0 -> 611002 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/rgb.pngbin0 -> 1524 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/ruler.pngbin0 -> 1110 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment-single.pngbin0 -> 535 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment.pngbin0 -> 1610 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/tape.pngbin0 -> 713 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/video-frame.pngbin0 -> 97254 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/wind.pngbin0 -> 1267 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationManager.cs20
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationView.cs15
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Resources/GraphEx.xaml126
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Tango.MachineStudio.Developer.csproj222
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModelLocator.cs36
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs1567
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/IMainView.cs13
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml1380
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml.cs137
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml214
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml406
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml.cs20
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml45
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/app.config10
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/packages.config17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachineVersionsProvider.cs26
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachinesProvider.cs11
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Images/formula.pngbin0 -> 853 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/MachineDesignerModule.cs45
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj27
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MachineVersionDialogVM.cs55
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs415
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml71
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml327
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml128
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubManager.cs10
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubsModule.cs47
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Tango.MachineStudio.Stubs.csproj4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModels/MainViewVM.cs33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml37
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/AutoComplete/MachinesProvider.cs11
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/SyncNavigationManager.cs7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/SynchronizationModule.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj4
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/LocalSynchronizationViewVM.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MainViewVM.cs42
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MenuViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/RemoteSynchronizationViewVM.cs55
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MenuView.xaml122
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToMultiChannleMonitorsConverter.cs34
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToSingleChannleMonitorsConverter.cs34
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/SecondsToGraphPointsConverter.cs27
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalInsConverter.cs35
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalOutsConverter.cs35
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TransitionLinkConverter.cs55
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml92
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml.cs90
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml103
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml.cs90
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml288
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml.cs181
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml88
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml.cs102
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml96
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml.cs102
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml279
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml.cs186
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml270
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml.cs177
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml81
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml.cs102
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml81
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml.cs102
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml199
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml.cs164
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Fonts/digital-7.ttfbin0 -> 34360 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Helpers/GraphsHelper.cs34
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/analog.pngbin0 -> 7334 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/binary.pngbin0 -> 2163 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/black-screen.jpgbin0 -> 15003 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/box.pngbin0 -> 64765 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/cogs-small.gifbin0 -> 172879 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/digital-in.pngbin0 -> 2082 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-big.pngbin0 -> 1580 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-line.pngbin0 -> 36326 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/engine.pngbin0 -> 800 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/graph.pngbin0 -> 1842 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.gifbin0 -> 56511 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.pngbin0 -> 2215 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/multi-graph.pngbin0 -> 1185 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/prop.pngbin0 -> 30883 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/seamless-grid.jpgbin0 -> 12022 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/single-graph.pngbin0 -> 4236 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/technician.jpgbin0 -> 58676 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/tft-screen.pngbin0 -> 45731 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation.gifbin0 -> 254920 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation2.gifbin0 -> 1673289 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread.pngbin0 -> 2540 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/volume.pngbin0 -> 1929 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/white-box.pngbin0 -> 56987 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationManager.cs24
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationView.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Project/MachineTechViewProject.cs32
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/AssemblyInfo.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.Designer.cs62
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.resx117
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.Designer.cs30
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.settings7
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml44
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml64
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml43
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml.cs31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml44
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml41
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml33
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Resources/GraphEx.xaml126
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Tango.MachineStudio.Technician.csproj460
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalInItem.cs73
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalOutItem.cs98
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DispenserItem.cs153
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MeterItem.cs128
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MonitorItem.cs92
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorActionType.cs21
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorGroupItem.cs197
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorItem.cs154
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MultiGraphItem.cs83
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/SingleGraphItem.cs82
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItem.cs244
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItemAttribute.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/ThreadMotionItem.cs75
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianDbContext.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianModule.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModelLocator.cs55
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs1124
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MainViewVM.cs56
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/SensorsViewVM.cs192
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml404
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml.cs65
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml102
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml.cs31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml (renamed from Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml)6
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml12
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml173
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml.cs54
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/app.config11
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/packages.config17
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs20
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml23
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml.cs102
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs53
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs24
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs6
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml90
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs179
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml95
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs162
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/TableGrid.cs58
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/PointToMarginConverter.cs5
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/SecondsToGraphPointsConverter.cs27
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/DefaultDiagnosticsFrameProvider.cs84
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/IDiagnosticsFrameProvider.cs31
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/IStudioMessageExtensions.cs7
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/UserExtensions.cs14
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Fonts/digital-7.ttfbin0 -> 34360 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Helpers/GraphsHelper.cs34
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs32
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Messages/IStudioMessage.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Modules/IStudioModuleLoader.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationManager.cs7
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/BarItem.cs51
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/DialogViewVM.cs23
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/INotificationProvider.cs105
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/TaskItem.cs21
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Properties/AssemblyInfo.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/GradientOffsetSlider.xaml83
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml306
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IModuleRequestListener.cs21
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownListener.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownRequestBlocker.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs38
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs113
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj75
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ValidationRules/Required.cs12
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/DefaultVideoCaptureProvider.cs44
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/IVideoCaptureProvider.cs21
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Installer/Tango.MachineStudio.Installer.vdproj8338
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml5
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs60
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Authentication/DefaultAuthenticationProvider.cs24
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/White-Abstract.pngbin0 -> 375774 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/exception.pngbin0 -> 1528 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-tcp.pngbin10187 -> 3618 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-usb.pngbin9573 -> 3623 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml48
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs56
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Navigation/DefaultNavigationManager.cs9
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DefaultNotificationProvider.cs168
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DialogWindow.xaml.cs2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml44
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml.cs99
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs112
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/SupervisingController/IMainView.cs11
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj36
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs10
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs25
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineConnectionViewVM.cs26
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineLoginViewVM.cs20
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs98
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ShutdownViewVM.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MachineConnectionView.xaml48
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml199
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs60
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ShutdownView.xaml2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionResolutions.cs15
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml61
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml.cs48
382 files changed, 28603 insertions, 1047 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml
index d1c62ed7e..d0f6b045a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml
@@ -5,7 +5,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280">
+ d:DesignHeight="720" d:DesignWidth="1300">
<Grid>
<Grid>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml.cs
index 9ae14952b..8d2a44213 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Controls/DbTableView.xaml.cs
@@ -17,11 +17,16 @@ using System.Windows.Shapes;
namespace Tango.MachineStudio.DB.Controls
{
/// <summary>
- /// Interaction logic for DbTableView.xaml
+ /// Represents a database table view wrapper.
/// </summary>
+ /// <seealso cref="System.Windows.Controls.UserControl" />
+ /// <seealso cref="System.Windows.Markup.IComponentConnector" />
[ContentProperty(nameof(MainContent))]
public partial class DbTableView : UserControl
{
+ /// <summary>
+ /// Gets or sets the data table view.
+ /// </summary>
public FrameworkElement MainContent
{
get { return (FrameworkElement)GetValue(MainContentProperty); }
@@ -30,6 +35,9 @@ namespace Tango.MachineStudio.DB.Controls
public static readonly DependencyProperty MainContentProperty =
DependencyProperty.Register("MainContent", typeof(FrameworkElement), typeof(DbTableView), new PropertyMetadata(null));
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DbTableView"/> class.
+ /// </summary>
public DbTableView()
{
InitializeComponent();
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/ByteArrayToFileSizeConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/ByteArrayToFileSizeConverter.cs
index 8a690450c..36591cb65 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/ByteArrayToFileSizeConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/ByteArrayToFileSizeConverter.cs
@@ -8,6 +8,10 @@ using System.Windows.Data;
namespace Tango.MachineStudio.DB.Converters
{
+ /// <summary>
+ /// Converts a byte array size to friendly size string.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class ByteArrayToFileSizeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/EventTypeActionsToStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/EventTypeActionsToStringConverter.cs
index 4673d12b2..c50493c3d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/EventTypeActionsToStringConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/EventTypeActionsToStringConverter.cs
@@ -5,11 +5,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.DB.ViewModels;
namespace Tango.MachineStudio.DB.Converters
{
+ /// <summary>
+ /// Converts an event type action to string representation.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class EventTypeActionsToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
@@ -19,7 +23,7 @@ namespace Tango.MachineStudio.DB.Converters
if (value is IEnumerable<EventTypesAction>)
{
IEnumerable<EventTypesAction> eventActions = value as IEnumerable<EventTypesAction>;
- return String.Join(", ", eventActions.Where(x => !x.Deleted).Select(x => x.ActionTypes.Name));
+ return String.Join(", ", eventActions.Select(x => x.ActionType.Name));
}
else
{
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/LiquidTypeRmlsToStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/LiquidTypeRmlsToStringConverter.cs
index 0bbcd68a3..b9b0b6656 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/LiquidTypeRmlsToStringConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/LiquidTypeRmlsToStringConverter.cs
@@ -5,11 +5,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.DB.ViewModels;
namespace Tango.MachineStudio.DB.Converters
{
+ /// <summary>
+ /// Converts a liquid type RML to string.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class LiquidTypeRmlsToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
@@ -19,7 +23,7 @@ namespace Tango.MachineStudio.DB.Converters
if (value is IEnumerable<LiquidTypesRml>)
{
IEnumerable<LiquidTypesRml> liquidRmls = value as IEnumerable<LiquidTypesRml>;
- return String.Join(", ", liquidRmls.Where(x => !x.Deleted).Select(x => x.Rml.Name));
+ return String.Join(", ", liquidRmls.Select(x => x.Rml.Name));
}
else
{
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/RolesPermissionsToStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/RolesPermissionsToStringConverter.cs
index 7a301bd12..fb7c39fd9 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/RolesPermissionsToStringConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/RolesPermissionsToStringConverter.cs
@@ -6,11 +6,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.DB.ViewModels;
namespace Tango.MachineStudio.DB.Converters
{
+ /// <summary>
+ /// Converts user permission to string.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class RolesPermissionsToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
@@ -20,7 +24,7 @@ namespace Tango.MachineStudio.DB.Converters
if (value is IEnumerable<RolesPermission>)
{
IEnumerable<RolesPermission> rolesPermissions = value as IEnumerable<RolesPermission>;
- return String.Join(", ", rolesPermissions.Where(x => !x.Deleted).Select(x => x.Permission.Name));
+ return String.Join(", ", rolesPermissions.Select(x => x.Permission.Name));
}
else
{
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/UsersRolesToStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/UsersRolesToStringConverter.cs
index 5f820d41d..f6aaeede1 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/UsersRolesToStringConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Converters/UsersRolesToStringConverter.cs
@@ -6,11 +6,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.DB.ViewModels;
namespace Tango.MachineStudio.DB.Converters
{
+ /// <summary>
+ /// Converts user role to string.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class UsersRolesToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/CustomAttributes/DBViewAttribute.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/CustomAttributes/DBViewAttribute.cs
index 4bf920015..d512ae460 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/CustomAttributes/DBViewAttribute.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/CustomAttributes/DBViewAttribute.cs
@@ -6,6 +6,10 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.DB.CustomAttributes
{
+ /// <summary>
+ /// Represents a database view attribute. This will tell the module to treat the view as a data table view.
+ /// </summary>
+ /// <seealso cref="System.Attribute" />
public class DBViewAttribute : Attribute
{
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/DBModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/DBModule.cs
index 0928d2a1f..0ad6aa541 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/DBModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/DBModule.cs
@@ -5,41 +5,49 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.DB.Views;
namespace Tango.MachineStudio.DB
{
- public class DBModule : IStudioModule
+ /// <summary>
+ /// Represents a Machine Studio database module.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public class DBModule : StudioModuleBase
{
- private bool _isInitialized;
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Data Base";
- public string Name => "Data Base";
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Provides access to raw database tables.";
- public string Description => "Provides access to raw database tables.";
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => SharedUI.Helpers.ResourceHelper.GetImageFromResources("Images/db.png");
- public BitmapSource Image => SharedUI.Helpers.ResourceHelper.GetImageFromResources("Images/db.png");
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MainDBView();
- public FrameworkElement MainView => new MainDBView();
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunDataBaseModule;
- public bool IsInitialized => _isInitialized;
-
- public Permissions Permission => Permissions.RunDataBaseModule;
-
- public void Dispose()
- {
- throw new NotImplementedException();
- }
-
- public void Initialize()
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
{
- if (!_isInitialized)
- {
- //Initialize
-
- _isInitialized = true;
- }
+
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/RegisteredView.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/RegisteredView.cs
index fc9051edb..bdf2105a6 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/RegisteredView.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/RegisteredView.cs
@@ -10,19 +10,42 @@ using Tango.MachineStudio.Common.Controls;
namespace Tango.MachineStudio.DB.Managers
{
+ /// <summary>
+ /// Represents a registered MDI child (data table) view
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Controls.MdiChild" />
public class RegisteredView : MdiChild
{
private static Random rnd = new Random();
+ /// <summary>
+ /// Adds the view to the display.
+ /// </summary>
public RelayCommand AddCommand { get; set; }
+ /// <summary>
+ /// Initializes a new instance of the <see cref="RegisteredView"/> class.
+ /// </summary>
+ /// <param name="header">The header.</param>
+ /// <param name="view">The view.</param>
+ /// <param name="action">The action.</param>
public RegisteredView(String header, FrameworkElement view, Action action)
{
Location = new Point(rnd.Next(30, 200), rnd.Next(30, 200));
Icon = PackIconKind.Table;
+
+ if (header.Length < 5)
+ {
+ header = header.ToUpper();
+ }
+
Header = header;
+
View = view;
+ View.MaxWidth = 1500;
+ View.MaxHeight = 800;
+
if (action != null)
{
AddCommand = new RelayCommand(action);
@@ -34,6 +57,8 @@ namespace Tango.MachineStudio.DB.Managers
if (!ViewsManager.DisplayedViews.Contains(this))
{
ViewsManager.DisplayedViews.Add(this);
+ View.BringIntoView();
+ View.Focus();
}
else
{
@@ -44,12 +69,31 @@ namespace Tango.MachineStudio.DB.Managers
}
}
+ /// <summary>
+ /// Initializes a new instance of the <see cref="RegisteredView"/> class.
+ /// </summary>
+ /// <param name="header">The header.</param>
+ /// <param name="view">The view.</param>
public RegisteredView(String header, FrameworkElement view) : this(header, view, null)
{
+ if (header.Length < 5)
+ {
+ header = header.ToUpper();
+ }
+
+ view.MaxWidth = 1500;
+ view.MaxHeight = 800;
+
Header = header;
View = view;
}
+ /// <summary>
+ /// Returns a <see cref="System.String" /> that represents this instance.
+ /// </summary>
+ /// <returns>
+ /// A <see cref="System.String" /> that represents this instance.
+ /// </returns>
public override string ToString()
{
return Header;
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/ViewsManager.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/ViewsManager.cs
index 2bb5969bc..e136c5983 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/ViewsManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Managers/ViewsManager.cs
@@ -11,12 +11,24 @@ using Tango.MachineStudio.DB.Views.DBViews;
namespace Tango.MachineStudio.DB.Managers
{
+ /// <summary>
+ /// Represents the data table views manager.
+ /// </summary>
public static class ViewsManager
{
+ /// <summary>
+ /// Gets or sets the displayed views.
+ /// </summary>
public static ObservableCollection<RegisteredView> DisplayedViews { get; set; }
+ /// <summary>
+ /// Gets or sets all the views.
+ /// </summary>
public static ObservableCollection<RegisteredView> DbViews { get; set; }
+ /// <summary>
+ /// Initializes the <see cref="ViewsManager"/> class.
+ /// </summary>
static ViewsManager()
{
DisplayedViews = new ObservableCollection<RegisteredView>();
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/CloseEntityEditViewMessage.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/CloseEntityEditViewMessage.cs
index 97e5cf21c..22e65149e 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/CloseEntityEditViewMessage.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/CloseEntityEditViewMessage.cs
@@ -7,6 +7,10 @@ using Tango.MachineStudio.Common.Messages;
namespace Tango.MachineStudio.DB.Messages
{
+ /// <summary>
+ /// Invoked when the user has closed the current editable entity.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Messages.IStudioMessage" />
public class CloseEntityEditViewMessage : IStudioMessage
{
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/OpenEntityEditViewMessage.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/OpenEntityEditViewMessage.cs
index b3bf53f93..7a55c8148 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/OpenEntityEditViewMessage.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Messages/OpenEntityEditViewMessage.cs
@@ -3,21 +3,40 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Messages;
using Tango.MachineStudio.DB.ViewModels;
using Tango.SharedUI;
namespace Tango.MachineStudio.DB.Messages
{
+ /// <summary>
+ /// Invoked when the user has opened an entity for editing.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Messages.IStudioMessage" />
public class OpenEntityEditViewMessage : IStudioMessage
{
+ /// <summary>
+ /// Gets or sets the dialog open mode.
+ /// </summary>
public DialogOpenMode DialogOpenMode { get; set; }
+ /// <summary>
+ /// Gets or sets the context.
+ /// </summary>
public ViewModel Context { get; set; }
+ /// <summary>
+ /// Gets or sets the type of the entity.
+ /// </summary>
public Type EntityType { get; set; }
+ /// <summary>
+ /// Initializes a new instance of the <see cref="OpenEntityEditViewMessage"/> class.
+ /// </summary>
+ /// <param name="mode">The mode.</param>
+ /// <param name="context">The context.</param>
+ /// <param name="entityType">Type of the entity.</param>
public OpenEntityEditViewMessage(DialogOpenMode mode, ViewModel context, Type entityType)
{
DialogOpenMode = mode;
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Tango.MachineStudio.DB.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Tango.MachineStudio.DB.csproj
index 4faf2125a..aa33f9a20 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Tango.MachineStudio.DB.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Tango.MachineStudio.DB.csproj
@@ -100,7 +100,6 @@
<Compile Include="ViewModels\ApplicationFirmwareVersionsViewVM.cs" />
<Compile Include="ViewModels\ApplicationOsVersionsViewVM.cs" />
<Compile Include="ViewModels\ApplicationVersionsViewVM.cs" />
- <Compile Include="ViewModels\CartridgesViewVM.cs" />
<Compile Include="ViewModels\CartridgeTypesViewVM.cs" />
<Compile Include="ViewModels\CatsViewVM.cs" />
<Compile Include="ViewModels\CctsViewVM.cs" />
@@ -109,15 +108,16 @@
<Compile Include="ViewModels\DbTableViewModel.cs" />
<Compile Include="ViewModels\DialogOpenMode.cs" />
<Compile Include="ViewModels\DispenserTypesViewVM.cs" />
- <Compile Include="ViewModels\DispensersViewVM.cs" />
<Compile Include="ViewModels\EmbeddedFirmwareVersionsViewVM.cs" />
<Compile Include="ViewModels\EmbeddedSoftwareVersionsViewVM.cs" />
<Compile Include="ViewModels\EventTypesViewVM.cs" />
<Compile Include="ViewModels\FiberShapesViewVM.cs" />
<Compile Include="ViewModels\FiberSynthsViewVM.cs" />
<Compile Include="ViewModels\HardwareVersionsViewVM.cs" />
+ <Compile Include="ViewModels\IdsPackFormulasViewVM.cs" />
<Compile Include="ViewModels\IdsPacksViewVM.cs" />
<Compile Include="ViewModels\LinearMassDensityUnitsViewVM.cs" />
+ <Compile Include="ViewModels\LiquidTypesRmlsViewVM.cs" />
<Compile Include="ViewModels\LiquidTypesViewVM.cs" />
<Compile Include="ViewModels\MachinesViewVM.cs" />
<Compile Include="ViewModels\MachineVersionsViewVM.cs" />
@@ -129,6 +129,8 @@
<Compile Include="ViewModels\MultiComboVM.cs" />
<Compile Include="ViewModels\OrganizationsViewVM.cs" />
<Compile Include="ViewModels\PermissionsViewVM.cs" />
+ <Compile Include="ViewModels\ProcessParametersTablesViewVM.cs" />
+ <Compile Include="ViewModels\ProcessParametersTablesGroupsViewVM.cs" />
<Compile Include="ViewModels\RmlsViewVM.cs" />
<Compile Include="ViewModels\RolesViewVM.cs" />
<Compile Include="ViewModels\UsersViewVM.cs" />
@@ -141,6 +143,24 @@
<Compile Include="Views\DBViews\ActionTypeView.xaml.cs">
<DependentUpon>ActionTypeView.xaml</DependentUpon>
</Compile>
+ <Compile Include="Views\DBViews\IdsPackFormulasView.xaml.cs">
+ <DependentUpon>IdsPackFormulasView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\DBViews\IdsPackFormulaView.xaml.cs">
+ <DependentUpon>IdsPackFormulaView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\DBViews\ProcessParametersTablesGroupsView.xaml.cs">
+ <DependentUpon>ProcessParametersTablesGroupsView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\DBViews\ProcessParametersTablesGroupView.xaml.cs">
+ <DependentUpon>ProcessParametersTablesGroupView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\DBViews\ProcessParametersTablesView.xaml.cs">
+ <DependentUpon>ProcessParametersTablesView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\DBViews\ProcessParametersTableView.xaml.cs">
+ <DependentUpon>ProcessParametersTableView.xaml</DependentUpon>
+ </Compile>
<Compile Include="Views\DBViews\MidTankTypesView.xaml.cs">
<DependentUpon>MidTankTypesView.xaml</DependentUpon>
</Compile>
@@ -219,24 +239,12 @@
<Compile Include="Views\DBViews\CartridgeTypesView.xaml.cs">
<DependentUpon>CartridgeTypesView.xaml</DependentUpon>
</Compile>
- <Compile Include="Views\DBViews\CartridgesView.xaml.cs">
- <DependentUpon>CartridgesView.xaml</DependentUpon>
- </Compile>
- <Compile Include="Views\DBViews\DispensersView.xaml.cs">
- <DependentUpon>DispensersView.xaml</DependentUpon>
- </Compile>
<Compile Include="Views\DBViews\DispenserTypesView.xaml.cs">
<DependentUpon>DispenserTypesView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\DBViews\CartridgeTypeView.xaml.cs">
<DependentUpon>CartridgeTypeView.xaml</DependentUpon>
</Compile>
- <Compile Include="Views\DBViews\CartridgeView.xaml.cs">
- <DependentUpon>CartridgeView.xaml</DependentUpon>
- </Compile>
- <Compile Include="Views\DBViews\DispenserView.xaml.cs">
- <DependentUpon>DispenserView.xaml</DependentUpon>
- </Compile>
<Compile Include="Views\DBViews\DispenserTypeView.xaml.cs">
<DependentUpon>DispenserTypeView.xaml</DependentUpon>
</Compile>
@@ -336,21 +344,24 @@
<Compile Include="Views\DBViews\EventTypesView.xaml.cs">
<DependentUpon>EventTypesView.xaml</DependentUpon>
</Compile>
+ <Compile Include="Views\DBViews\LiquidTypesRmlsView.xaml.cs">
+ <DependentUpon>LiquidTypesRmlsView.xaml</DependentUpon>
+ </Compile>
<Compile Include="Views\DBViews\UsersView.xaml.cs">
<DependentUpon>UsersView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\DBViews\EventTypeView.xaml.cs">
<DependentUpon>EventTypeView.xaml</DependentUpon>
</Compile>
+ <Compile Include="Views\DBViews\LiquidTypesRmlView.xaml.cs">
+ <DependentUpon>LiquidTypesRmlView.xaml</DependentUpon>
+ </Compile>
<Compile Include="Views\DBViews\UserView.xaml.cs">
<DependentUpon>UserView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\MainDBView.xaml.cs">
<DependentUpon>MainDBView.xaml</DependentUpon>
</Compile>
- <Compile Include="Windows\DBDialogWindow.xaml.cs">
- <DependentUpon>DBDialogWindow.xaml</DependentUpon>
- </Compile>
<Page Include="Controls\DbTableView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -374,6 +385,30 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
+ <Page Include="Views\DBViews\IdsPackFormulasView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\DBViews\IdsPackFormulaView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\DBViews\ProcessParametersTablesGroupsView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\DBViews\ProcessParametersTablesGroupView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\DBViews\ProcessParametersTablesView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\DBViews\ProcessParametersTableView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
<Page Include="Views\DBViews\MidTankTypesView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -478,14 +513,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
- <Page Include="Views\DBViews\CartridgesView.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
- <Page Include="Views\DBViews\DispensersView.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
<Page Include="Views\DBViews\DispenserTypesView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -494,14 +521,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
- <Page Include="Views\DBViews\CartridgeView.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
- <Page Include="Views\DBViews\DispenserView.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
<Page Include="Views\DBViews\DispenserTypeView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -634,6 +653,10 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
+ <Page Include="Views\DBViews\LiquidTypesRmlsView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
<Page Include="Views\DBViews\UsersView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -642,17 +665,17 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
- <Page Include="Views\DBViews\UserView.xaml">
+ <Page Include="Views\DBViews\LiquidTypesRmlView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
- <Page Include="Views\MainDBView.xaml">
+ <Page Include="Views\DBViews\UserView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
- <Page Include="Windows\DBDialogWindow.xaml">
- <SubType>Designer</SubType>
+ <Page Include="Views\MainDBView.xaml">
<Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
@@ -689,14 +712,14 @@
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
<Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
<Name>Tango.DAL.Remote</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
+ <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
+ <Name>Tango.Integration</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj">
<Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
<Name>Tango.SharedUI</Name>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModelLocator.cs
index 3079f8e5f..46223d9f4 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModelLocator.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModelLocator.cs
@@ -36,10 +36,9 @@ namespace Tango.MachineStudio.DB
SimpleIoc.Default.Register<HardwareVersionsViewVM>();
SimpleIoc.Default.Register<IdsPacksViewVM>();
- SimpleIoc.Default.Register<DispensersViewVM>();
+ SimpleIoc.Default.Register<IdsPackFormulasViewVM>();
SimpleIoc.Default.Register<DispenserTypesViewVM>();
SimpleIoc.Default.Register<LiquidTypesViewVM>();
- SimpleIoc.Default.Register<CartridgesViewVM>();
SimpleIoc.Default.Register<CartridgeTypesViewVM>();
SimpleIoc.Default.Register<MidTankTypesViewVM>();
@@ -56,9 +55,13 @@ namespace Tango.MachineStudio.DB
SimpleIoc.Default.Register<FiberShapesViewVM>();
SimpleIoc.Default.Register<FiberSynthsViewVM>();
SimpleIoc.Default.Register<RmlsViewVM>();
+ SimpleIoc.Default.Register<LiquidTypesRmlsViewVM>();
SimpleIoc.Default.Register<CctsViewVM>();
SimpleIoc.Default.Register<CatsViewVM>();
+
+ SimpleIoc.Default.Register<ProcessParametersTablesViewVM>();
+ SimpleIoc.Default.Register<ProcessParametersTablesGroupsViewVM>();
}
public static MainViewVM MainViewVM
@@ -197,14 +200,6 @@ namespace Tango.MachineStudio.DB
}
}
- public static DispensersViewVM DispensersViewVM
- {
- get
- {
- return ServiceLocator.Current.GetInstance<DispensersViewVM>();
- }
- }
-
public static DispenserTypesViewVM DispenserTypesViewVM
{
get
@@ -221,14 +216,6 @@ namespace Tango.MachineStudio.DB
}
}
- public static CartridgesViewVM CartridgesViewVM
- {
- get
- {
- return ServiceLocator.Current.GetInstance<CartridgesViewVM>();
- }
- }
-
public static CartridgeTypesViewVM CartridgeTypesViewVM
{
get
@@ -348,5 +335,37 @@ namespace Tango.MachineStudio.DB
return ServiceLocator.Current.GetInstance<MidTankTypesViewVM>();
}
}
+
+ public static LiquidTypesRmlsViewVM LiquidTypesRmlViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<LiquidTypesRmlsViewVM>();
+ }
+ }
+
+ public static ProcessParametersTablesViewVM ProcessParametersTablesViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<ProcessParametersTablesViewVM>();
+ }
+ }
+
+ public static ProcessParametersTablesGroupsViewVM ProcessParametersTablesGroupsViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<ProcessParametersTablesGroupsViewVM>();
+ }
+ }
+
+ public static IdsPackFormulasViewVM IdsPackFormulasViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<IdsPackFormulasViewVM>();
+ }
+ }
}
} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ActionTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ActionTypesViewVM.cs
index fe9ebda26..46128c394 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ActionTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ActionTypesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs
index 41eab1c37..8fc5c0c07 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs
index be458136a..e2b345d59 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs
index 0814988ba..dcc980f33 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs
index 3cdd8acb7..f90f51d65 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs
index 6e25fe321..fbd1f6166 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs
index c8c6ba00b..d04b013d9 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CatsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CatsViewVM.cs
index 74a7e29eb..67988c73b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CatsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CatsViewVM.cs
@@ -6,7 +6,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
@@ -16,6 +16,7 @@ namespace Tango.MachineStudio.DB.ViewModels
public CatsViewVM(INotificationProvider notification) : base(notification)
{
SelectDataFileCommand = new RelayCommand(SelectDataFile);
+
}
public RelayCommand SelectDataFileCommand { get; set; }
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CctsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CctsViewVM.cs
index 02d7c351d..ebd360d76 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CctsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CctsViewVM.cs
@@ -6,7 +6,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs
index bdec4f91b..09010ec93 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ContactsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ContactsViewVM.cs
index 848cb1187..fdd31b847 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ContactsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ContactsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using SimpleValidator.Extensions;
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs
index bc8d54ce9..62f768b9d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.DB.Managers;
using Tango.SharedUI;
@@ -18,7 +18,7 @@ using System.ComponentModel;
namespace Tango.MachineStudio.DB.ViewModels
{
- public abstract class DbTableViewModel<T> : ViewModel, IShutdownRequestBlocker where T : class, IObservableEntity
+ public abstract class DbTableViewModel<T> : ViewModel where T : class, IObservableEntity
{
protected INotificationProvider _notification;
@@ -140,7 +140,7 @@ namespace Tango.MachineStudio.DB.ViewModels
base.OnValidating();
ValidationErrors.Clear();
- foreach (var prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => !x.PropertyType.IsGenericType && x.PropertyType.IsClass && !x.Name.Contains("Guid")))
+ foreach (var prop in typeof(T).GetPropertiesWithAttribute<EntityFieldNameAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => !x.PropertyType.IsGenericType && x.PropertyType.IsClass && !x.Name.Contains("Guid")))
{
if (prop.GetValue(EditEntity) == null)
{
@@ -156,21 +156,12 @@ namespace Tango.MachineStudio.DB.ViewModels
{
using (_notification.PushTaskItem("Saving changes to database..."))
{
- var dependenctEntities = SelectedEntity.GetDependentEntitiesNameAndGuid();
-
- if (dependenctEntities.Count > 0)
- {
- _notification.ShowError("The selected entity is being used by " + dependenctEntities.Count + " other entities." + Environment.NewLine + "Please delete any dependencies and try again." + Environment.NewLine + Environment.NewLine + String.Join(Environment.NewLine, dependenctEntities.Select(x => x.Key + ", ID: " + x.Value)));
- return;
- }
-
try
{
- await SelectedEntity.SoftDeleteAsync();
+ await SelectedEntity.DeleteAsync(Adapter.Context);
}
catch (Exception ex)
{
- SelectedEntity.Deleted = false;
Adapter.Invalidate();
_notification.ShowError("Could not delete entity.");
}
@@ -227,12 +218,21 @@ namespace Tango.MachineStudio.DB.ViewModels
using (_notification.PushTaskItem("Saving changes to database..."))
{
+ if (mode == DialogOpenMode.Adding)
+ {
+ entity.Attach(Adapter.Context);
+ }
+
try
{
- await entity.SaveAsync();
+ await entity.SaveAsync(Adapter.Context);
}
catch (DbUpdateException ex)
{
+ if (mode == DialogOpenMode.Adding)
+ {
+ entity.Detach(Adapter.Context);
+ }
Adapter.Invalidate();
_notification.ShowError("Could not save entity." + Environment.NewLine + ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : ex.InnerException.Message);
}
@@ -299,13 +299,13 @@ namespace Tango.MachineStudio.DB.ViewModels
private bool FilterEntity(T entity, String filter)
{
- foreach (var prop in entity.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType.IsClass && x.PropertyType != typeof(String) && x.PropertyType != typeof(byte[]) && !x.PropertyType.IsGenericType))
+ foreach (var prop in entity.GetType().GetPropertiesWithAttribute<EntityFieldNameAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType.IsClass && x.PropertyType != typeof(String) && x.PropertyType != typeof(byte[]) && !x.PropertyType.IsGenericType))
{
object obj = prop.GetValue(entity);
if (obj != null)
{
- foreach (var innerProp in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))))
+ foreach (var innerProp in obj.GetType().GetPropertiesWithAttribute<EntityFieldNameAttribute>(BindingFlags.Public | BindingFlags.Instance).Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))))
{
object value = innerProp.GetValue(obj);
@@ -323,7 +323,7 @@ namespace Tango.MachineStudio.DB.ViewModels
return
entity.
GetType().
- GetProperties(BindingFlags.Public | BindingFlags.Instance).
+ GetPropertiesWithAttribute<EntityFieldNameAttribute>(BindingFlags.Public | BindingFlags.Instance).
Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").
Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))).
Select(prop => prop.GetValue(entity).ToString()).
@@ -335,10 +335,5 @@ namespace Tango.MachineStudio.DB.ViewModels
{
}
-
- public Task<bool> OnShutdownRequest()
- {
- return Task.FromResult(true);
- }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs
index 5ffe0d58c..26167490f 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
@@ -12,6 +12,7 @@ namespace Tango.MachineStudio.DB.ViewModels
{
public DispenserTypesViewVM(INotificationProvider notification) : base(notification)
{
+
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs
index a248d919a..e41ea34f1 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs
index b6436203d..d06b81221 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EventTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EventTypesViewVM.cs
index 69e3c9ff6..f4b2af4d4 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EventTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EventTypesViewVM.cs
@@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
@@ -29,7 +29,7 @@ namespace Tango.MachineStudio.DB.ViewModels
foreach (var actionType in SelectedActions)
{
- if (SelectedEntity.EventTypesActions.ToList().Exists(x => x.ActionTypes == actionType.Entity && !x.Deleted))
+ if (SelectedEntity.EventTypesActions.ToList().Exists(x => x.ActionType == actionType.Entity))
{
actionType.IsSelected = true;
}
@@ -49,26 +49,19 @@ namespace Tango.MachineStudio.DB.ViewModels
{
base.OnBeforeEntitySave(mode, eventType);
+ Adapter.Context.EventTypesActions.RemoveRange(eventType.EventTypesActions);
+
foreach (var actionType in SelectedActions)
{
- var userRole = eventType.EventTypesActions.SingleOrDefault(x => x.ActionTypes == actionType.Entity);
-
- if (userRole != null)
- {
- userRole.Deleted = !actionType.IsSelected;
- }
- else
+ if (actionType.IsSelected)
{
- if (actionType.IsSelected)
+ eventType.EventTypesActions.Add(new EventTypesAction()
{
- eventType.EventTypesActions.Add(new EventTypesAction()
- {
- ActionTypes = actionType.Entity,
- EventTypes = eventType,
- ActionTypeGuid = actionType.Entity.Guid,
- EventTypeGuid = eventType.Guid
- });
- }
+ ActionType = actionType.Entity,
+ EventType = eventType,
+ ActionTypeGuid = actionType.Entity.Guid,
+ EventTypeGuid = eventType.Guid
+ });
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberShapesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberShapesViewVM.cs
index c4954f9b3..42c0d428d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberShapesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberShapesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberSynthsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberSynthsViewVM.cs
index 6b157fc0d..739c23e55 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberSynthsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/FiberSynthsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs
index 02c90c442..db30ad4cf 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPackFormulasViewVM.cs
index 0242c1dc7..391c17d70 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPackFormulasViewVM.cs
@@ -3,16 +3,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
{
- public class DispensersViewVM : DbTableViewModel<Dispenser>
+ public class IdsPackFormulasViewVM : DbTableViewModel<IdsPackFormula>
{
- public DispensersViewVM(INotificationProvider notification) : base(notification)
+ public IdsPackFormulasViewVM(INotificationProvider notification) : base(notification)
{
-
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs
index 202dd959f..2accac011 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LinearMassDensityUnitsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LinearMassDensityUnitsViewVM.cs
index 9ac38a7c4..9c3880293 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LinearMassDensityUnitsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LinearMassDensityUnitsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesRmlsViewVM.cs
index 8db217013..6159e1297 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesRmlsViewVM.cs
@@ -3,14 +3,14 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
{
- public class CartridgesViewVM : DbTableViewModel<Cartridge>
+ public class LiquidTypesRmlsViewVM : DbTableViewModel<LiquidTypesRml>
{
- public CartridgesViewVM(INotificationProvider notification) : base(notification)
+ public LiquidTypesRmlsViewVM(INotificationProvider notification) : base(notification)
{
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesViewVM.cs
index eaa482a41..b16b95ee4 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidTypesViewVM.cs
@@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
@@ -29,7 +29,7 @@ namespace Tango.MachineStudio.DB.ViewModels
foreach (var rml in SelectedRmls)
{
- if (SelectedEntity.LiquidTypesRmls.ToList().Exists(x => x.Rml == rml.Entity && !x.Deleted))
+ if (SelectedEntity.LiquidTypesRmls.ToList().Exists(x => x.Rml == rml.Entity))
{
rml.IsSelected = true;
}
@@ -49,26 +49,19 @@ namespace Tango.MachineStudio.DB.ViewModels
{
base.OnBeforeEntitySave(mode, liquid);
+ Adapter.Context.LiquidTypesRmls.RemoveRange(liquid.LiquidTypesRmls);
+
foreach (var rml in SelectedRmls)
{
- var liquidRml = liquid.LiquidTypesRmls.SingleOrDefault(x => x.Rml == rml.Entity);
-
- if (liquidRml != null)
- {
- liquidRml.Deleted = !rml.IsSelected;
- }
- else
+ if (rml.IsSelected)
{
- if (rml.IsSelected)
+ liquid.LiquidTypesRmls.Add(new LiquidTypesRml()
{
- liquid.LiquidTypesRmls.Add(new LiquidTypesRml()
- {
- Rml = rml.Entity,
- LiquidTypes = liquid,
- RmlGuid = rml.Entity.Guid,
- LiquidTypeGuid = liquid.Guid
- });
- }
+ Rml = rml.Entity,
+ LiquidType = liquid,
+ RmlGuid = rml.Entity.Guid,
+ LiquidTypeGuid = liquid.Guid
+ });
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs
index 6a24f7d4c..7eec73dc1 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs
index 2349941fe..0f3ab8b04 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs
@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using Tango.SharedUI;
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs
index a0ce93a5a..27c4bc7a0 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs
@@ -1,18 +1,46 @@
-using System;
+using Microsoft.Practices.ServiceLocation;
+using System;
using System.Collections.Generic;
using System.Linq;
+using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common;
+using Tango.MachineStudio.Common.StudioApplication;
using Tango.SharedUI;
namespace Tango.MachineStudio.DB.ViewModels
{
- public class MainViewVM : ViewModel
+ public class MainViewVM : ViewModel, IModuleRequestListener
{
public MainViewVM() : base()
{
}
+
+ public void OnRequestModule(IStudioModule module, object args)
+ {
+ if (module is DBModule && args != null && args is IObservableEntity)
+ {
+ String vmName = args.GetType().Name + "sViewVM";
+
+ Type vmType = Assembly.GetAssembly(typeof(MainViewVM)).GetTypes().SingleOrDefault(x => x.Name == vmName);
+
+ if (vmType == null)
+ {
+ vmName = args.GetType().BaseType.Name + "sViewVM";
+ vmType = Assembly.GetAssembly(typeof(MainViewVM)).GetTypes().SingleOrDefault(x => x.Name == vmName);
+ }
+
+ if (vmType != null)
+ {
+ var vm = ServiceLocator.Current.GetInstance(vmType);
+ vmType.GetProperty("SelectedEntity").SetValue(vm, args);
+ vmType.GetMethod("OnEdit", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(vm, new object[] { });
+ }
+ }
+ }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaColorsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaColorsViewVM.cs
index 4227cc27a..bc0736a43 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaColorsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaColorsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaConditionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaConditionsViewVM.cs
index 451e20ff0..167482bc8 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaConditionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaConditionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaMaterialsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaMaterialsViewVM.cs
index 534ebc0d8..9161ef3e9 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaMaterialsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaMaterialsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaPurposesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaPurposesViewVM.cs
index 4850f6316..6e6b74a32 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaPurposesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MediaPurposesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MidTankTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MidTankTypesViewVM.cs
index 6203a8fe3..c9a82363e 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MidTankTypesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MidTankTypesViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs
index 0327557f1..d35a00a80 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs
index 9a2d1c24d..6dbab596e 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesGroupsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesGroupsViewVM.cs
new file mode 100644
index 000000000..87fdecec8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesGroupsViewVM.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ProcessParametersTablesGroupsViewVM : DbTableViewModel<ProcessParametersTablesGroup>
+ {
+ public ProcessParametersTablesGroupsViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+
+ protected override void OnBeforeEntitySave(DialogOpenMode mode, ProcessParametersTablesGroup entity)
+ {
+ entity.SaveDate = DateTime.UtcNow;
+
+ if (entity.Rml != null && entity.Active)
+ {
+ foreach (var group in entity.Rml.ProcessParametersTablesGroups.Where(x => x != entity))
+ {
+ group.Active = false;
+ }
+ }
+
+ base.OnBeforeEntitySave(mode, entity);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesViewVM.cs
new file mode 100644
index 000000000..0716430ab
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ProcessParametersTablesViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ProcessParametersTablesViewVM : DbTableViewModel<ProcessParametersTable>
+ {
+ public ProcessParametersTablesViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RmlsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RmlsViewVM.cs
index 740a4969b..7145b9201 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RmlsViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RmlsViewVM.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.DB.ViewModels
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
index d09722ec9..049b4b6db 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
@@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.DB.ViewModels;
@@ -30,7 +30,7 @@ namespace Tango.MachineStudio.DB.ViewModels
foreach (var permission in SelectedPermissions)
{
- if (SelectedEntity.RolesPermissions.ToList().Exists(x => x.Permission == permission.Entity && !x.Deleted))
+ if (SelectedEntity.RolesPermissions.ToList().Exists(x => x.Permission == permission.Entity))
{
permission.IsSelected = true;
}
@@ -50,26 +50,19 @@ namespace Tango.MachineStudio.DB.ViewModels
{
base.OnBeforeEntitySave(mode, role);
+ Adapter.Context.RolesPermissions.RemoveRange(role.RolesPermissions);
+
foreach (var permission in SelectedPermissions)
{
- var rolePermission = role.RolesPermissions.SingleOrDefault(x => x.Permission == permission.Entity);
-
- if (rolePermission != null)
- {
- rolePermission.Deleted = !permission.IsSelected;
- }
- else
+ if (permission.IsSelected)
{
- if (permission.IsSelected)
+ role.RolesPermissions.Add(new RolesPermission()
{
- role.RolesPermissions.Add(new RolesPermission()
- {
- Permission = permission.Entity,
- Role = role,
- PermissionGuid = permission.Entity.Guid,
- RoleGuid = role.Guid
- });
- }
+ Permission = permission.Entity,
+ Role = role,
+ PermissionGuid = permission.Entity.Guid,
+ RoleGuid = role.Guid
+ });
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs
index 044b8a88a..3a09b27e6 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs
@@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using SimpleValidator.Extensions;
@@ -50,26 +50,19 @@ namespace Tango.MachineStudio.DB.ViewModels
{
base.OnBeforeEntitySave(mode, user);
+ Adapter.Context.UsersRoles.RemoveRange(user.UsersRoles);
+
foreach (var role in SelectedRoles)
{
- var userRole = user.UsersRoles.SingleOrDefault(x => x.Role == role.Entity);
-
- if (userRole != null)
- {
- userRole.Deleted = !role.IsSelected;
- }
- else
+ if (role.IsSelected)
{
- if (role.IsSelected)
+ user.UsersRoles.Add(new UsersRole()
{
- user.UsersRoles.Add(new UsersRole()
- {
- Role = role.Entity,
- User = user,
- RoleGuid = role.Entity.Guid,
- UserGuid = user.Guid
- });
- }
+ Role = role.Entity,
+ User = user,
+ RoleGuid = role.Entity.Guid,
+ UserGuid = user.Guid
+ });
}
}
}
@@ -80,7 +73,7 @@ namespace Tango.MachineStudio.DB.ViewModels
if (EditEntity.Email != null)
{
- if (Adapter.Users.ToList().Exists(x => x != EditEntity && x.Email.ToLower() == EditEntity.Email.ToLower()))
+ if (Adapter.Users.ToList().Exists(x => x.Guid != EditEntity.Guid && x.Email.ToLower() == EditEntity.Email.ToLower()))
{
ValidationErrors.Add("Email already exist");
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml
deleted file mode 100644
index 98adef136..000000000
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml
+++ /dev/null
@@ -1,29 +0,0 @@
-<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.CartridgeView"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
- xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
- xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
- xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
- xmlns:vm="clr-namespace:Tango.MachineStudio.DB.ViewModels"
- xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
- mc:Ignorable="d"
- d:DesignHeight="400" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:CartridgesViewVM, IsDesignTimeCreatable=False}">
-
- <Grid>
- <controls:TableGrid>
- <TextBlock Text="ID:" FontWeight="Bold"></TextBlock>
- <TextBox Text="{Binding EditEntity.ID}" IsReadOnly="True"></TextBox>
- <TextBlock Text="GUID:" FontWeight="Bold"></TextBlock>
- <TextBox Text="{Binding EditEntity.Guid}" IsReadOnly="True"></TextBox>
- <TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
- <TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True"></TextBox>
- <TextBlock Text="Serial Number:" FontWeight="Bold"></TextBlock>
- <TextBox Text="{Binding EditEntity.SerialNumber}"></TextBox>
- <TextBlock Text="Cartridge Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.CartridgeTypes}" SelectedItem="{Binding EditEntity.CartridgeTypes,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
- </controls:TableGrid>
- </Grid>
-</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatView.xaml
index 442f77ae3..080591c15 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatView.xaml
@@ -28,8 +28,11 @@
<TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
<TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True"></TextBox>
+ <TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Name}"></TextBox>
+
<TextBlock Text="Liquid Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.LiquidTypes}" SelectedItem="{Binding EditEntity.LiquidTypes,Mode=TwoWay}">
+ <ComboBox ItemsSource="{Binding Adapter.LiquidTypes}" SelectedItem="{Binding EditEntity.LiquidType,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
@@ -44,8 +47,8 @@
</ComboBox.ItemTemplate>
</ComboBox>
- <TextBlock Text="Machine:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.Machines}" SelectedItem="{Binding EditEntity.Machine,Mode=TwoWay}" DisplayMemberPath="SerialNumber"></ComboBox>
+ <TextBlock Text="RML:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.Rmls}" SelectedItem="{Binding EditEntity.Rml,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Calibration Data:" FontWeight="Bold"></TextBlock>
<DockPanel LastChildFill="False">
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatsView.xaml
index d88a2a142..6eb693780 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatsView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CatsView.xaml
@@ -22,19 +22,20 @@
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
- <DataGridTextColumn Header="Liquid Type" Binding="{Binding LiquidTypes.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Liquid Type" Binding="{Binding LiquidType.Name}"></DataGridTextColumn>
<DataGridTemplateColumn Header="Liquid Type Color">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Rectangle Width="50">
<Rectangle.Fill>
- <SolidColorBrush Color="{Binding LiquidTypes.Color,Converter={StaticResource ColorToIntegerConverter},Mode=TwoWay}"></SolidColorBrush>
+ <SolidColorBrush Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter},Mode=TwoWay}"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
- <DataGridTextColumn Header="Machine" Binding="{Binding Machine.SerialNumber}"></DataGridTextColumn>
+ <DataGridTextColumn Header="RML" Binding="{Binding Rml.Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Calibration Data Size" Binding="{Binding Data.Length,Converter={StaticResource ByteArrayToFileSizeConverter}}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationView.xaml
index afbaf660a..2e34379e5 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationView.xaml
@@ -28,25 +28,25 @@
<TextBlock Text="Creation Date:" FontWeight="Bold"></TextBlock>
<TextBox Text="{Binding EditEntity.CreationDate,Mode=TwoWay}" IsReadOnly="True"></TextBox>
<TextBlock Text="Application Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.ApplicationVersions}" SelectedItem="{Binding EditEntity.ApplicationVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.ApplicationVersions}" SelectedItem="{Binding EditEntity.ApplicationVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Application Firmware Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.ApplicationFirmwareVersions}" SelectedItem="{Binding EditEntity.ApplicationFirmwareVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.ApplicationFirmwareVersions}" SelectedItem="{Binding EditEntity.ApplicationFirmwareVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Application OS Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.ApplicationOsVersions}" SelectedItem="{Binding EditEntity.ApplicationOsVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.ApplicationOsVersions}" SelectedItem="{Binding EditEntity.ApplicationOsVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Display Panel Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.ApplicationDisplayPanelVersions}" SelectedItem="{Binding EditEntity.ApplicationDisplayPanelVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.ApplicationDisplayPanelVersions}" SelectedItem="{Binding EditEntity.ApplicationDisplayPanelVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Embedded Firmware Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.EmbeddedFirmwareVersions}" SelectedItem="{Binding EditEntity.EmbeddedFirmwareVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.EmbeddedFirmwareVersions}" SelectedItem="{Binding EditEntity.EmbeddedFirmwareVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Embedded Software Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.EmbeddedSoftwareVersions}" SelectedItem="{Binding EditEntity.EmbeddedSoftwareVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.EmbeddedSoftwareVersions}" SelectedItem="{Binding EditEntity.EmbeddedSoftwareVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
<TextBlock Text="Hardware Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.HardwareVersions}" SelectedItem="{Binding EditEntity.HardwareVersions,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.HardwareVersions}" SelectedItem="{Binding EditEntity.HardwareVersion,Mode=TwoWay}" ItemTemplate="{StaticResource comTemplate}"></ComboBox>
</controls:TableGrid>
</Grid>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationsView.xaml
index 235e49cc3..819dbd1c7 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationsView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ConfigurationsView.xaml
@@ -16,13 +16,13 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Creation Date" Binding="{Binding CreationDate}"></DataGridTextColumn>
- <DataGridTextColumn Header="Application Version" Binding="{Binding ApplicationVersions.Version}"></DataGridTextColumn>
- <DataGridTextColumn Header="Application OS" Binding="{Binding ApplicationOsVersions.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Application Firmware Version" Binding="{Binding ApplicationFirmwareVersions.Version}"></DataGridTextColumn>
- <DataGridTextColumn Header="Display Panel" Binding="{Binding ApplicationDisplayPanelVersions.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Embedded Firmware Version" Binding="{Binding EmbeddedFirmwareVersions.Version}"></DataGridTextColumn>
- <DataGridTextColumn Header="Embedded Software Version" Binding="{Binding EmbeddedSoftwareVersions.Version}"></DataGridTextColumn>
- <DataGridTextColumn Header="Hardware Version" Binding="{Binding HardwareVersions.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Application Version" Binding="{Binding ApplicationVersion.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Application OS" Binding="{Binding ApplicationOsVersion.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Application Firmware Version" Binding="{Binding ApplicationFirmwareVersion.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Display Panel" Binding="{Binding ApplicationDisplayPanelVersion.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Embedded Firmware Version" Binding="{Binding EmbeddedFirmwareVersion.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Embedded Software Version" Binding="{Binding EmbeddedSoftwareVersion.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Hardware Version" Binding="{Binding HardwareVersion.Version}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypeView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypeView.xaml
index b6e3336b3..55c995360 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypeView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypeView.xaml
@@ -24,6 +24,10 @@
<mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Left" Value="{Binding EditEntity.Code,Mode=TwoWay}"></mahapps:NumericUpDown>
<TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
<TextBox Text="{Binding EditEntity.Name,Mode=TwoWay}"></TextBox>
+ <TextBlock Text="Nanolitter Per Pulse:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.NlPerPulse,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Capacity:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.Capacity,Mode=TwoWay}"></mahapps:NumericUpDown>
</controls:TableGrid>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypesView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypesView.xaml
index 874629128..040ac5799 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypesView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserTypesView.xaml
@@ -17,6 +17,8 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Code" Binding="{Binding Code}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Nanolitter Per Pulse" Binding="{Binding NlPerPulse}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Capacity" Binding="{Binding Capacity}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml
index 7dc4ec1ff..83b2cc3d7 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml
@@ -1,4 +1,4 @@
-<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.DispenserView"
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.IdsPackFormulaView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -10,7 +10,7 @@
xmlns:vm="clr-namespace:Tango.MachineStudio.DB.ViewModels"
xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
mc:Ignorable="d"
- d:DesignHeight="400" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:DispensersViewVM, IsDesignTimeCreatable=False}">
+ d:DesignHeight="400" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:IdsPackFormulasViewVM, IsDesignTimeCreatable=False}">
<Grid>
<controls:TableGrid>
@@ -20,10 +20,14 @@
<TextBox Text="{Binding EditEntity.Guid}" IsReadOnly="True"></TextBox>
<TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
<TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True"></TextBox>
- <TextBlock Text="Serial Number:" FontWeight="Bold"></TextBlock>
- <TextBox Text="{Binding EditEntity.SerialNumber}"></TextBox>
- <TextBlock Text="Dispenser Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.DispenserTypes}" SelectedItem="{Binding EditEntity.DispenserTypes,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <TextBlock Text="Code:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Left" Value="{Binding EditEntity.Code,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Name,Mode=TwoWay}"></TextBox>
+ <TextBlock Text="Description:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Description,Mode=TwoWay}"></TextBox>
+ <TextBlock Text="Auto Calculated:" FontWeight="Bold"></TextBlock>
+ <ToggleButton HorizontalAlignment="Right" IsChecked="{Binding EditEntity.AutoCalculated}"></ToggleButton>
</controls:TableGrid>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml.cs
index 4ad5d74fe..4c289ddd2 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispenserView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulaView.xaml.cs
@@ -18,9 +18,9 @@ namespace Tango.MachineStudio.DB.Views.DBViews
/// <summary>
/// Interaction logic for MachineView.xaml
/// </summary>
- public partial class DispenserView : UserControl
+ public partial class IdsPackFormulaView : UserControl
{
- public DispenserView()
+ public IdsPackFormulaView()
{
InitializeComponent();
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml
index 3fa7d0200..81c9124f3 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml
@@ -1,4 +1,4 @@
-<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.CartridgesView"
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.IdsPackFormulasView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -8,15 +8,22 @@
xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.CartridgesViewVM}">
+ d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.IdsPackFormulasViewVM}">
+
+ <UserControl.Resources>
+ <converters:BooleanToYesNoConverter x:Key="BooleanToYesNoConverter" />
+ </UserControl.Resources>
+
<Grid>
<controls:DbTableView>
- <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.CartridgesViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsReadOnly="True">
+ <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.IdsPackFormulasViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
- <DataGridTextColumn Header="Serial Number" Binding="{Binding SerialNumber}"></DataGridTextColumn>
- <DataGridTextColumn Header="Cartridge Type" Binding="{Binding CartridgeTypes.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Code" Binding="{Binding Code}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Description" Binding="{Binding Description}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Auto Calculated" Binding="{Binding AutoCalculated,Converter={StaticResource BooleanToYesNoConverter}}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml.cs
index d86bd2e31..079c48746 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackFormulasView.xaml.cs
@@ -22,9 +22,9 @@ namespace Tango.MachineStudio.DB.Views.DBViews
/// Interaction logic for MachinesView.xaml
/// </summary>
[DBView]
- public partial class DispensersView : UserControl
+ public partial class IdsPackFormulasView : UserControl
{
- public DispensersView() : base()
+ public IdsPackFormulasView() : base()
{
InitializeComponent();
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackView.xaml
index 699a9ceb6..75093aa77 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPackView.xaml
@@ -10,7 +10,7 @@
xmlns:vm="clr-namespace:Tango.MachineStudio.DB.ViewModels"
xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
mc:Ignorable="d"
- d:DesignHeight="400" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:IdsPacksViewVM, IsDesignTimeCreatable=False}">
+ d:DesignHeight="500" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:IdsPacksViewVM, IsDesignTimeCreatable=False}">
<UserControl.Resources>
<converters:ColorToIntegerConverter x:Key="ColorToIntegerConverter"></converters:ColorToIntegerConverter>
@@ -28,16 +28,16 @@
<TextBox Text="{Binding EditEntity.Name}"></TextBox>
<TextBlock Text="Configuration:" FontWeight="Bold"></TextBlock>
<ComboBox ItemsSource="{Binding Adapter.Configurations}" SelectedItem="{Binding EditEntity.Configuration,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
- <TextBlock Text="Dispenser:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.Dispensers}" SelectedItem="{Binding EditEntity.Dispenser,Mode=TwoWay}">
+ <TextBlock Text="Dispenser Type:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.DispenserTypes}" SelectedItem="{Binding EditEntity.DispenserType,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
- <TextBlock><Run Text="{Binding SerialNumber}"></Run><Run>,</Run> <Run Text="{Binding DispenserTypes.Name}"></Run></TextBlock>
+ <TextBlock><Run Text="{Binding Name}"></Run></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Text="Liquid Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.LiquidTypes}" SelectedItem="{Binding EditEntity.LiquidTypes,Mode=TwoWay}">
+ <ComboBox ItemsSource="{Binding Adapter.LiquidTypes}" SelectedItem="{Binding EditEntity.LiquidType,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
@@ -52,7 +52,7 @@
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Text="Cartridge Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.CartridgeTypes}" SelectedItem="{Binding EditEntity.CartridgeTypes,Mode=TwoWay}">
+ <ComboBox ItemsSource="{Binding Adapter.CartridgeTypes}" SelectedItem="{Binding EditEntity.CartridgeType,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock><Run Text="{Binding Name}"></Run></TextBlock>
@@ -61,7 +61,18 @@
</ComboBox>
<TextBlock Text="Mid Tank Type:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MidTankTypes}" SelectedItem="{Binding EditEntity.MidTankTypes,Mode=TwoWay}">
+ <ComboBox ItemsSource="{Binding Adapter.MidTankTypes}" SelectedItem="{Binding EditEntity.MidTankType,Mode=TwoWay}">
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <TextBlock><Run Text="{Binding Name}"></Run></TextBlock>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ <TextBlock Text="Index:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Left" Value="{Binding EditEntity.PackIndex,Mode=TwoWay}"></mahapps:NumericUpDown>
+
+ <TextBlock Text="Calculation Formula:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.IdsPackFormulas}" SelectedItem="{Binding EditEntity.IdsPackFormula,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock><Run Text="{Binding Name}"></Run></TextBlock>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPacksView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPacksView.xaml
index 4a35b1900..03ab1d7d4 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPacksView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/IdsPacksView.xaml
@@ -12,6 +12,7 @@
<UserControl.Resources>
<converters:ColorToIntegerConverter x:Key="ColorToIntegerConverter"></converters:ColorToIntegerConverter>
+ <converters:BooleanToYesNoConverter x:Key="BooleanToYesNoConverter" />
</UserControl.Resources>
<Grid>
@@ -22,10 +23,10 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Configuration" Binding="{Binding Configuration.Name}"></DataGridTextColumn>
- <DataGridTemplateColumn Header="Dispenser">
+ <DataGridTemplateColumn Header="Dispenser Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
- <TextBlock><Run Text="{Binding Dispenser.SerialNumber}"></Run><Run>,</Run> <Run Text="{Binding Dispenser.DispenserTypes.Name}"></Run></TextBlock>
+ <TextBlock><Run Text="{Binding DispenserType.Name}"></Run></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@@ -35,10 +36,10 @@
<StackPanel Orientation="Horizontal">
<Rectangle Width="16" Height="16" VerticalAlignment="Center">
<Rectangle.Fill>
- <SolidColorBrush Color="{Binding LiquidTypes.Color,Converter={StaticResource ColorToIntegerConverter}}"></SolidColorBrush>
+ <SolidColorBrush Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
- <TextBlock Margin="5 0 0 0" Text="{Binding LiquidTypes.Name}" VerticalAlignment="Center"></TextBlock>
+ <TextBlock Margin="5 0 0 0" Text="{Binding LiquidType.Name}" VerticalAlignment="Center"></TextBlock>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
@@ -46,17 +47,19 @@
<DataGridTemplateColumn Header="Cartridge Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
- <TextBlock><Run Text="{Binding CartridgeTypes.Name}"></Run></TextBlock>
+ <TextBlock><Run Text="{Binding CartridgeType.Name}"></Run></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Mid Tank Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
- <TextBlock><Run Text="{Binding MidTankTypes.Name}"></Run></TextBlock>
+ <TextBlock><Run Text="{Binding MidTankType.Name}"></Run></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
+ <DataGridTextColumn Header="Index" Binding="{Binding PackIndex}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Formula" Binding="{Binding IdsPackFormula.Name}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml
new file mode 100644
index 000000000..2fbe2365c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml
@@ -0,0 +1,31 @@
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.LiquidTypesRmlView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300" DataContext="{x:Static global:ViewModelLocator.LiquidTypesRmlViewVM}">
+
+ <Grid>
+ <controls:TableGrid>
+ <TextBlock Text="ID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.ID}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="GUID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Guid}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="Liquid Type:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.LiquidTypes}" SelectedItem="{Binding EditEntity.LiquidType,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <TextBlock Text="RML:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.Rmls}" SelectedItem="{Binding EditEntity.Rml}" DisplayMemberPath="Name"></ComboBox>
+ <TextBlock Text="Max nl/cm:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.MaxNlPerCm,Mode=TwoWay}"></mahapps:NumericUpDown>
+ </controls:TableGrid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml.cs
new file mode 100644
index 000000000..baaac7633
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.DB.Views.DBViews
+{
+ /// <summary>
+ /// Interaction logic for UserView.xaml
+ /// </summary>
+ public partial class LiquidTypesRmlView : UserControl
+ {
+ public LiquidTypesRmlView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml
index 7fdb70bbe..11f781e5b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/DispensersView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml
@@ -1,22 +1,24 @@
-<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.DispensersView"
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.LiquidTypesRmlsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:global="clr-namespace:Tango.MachineStudio.DB"
xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
- xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
- xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.DispensersViewVM}">
+ d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.LiquidTypesRmlViewVM}">
+
<Grid>
<controls:DbTableView>
- <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.DispensersViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsReadOnly="True">
+ <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.LiquidTypesRmlsViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
- <DataGridTextColumn Header="Serial Number" Binding="{Binding SerialNumber}"></DataGridTextColumn>
- <DataGridTextColumn Header="Dispenser Type" Binding="{Binding DispenserTypes.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Liquid Type" Binding="{Binding LiquidType.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="RML" Binding="{Binding Rml.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Maximum Nanoliter Per Centimeter" Binding="{Binding MaxNlPerCm}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml.cs
new file mode 100644
index 000000000..9bda7a713
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/LiquidTypesRmlsView.xaml.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.MachineStudio.DB.CustomAttributes;
+
+namespace Tango.MachineStudio.DB.Views.DBViews
+{
+ /// <summary>
+ /// Interaction logic for UsersView.xaml
+ /// </summary>
+ [DBView]
+ public partial class LiquidTypesRmlsView : UserControl
+ {
+ public LiquidTypesRmlsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionView.xaml
index 50a1c790b..a15f9c9e1 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionView.xaml
@@ -21,7 +21,7 @@
<TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
<TextBox Text="{Binding EditEntity.Name,Mode=TwoWay}"></TextBox>
<TextBlock Text="Default Configuration:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.Configurations}" SelectedItem="{Binding EditEntity.Configuration,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.Configurations}" SelectedItem="{Binding EditEntity.DefaultConfiguration,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
</controls:TableGrid>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionsView.xaml
index 08cac568f..be917634a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionsView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineVersionsView.xaml
@@ -16,7 +16,7 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Version" Binding="{Binding Version}"></DataGridTextColumn>
- <DataGridTextColumn Header="Default Configuration" Binding="{Binding Configuration.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Default Configuration" Binding="{Binding DefaultConfiguration.Name}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</controls:DbTableView>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineView.xaml
index 0a7ee4c32..ab880a8a8 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachineView.xaml
@@ -22,7 +22,7 @@
<TextBlock Text="Organization:" FontWeight="Bold"></TextBlock>
<ComboBox ItemsSource="{Binding Adapter.Organizations}" SelectedItem="{Binding EditEntity.Organization,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Version:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MachineVersions}" SelectedItem="{Binding EditEntity.MachineVersions,Mode=TwoWay}" DisplayMemberPath="Version"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.MachineVersions}" SelectedItem="{Binding EditEntity.MachineVersion,Mode=TwoWay}" DisplayMemberPath="Version"></ComboBox>
<TextBlock Text="Configuration:" FontWeight="Bold"></TextBlock>
<ComboBox ItemsSource="{Binding Adapter.Configurations}" SelectedItem="{Binding EditEntity.Configuration,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
</controls:TableGrid>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachinesView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachinesView.xaml
index ea48667d9..c6febd63c 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachinesView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/MachinesView.xaml
@@ -16,7 +16,7 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Serial Number" Binding="{Binding SerialNumber}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Version" Binding="{Binding MachineVersions.Version}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Version" Binding="{Binding MachineVersion.Version}"></DataGridTextColumn>
<DataGridTextColumn Header="Organization" Binding="{Binding Organization.Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Configuration" Binding="{Binding Configuration.Name}"></DataGridTextColumn>
</DataGrid.Columns>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml
new file mode 100644
index 000000000..75b559bf2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml
@@ -0,0 +1,63 @@
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.ProcessParametersTableView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:localConverters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.DB.ViewModels"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
+ mc:Ignorable="d"
+ d:DesignHeight="400" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=vm:ProcessParametersTablesViewVM, IsDesignTimeCreatable=False}">
+
+ <Grid>
+ <controls:TableGrid>
+ <TextBlock Text="ID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.ID}" IsReadOnly="True"></TextBox>
+ <TextBlock Text="GUID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Guid}" IsReadOnly="True"></TextBox>
+ <TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True"></TextBox>
+ <TextBlock Text="Group:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.ProcessParametersTablesGroups}" SelectedItem="{Binding EditEntity.ProcessParametersTablesGroup,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Name,Mode=TwoWay}"></TextBox>
+ <TextBlock Text="Index:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Left" Value="{Binding EditEntity.TableIndex,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dyeing Speed:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DyeingSpeed,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Min Ink Uptake:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.MinInkUptake,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Mixer Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.MixerTemp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Head Zone 1 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.HeadZone1Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Head Zone 2 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.HeadZone2Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Head Zone 3 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.HeadZone3Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Head Air Flow:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.HeadAirFlow,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Feeder Tension:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.FeederTension,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Puller Tension:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.PullerTension,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dryer Buffer Length:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DryerBufferLength,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dryer Zone 1 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DryerZone1Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dryer Zone 2 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DryerZone2Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dryer Zone 3 Temperature:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DryerZone3Temp,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Dryer Air Flow:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.DryerAirFlow,Mode=TwoWay}"></mahapps:NumericUpDown>
+ <TextBlock Text="Winder Tension:" FontWeight="Bold"></TextBlock>
+ <mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.WinderTension,Mode=TwoWay}"></mahapps:NumericUpDown>
+ </controls:TableGrid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml.cs
index d2402426c..1f1b7434b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgeView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTableView.xaml.cs
@@ -18,9 +18,9 @@ namespace Tango.MachineStudio.DB.Views.DBViews
/// <summary>
/// Interaction logic for MachineView.xaml
/// </summary>
- public partial class CartridgeView : UserControl
+ public partial class ProcessParametersTableView : UserControl
{
- public CartridgeView()
+ public ProcessParametersTableView()
{
InitializeComponent();
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml
new file mode 100644
index 000000000..135d66eac
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml
@@ -0,0 +1,31 @@
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.ProcessParametersTablesGroupView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300" DataContext="{x:Static global:ViewModelLocator.ProcessParametersTablesGroupsViewVM}">
+
+ <Grid>
+ <controls:TableGrid>
+ <TextBlock Text="ID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.ID}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="GUID:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Guid}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="Last Updated:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.LastUpdated}" IsReadOnly="True" IsEnabled="False"></TextBox>
+ <TextBlock Text="RML:" FontWeight="Bold"></TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.Rmls}" SelectedItem="{Binding EditEntity.Rml,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <TextBlock Text="Name:" FontWeight="Bold"></TextBlock>
+ <TextBox Text="{Binding EditEntity.Name,Mode=TwoWay}"></TextBox>
+ <TextBlock Text="Active:" FontWeight="Bold"></TextBlock>
+ <ToggleButton IsChecked="{Binding EditEntity.Active}" HorizontalAlignment="Right"></ToggleButton>
+ </controls:TableGrid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml.cs
new file mode 100644
index 000000000..490453f2a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.DB.Views.DBViews
+{
+ /// <summary>
+ /// Interaction logic for UserView.xaml
+ /// </summary>
+ public partial class ProcessParametersTablesGroupView : UserControl
+ {
+ public ProcessParametersTablesGroupView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml
new file mode 100644
index 000000000..0eee2aa77
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml
@@ -0,0 +1,32 @@
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.ProcessParametersTablesGroupsView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views.DBViews"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.ProcessParametersTablesGroupsViewVM}">
+
+ <UserControl.Resources>
+ <sharedConverters:BooleanToYesNoConverter x:Key="BooleanToYesNoConverter"></sharedConverters:BooleanToYesNoConverter>
+ </UserControl.Resources>
+
+ <Grid>
+ <controls:DbTableView>
+ <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.ProcessParametersTablesGroupsViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" IsReadOnly="True">
+ <DataGrid.Columns>
+ <DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
+ <DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
+ <DataGridTextColumn Header="RML" Binding="{Binding Rml.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Saved Date" Binding="{Binding SaveDate}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Active" Binding="{Binding Active,Converter={StaticResource BooleanToYesNoConverter}}"></DataGridTextColumn>
+ </DataGrid.Columns>
+ </DataGrid>
+ </controls:DbTableView>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml.cs
new file mode 100644
index 000000000..67072d554
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesGroupsView.xaml.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.MachineStudio.DB.CustomAttributes;
+
+namespace Tango.MachineStudio.DB.Views.DBViews
+{
+ /// <summary>
+ /// Interaction logic for UsersView.xaml
+ /// </summary>
+ [DBView]
+ public partial class ProcessParametersTablesGroupsView : UserControl
+ {
+ public ProcessParametersTablesGroupsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml
new file mode 100644
index 000000000..0e20ce5af
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml
@@ -0,0 +1,46 @@
+<UserControl x:Class="Tango.MachineStudio.DB.Views.DBViews.ProcessParametersTablesView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.DB.Controls"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:localConverters="clr-namespace:Tango.MachineStudio.DB.Converters"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" Background="White" DataContext="{x:Static global:ViewModelLocator.ProcessParametersTablesViewVM}">
+
+ <UserControl.Resources>
+ <converters:BooleanToYesNoConverter x:Key="BooleanToYesNoConverter"></converters:BooleanToYesNoConverter>
+ </UserControl.Resources>
+
+ <Grid>
+ <controls:DbTableView>
+ <DataGrid Background="Transparent" ItemsSource="{Binding Adapter.ProcessParametersTablesViewSource}" SelectedItem="{Binding SelectedEntity}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsReadOnly="True">
+ <DataGrid.Columns>
+ <DataGridTextColumn Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
+ <DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Group" Binding="{Binding ProcessParametersTablesGroup.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Index" Binding="{Binding TableIndex}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dyeing Speed" Binding="{Binding DyeingSpeed}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Min Ink Uptake" Binding="{Binding MinInkUptake}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Mixer Temp" Binding="{Binding MixerTemp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Head Zone 1 Temp" Binding="{Binding HeadZone1Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Head Zone 2 Temp" Binding="{Binding HeadZone2Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Head Zone 3 Temp" Binding="{Binding HeadZone3Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Head Air Flow" Binding="{Binding HeadAirFlow}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Feeder Tension" Binding="{Binding FeederTension}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Puller Tension" Binding="{Binding PullerTension}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dryer Buffer Length" Binding="{Binding DryerBufferLength}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dryer Zone 1 Temp" Binding="{Binding DryerZone1Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dryer Zone 2 Temp" Binding="{Binding DryerZone2Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dryer Zone 3 Temp" Binding="{Binding DryerZone3Temp}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Dryer Air Flow" Binding="{Binding DryerAirFlow}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Winder Tension" Binding="{Binding WinderTension}"></DataGridTextColumn>
+ </DataGrid.Columns>
+ </DataGrid>
+ </controls:DbTableView>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml.cs
index 27adfa44e..518af1485 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/CartridgesView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/ProcessParametersTablesView.xaml.cs
@@ -22,9 +22,9 @@ namespace Tango.MachineStudio.DB.Views.DBViews
/// Interaction logic for MachinesView.xaml
/// </summary>
[DBView]
- public partial class CartridgesView : UserControl
+ public partial class ProcessParametersTablesView : UserControl
{
- public CartridgesView() : base()
+ public ProcessParametersTablesView() : base()
{
InitializeComponent();
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlView.xaml
index adf5310ee..43a17d8e4 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlView.xaml
@@ -32,10 +32,10 @@
<TextBox Text="{Binding EditEntity.Manufacturer}"></TextBox>
<TextBlock Text="Material:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MediaMaterials}" SelectedItem="{Binding EditEntity.MediaMaterials,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.MediaMaterials}" SelectedItem="{Binding EditEntity.MediaMaterial,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Color:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MediaColors}" SelectedItem="{Binding EditEntity.MediaColors,Mode=TwoWay}">
+ <ComboBox ItemsSource="{Binding Adapter.MediaColors}" SelectedItem="{Binding EditEntity.MediaColor,Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
@@ -50,19 +50,19 @@
</ComboBox>
<TextBlock Text="Purpose:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MediaPurposes}" SelectedItem="{Binding EditEntity.MediaPurposes,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.MediaPurposes}" SelectedItem="{Binding EditEntity.MediaPurpose,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Condition:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MediaConditions}" SelectedItem="{Binding EditEntity.MediaConditions,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.MediaConditions}" SelectedItem="{Binding EditEntity.MediaCondition,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Linear Mass Density Unit:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.LinearMassDensityUnits}" SelectedItem="{Binding EditEntity.LinearMassDensityUnits,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.LinearMassDensityUnits}" SelectedItem="{Binding EditEntity.LinearMassDensityUnit,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Fiber Shape:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.FiberShapes}" SelectedItem="{Binding EditEntity.FiberShapes,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.FiberShapes}" SelectedItem="{Binding EditEntity.FiberShape,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Fiber Syntheses:" FontWeight="Bold"></TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.FiberSynths}" SelectedItem="{Binding EditEntity.FiberSynths,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox ItemsSource="{Binding Adapter.FiberSynths}" SelectedItem="{Binding EditEntity.FiberSynth,Mode=TwoWay}" DisplayMemberPath="Name"></ComboBox>
<TextBlock Text="Fiber Size:" FontWeight="Bold"></TextBlock>
<mahapps:NumericUpDown Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding EditEntity.FiberSize,Mode=TwoWay}"></mahapps:NumericUpDown>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlsView.xaml
index 0a02c6821..86a61d400 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlsView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/DBViews/RmlsView.xaml
@@ -23,23 +23,23 @@
<DataGridTextColumn Header="GUID" Binding="{Binding Guid}"></DataGridTextColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Manufacturer" Binding="{Binding Manufacturer}"></DataGridTextColumn>
- <DataGridTextColumn Header="Material" Binding="{Binding MediaMaterials.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Material" Binding="{Binding MediaMaterial.Name}"></DataGridTextColumn>
<DataGridTemplateColumn Header="Color">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Rectangle Width="50">
<Rectangle.Fill>
- <SolidColorBrush Color="{Binding MediaColors.Color,Converter={StaticResource ColorToIntegerConverter},Mode=TwoWay}"></SolidColorBrush>
+ <SolidColorBrush Color="{Binding MediaColor.Color,Converter={StaticResource ColorToIntegerConverter},Mode=TwoWay}"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
- <DataGridTextColumn Header="Purpose" Binding="{Binding MediaPurposes.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Condition" Binding="{Binding MediaConditions.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Linear Mass Density Unit" Binding="{Binding LinearMassDensityUnits.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Fiber Shape" Binding="{Binding FiberShapes.Name}"></DataGridTextColumn>
- <DataGridTextColumn Header="Fiber Syntheses" Binding="{Binding FiberSynths.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Purpose" Binding="{Binding MediaPurpose.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Condition" Binding="{Binding MediaCondition.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Linear Mass Density Unit" Binding="{Binding LinearMassDensityUnit.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Fiber Shape" Binding="{Binding FiberShape.Name}"></DataGridTextColumn>
+ <DataGridTextColumn Header="Fiber Syntheses" Binding="{Binding FiberSynth.Name}"></DataGridTextColumn>
<DataGridTextColumn Header="Fiber Size" Binding="{Binding FiberSize}"></DataGridTextColumn>
<DataGridTextColumn Header="Fibers Count" Binding="{Binding NumberOfFibers}"></DataGridTextColumn>
<DataGridTextColumn Header="Plies Per Fiber" Binding="{Binding PliesPerFiber}"></DataGridTextColumn>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml
index 6c7cb2b95..a6edd80da 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml
@@ -9,10 +9,11 @@
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:managers="clr-namespace:Tango.MachineStudio.DB.Managers"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DB"
xmlns:commonControls="clr-namespace:Tango.MachineStudio.Common.Controls;assembly=Tango.MachineStudio.Common"
xmlns:local="clr-namespace:Tango.MachineStudio.DB.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1270" DataContext="{Binding MainViewVM, Source={StaticResource Locator}}">
+ d:DesignHeight="720" d:DesignWidth="1270" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
<UserControl.Background>
<ImageBrush ImageSource="../Images/seamless-grid.jpg" Stretch="None" TileMode="Tile" ViewportUnits="Absolute" Viewport="0,0,32,32"></ImageBrush>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml.cs
index 1ffdf7eb0..b769b9bfd 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Views/MainDBView.xaml.cs
@@ -58,7 +58,7 @@ namespace Tango.MachineStudio.DB.Views
grid.DataContext = message.Context;
presenter.Content = view;
icon.Kind = (message.DialogOpenMode == DialogOpenMode.Editing ? PackIconKind.TableEdit : PackIconKind.Plus);
- txtTitle.Text = (message.DialogOpenMode == DialogOpenMode.Editing ? "Edit " : "Add New ") + message.EntityType.Name.ToTitle();
+ txtTitle.Text = (message.DialogOpenMode == DialogOpenMode.Editing ? "Edit " : "Add New ") + (message.EntityType.Name.Length < 5 ? message.EntityType.Name.ToUpper() : message.EntityType.Name).ToTitle();
IsEditViewOpen = true;
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml
deleted file mode 100644
index 83cd48926..000000000
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml
+++ /dev/null
@@ -1,32 +0,0 @@
-<mahapps:MetroWindow x:Class="Tango.MachineStudio.DB.Windows.DBDialogWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
- xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
- xmlns:local="clr-namespace:Tango.MachineStudio.DB.Windows"
- mc:Ignorable="d"
- Title="Machine Studio" Height="450" Width="650" EnableDWMDropShadow="True" ShowCloseButton="False" WindowTransitionsEnabled="False" ShowMaxRestoreButton="False" ShowMinButton="False" TitleCaps="False" BorderThickness="1" WindowStartupLocation="CenterOwner">
- <Grid>
- <Border Margin="16">
- <DockPanel LastChildFill="True">
- <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Top">
- <materialDesign:PackIcon Kind="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=IconKind}" VerticalAlignment="Center" Width="32" Height="32" Foreground="{StaticResource AccentColorBrush}" />
- <TextBlock Margin="10 0 0 0" Foreground="{StaticResource AccentColorBrush}" FontSize="16" Text="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=InnerTitle}"></TextBlock>
- </StackPanel>
- <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
- <Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 8 8 0" Command="{Binding DialogOKCommand}" Click="OnOKClicked">
- ACCEPT
- </Button>
- <Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="True" Margin="0 8 8 0" Command="{Binding DialogCancelCommand}" Click="OnCancelClicked">
- CANCEL
- </Button>
- </StackPanel>
- <ScrollViewer Margin="0 10 0 10" VerticalScrollBarVisibility="Auto" Padding="5">
- <ContentPresenter x:Name="presenter"></ContentPresenter>
- </ScrollViewer>
- </DockPanel>
- </Border>
- </Grid>
-</mahapps:MetroWindow>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml.cs
deleted file mode 100644
index d9629c642..000000000
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/Windows/DBDialogWindow.xaml.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using MahApps.Metro.Controls;
-using MaterialDesignThemes.Wpf;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Shapes;
-namespace Tango.MachineStudio.DB.Windows
-{
- /// <summary>
- /// Interaction logic for DBDialogWindow.xaml
- /// </summary>
- public partial class DBDialogWindow : MetroWindow
- {
- public DBDialogWindow()
- {
- InitializeComponent();
- }
-
- public String InnerTitle
- {
- get { return (String)GetValue(InnerTitleProperty); }
- set { SetValue(InnerTitleProperty, value); }
- }
- public static readonly DependencyProperty InnerTitleProperty =
- DependencyProperty.Register("InnerTitle", typeof(String), typeof(DBDialogWindow), new PropertyMetadata(null));
-
-
-
- public PackIconKind IconKind
- {
- get { return (PackIconKind)GetValue(IconKindProperty); }
- set { SetValue(IconKindProperty, value); }
- }
-
- // Using a DependencyProperty as the backing store for IconKind. This enables animation, styling, binding, etc...
- public static readonly DependencyProperty IconKindProperty =
- DependencyProperty.Register("IconKind", typeof(PackIconKind), typeof(DBDialogWindow), new PropertyMetadata(PackIconKind.TableEdit));
-
-
-
-
- public DBDialogWindow(FrameworkElement content) : this()
- {
- presenter.Content = content;
- }
-
- private void OnOKClicked(object sender, RoutedEventArgs e)
- {
- DialogResult = true;
- Close();
- }
-
- private void OnCancelClicked(object sender, RoutedEventArgs e)
- {
- DialogResult = false;
- Close();
- }
- }
-}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/DataCaptureModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/DataCaptureModule.cs
new file mode 100644
index 000000000..ee650dc13
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/DataCaptureModule.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common;
+using Tango.MachineStudio.DataCapture.Views;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.DataCapture
+{
+ /// <summary>
+ /// Represents the machine studio data capturing and playing module.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.StudioModuleBase" />
+ public class DataCaptureModule : StudioModuleBase
+ {
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name
+ {
+ get
+ {
+ return "Data Capture";
+ }
+ }
+
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description
+ {
+ get
+ {
+ return "Capture and synchronize diagnostics machine data with video capturing devices for later analysis";
+ }
+ }
+
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image
+ {
+ get
+ {
+ return ResourceHelper.GetImageFromResources("Images/data-capture.jpg");
+ }
+ }
+
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView
+ {
+ get
+ {
+ return new MainView();
+ }
+ }
+
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission
+ {
+ get
+ {
+ return Permissions.RunTechnicianModule;
+ }
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/capture-device.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/capture-device.png
new file mode 100644
index 000000000..5f04b660a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/capture-device.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/data-capture.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/data-capture.jpg
new file mode 100644
index 000000000..87524f07a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/data-capture.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/recordings.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/recordings.png
new file mode 100644
index 000000000..a965c62af
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/recordings.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/tape.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/tape.png
new file mode 100644
index 000000000..8a4739b23
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/tape.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/video-frame.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/video-frame.png
new file mode 100644
index 000000000..9c29dc438
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Images/video-frame.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..0fd6e93b2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/AssemblyInfo.cs
@@ -0,0 +1,18 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+[assembly: AssemblyTitle("Tango - Machine Studio Data Capturing Module")]
+
+[assembly: ComVisible(false)]
+
+[assembly:ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.Designer.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..fdd6d78b8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// 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.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.MachineStudio.DataCapture.Properties {
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // 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.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if ((resourceMan == null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.MachineStudio.DataCapture.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.resx b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.resx
new file mode 100644
index 000000000..af7dbebba
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.Designer.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..8a9ab67ad
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// 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.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.MachineStudio.DataCapture.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.settings b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.settings
new file mode 100644
index 000000000..033d7a5e9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Recording/DataRecording.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Recording/DataRecording.cs
new file mode 100644
index 000000000..ddf24e113
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Recording/DataRecording.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core;
+using Tango.Integration.Diagnostics;
+
+namespace Tango.MachineStudio.DataCapture.Recording
+{
+ public class DataRecording : ExtendedObject
+ {
+ public DataRecording()
+ {
+ Date = DateTime.Now;
+ }
+
+ public DataRecording(String filePath) : this()
+ {
+ FilePath = filePath;
+ }
+
+ public DataRecording(String filePath, DateTime date) : this(filePath)
+ {
+ Date = date;
+ }
+
+ private DateTime _date;
+
+ public DateTime Date
+ {
+ get { return _date; }
+ set { _date = value; RaisePropertyChangedAuto(); }
+ }
+
+ public String Name
+ {
+ get { return Path.GetFileNameWithoutExtension(FilePath); }
+ }
+
+ private String _file;
+
+ public String FilePath
+ {
+ get { return _file; }
+ set { _file = value; RaisePropertyChangedAuto(); }
+ }
+
+ public DiagnosticsFilePlayer Player { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Tango.MachineStudio.DataCapture.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Tango.MachineStudio.DataCapture.csproj
new file mode 100644
index 000000000..d97f540b1
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Tango.MachineStudio.DataCapture.csproj
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{FC337A7F-1214-41D8-9992-78092A3B961E}</ProjectGuid>
+ <OutputType>library</OutputType>
+ <RootNamespace>Tango.MachineStudio.DataCapture</RootNamespace>
+ <AssemblyName>Tango.MachineStudio.DataCapture</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>..\..\..\Build\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
+ </Reference>
+ <Reference Include="MahApps.Metro, Version=1.5.0.23, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignColors, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignColors.1.1.2\lib\net45\MaterialDesignColors.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MahApps.Metro.1.5.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Recording\DataRecording.cs" />
+ <Compile Include="ViewModelLocator.cs" />
+ <Compile Include="ViewModels\MainViewVM.cs" />
+ <Compile Include="Views\MainView.xaml.cs">
+ <DependentUpon>MainView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="..\..\..\Versioning\GlobalVersionInfo.cs">
+ <Link>GlobalVersionInfo.cs</Link>
+ </Compile>
+ <Compile Include="DataCaptureModule.cs" />
+ <Compile Include="Views\PlayingBarView.xaml.cs">
+ <DependentUpon>PlayingBarView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\RecordingBarView.xaml.cs">
+ <DependentUpon>RecordingBarView.xaml</DependentUpon>
+ </Compile>
+ <Page Include="Views\MainView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\PlayingBarView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\RecordingBarView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="app.config" />
+ <None Include="packages.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj">
+ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
+ <Name>Tango.Core</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
+ <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
+ <Name>Tango.Integration</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj">
+ <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project>
+ <Name>Tango.Logging</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.PMR\Tango.PMR.csproj">
+ <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project>
+ <Name>Tango.PMR</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Settings\Tango.Settings.csproj">
+ <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project>
+ <Name>Tango.Settings</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj">
+ <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
+ <Name>Tango.SharedUI</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Transport\Tango.Transport.csproj">
+ <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
+ <Name>Tango.Transport</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Video\Tango.Video.csproj">
+ <Project>{9652f972-2bd1-4283-99cb-fc6240434c17}</Project>
+ <Name>Tango.Video</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.MachineStudio.Common\Tango.MachineStudio.Common.csproj">
+ <Project>{cb0b0aa2-bb24-4bca-a720-45e397684e12}</Project>
+ <Name>Tango.MachineStudio.Common</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\data-capture.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\recordings.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\tape.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\video-frame.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\capture-device.png" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModelLocator.cs
new file mode 100644
index 000000000..98c5db8fe
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModelLocator.cs
@@ -0,0 +1,33 @@
+using GalaSoft.MvvmLight;
+using GalaSoft.MvvmLight.Ioc;
+using Microsoft.Practices.ServiceLocation;
+using Tango.MachineStudio.DataCapture.ViewModels;
+using Tango.MachineStudio.DataCapture.Views;
+
+namespace Tango.MachineStudio.DataCapture
+{
+ /// <summary>
+ /// This class contains static references to all the view models in the
+ /// application and provides an entry point for the bindings.
+ /// </summary>
+ public static class ViewModelLocator
+ {
+ /// <summary>
+ /// Initializes a new instance of the ViewModelLocator class.
+ /// </summary>
+ static ViewModelLocator()
+ {
+ ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
+
+ SimpleIoc.Default.Register<MainViewVM>();
+ }
+
+ public static MainViewVM MainViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<MainViewVM>();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModels/MainViewVM.cs
new file mode 100644
index 000000000..269007dac
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/ViewModels/MainViewVM.cs
@@ -0,0 +1,326 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+using Tango.Core.Commands;
+using Tango.Integration.Diagnostics;
+using Tango.Integration.Operators;
+using Tango.MachineStudio.Common.Diagnostics;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.MachineStudio.Common.Video;
+using Tango.MachineStudio.DataCapture.Recording;
+using Tango.MachineStudio.DataCapture.Views;
+using Tango.PMR.Diagnostics;
+using Tango.Settings;
+using Tango.SharedUI;
+using Tango.Video.DirectCapture;
+
+namespace Tango.MachineStudio.DataCapture.ViewModels
+{
+ /// <summary>
+ /// Represents the data capture main view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ public class MainViewVM : ViewModel
+ {
+ private INotificationProvider _notification;
+ private IStudioApplicationManager _applicationManager;
+ private IDiagnosticsFrameProvider _frameProvider;
+ private String _recordingsFolder;
+ private BarItem _recordingBarItem;
+ private BarItem _playerBarItem;
+
+ #region Properties
+
+ private ObservableCollection<DataRecording> _recordings;
+ /// <summary>
+ /// Gets or sets the recordings collection.
+ /// </summary>
+ public ObservableCollection<DataRecording> Recordings
+ {
+ get { return _recordings; }
+ set { _recordings = value; RaisePropertyChangedAuto(); }
+ }
+
+ private DataRecording _selectedRecording;
+ /// <summary>
+ /// Gets or sets the selected recording.
+ /// </summary>
+ public DataRecording SelectedRecording
+ {
+ get { return _selectedRecording; }
+ set { _selectedRecording = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the video capture provider.
+ /// </summary>
+ public IVideoCaptureProvider VideoCaptureProvider { get; set; }
+
+ private DiagnosticsFileRecorder _recorder;
+ /// <summary>
+ /// Gets or sets the diagnostics file recorder.
+ /// </summary>
+ public DiagnosticsFileRecorder Recorder
+ {
+ get { return _recorder; }
+ set { _recorder = value; RaisePropertyChangedAuto(); }
+ }
+
+ private DiagnosticsFilePlayer _player;
+ /// <summary>
+ /// Gets or sets the diagnostics file player.
+ /// </summary>
+ public DiagnosticsFilePlayer Player
+ {
+ get { return _player; }
+ set { _player = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the machine operator.
+ /// </summary>
+ public IMachineOperator MachineOperator { get; set; }
+
+ #endregion
+
+ #region Commands
+
+ /// <summary>
+ /// Gets or sets the remove recording command.
+ /// </summary>
+ public RelayCommand<DataRecording> RemoveRecordingCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the toggle camera command.
+ /// </summary>
+ public RelayCommand<CaptureDevice> ToggleCameraCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the media recording command.
+ /// </summary>
+ public RelayCommand MediaRecordingCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the media stop command.
+ /// </summary>
+ public RelayCommand MediaStopCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the media toggle play pause command.
+ /// </summary>
+ public RelayCommand MediaTogglePlayPauseCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the media play pause command.
+ /// </summary>
+ public RelayCommand MediaPlayPauseCommand { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
+ public MainViewVM(IVideoCaptureProvider videoCaptureProvider, INotificationProvider notification, IStudioApplicationManager applicationManager, IDiagnosticsFrameProvider frameProvider)
+ {
+ _notification = notification;
+ _applicationManager = applicationManager;
+ _frameProvider = frameProvider;
+
+ Recorder = new DiagnosticsFileRecorder();
+ Player = new DiagnosticsFilePlayer();
+
+ VideoCaptureProvider = videoCaptureProvider;
+ Recordings = new ObservableCollection<DataRecording>();
+
+ ToggleCameraCommand = new RelayCommand<CaptureDevice>(ToggleCamera);
+
+ RemoveRecordingCommand = new RelayCommand<DataRecording>(RemoveRecording);
+
+ MediaRecordingCommand = new RelayCommand(StartDiagnosticsRecording, () => !Recorder.IsRecording && MachineOperator != null && !Player.IsPlaying);
+ MediaStopCommand = new RelayCommand(StopRecorderOrPlayer, () => Recorder.IsRecording || Player.IsPlaying);
+ MediaPlayPauseCommand = new RelayCommand(DiagnosticsTogglePlayPause, () => !Recorder.IsRecording && SelectedRecording != null);
+
+ _recordingsFolder = Path.Combine(SettingsManager.DefaultFolder, "Recordings");
+ Directory.CreateDirectory(_recordingsFolder);
+
+ _frameProvider.FrameReceived += _frameProvider_FrameReceived;
+
+ applicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
+
+ _recordingBarItem = new BarItem(_notification, new RecordingBarView() { DataContext = this });
+ _playerBarItem = new BarItem(_notification, new PlayingBarView() { DataContext = this });
+
+ LoadRecordings();
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ private void ApplicationManager_ConnectedMachineChanged(object sender, Integration.Services.IExternalBridgeClient machine)
+ {
+ MachineOperator = machine;
+ InvalidateRelayCommands();
+ }
+
+ private void _frameProvider_FrameReceived(object sender, PushDiagnosticsResponse frame)
+ {
+ if (!_frameProvider.Disable)
+ {
+ if (Recorder.IsRecording)
+ {
+ Recorder.Write(frame);
+ }
+ }
+ }
+
+
+ #endregion
+
+ #region Private Methods
+
+ private void LoadRecordings()
+ {
+ foreach (var file in Directory.GetFiles(_recordingsFolder, "*.tdr"))
+ {
+ Recordings.Add(new DataRecording(file, File.GetCreationTime(file)));
+ }
+ }
+
+ /// <summary>
+ /// Removes the recording.
+ /// </summary>
+ /// <param name="recording">The recording.</param>
+ private void RemoveRecording(DataRecording recording)
+ {
+ Recordings.Remove(recording);
+ }
+
+ /// <summary>
+ /// Toggles the camera.
+ /// </summary>
+ /// <param name="captureDevice">The capture device.</param>
+ private void ToggleCamera(CaptureDevice captureDevice)
+ {
+ if (captureDevice.Device != null)
+ {
+ captureDevice.IsStarted = !captureDevice.IsStarted;
+ }
+ }
+
+ private async void DiagnosticsTogglePlayPause()
+ {
+ if (!Player.IsPlaying || Player.IsPaused)
+ {
+ _frameProvider.Disable = true;
+
+ if (SelectedRecording.Player == null)
+ {
+ using (_notification.PushTaskItem("Loading Recording..."))
+ {
+ SelectedRecording.Player = new DiagnosticsFilePlayer();
+ await SelectedRecording.Player.Load(SelectedRecording.FilePath);
+ }
+ }
+
+ RegisterPlayer(SelectedRecording.Player);
+
+ if (!Player.IsPlaying)
+ {
+ _playerBarItem.Push();
+ }
+
+ Player.Play();
+ }
+ else
+ {
+ Player.Pause();
+ }
+
+ InvalidateRelayCommands();
+ }
+
+ private void RegisterPlayer(DiagnosticsFilePlayer player)
+ {
+ foreach (var recording in Recordings)
+ {
+ if (recording.Player != null)
+ {
+ recording.Player.FrameReceived -= Player_FrameReceived;
+ }
+ }
+
+ if (player != null)
+ {
+ Player = player;
+ Player.FrameReceived += Player_FrameReceived;
+ }
+ }
+
+ private void Player_FrameReceived(object sender, DataFileFrame frame)
+ {
+ if (_frameProvider.Disable)
+ {
+ _frameProvider.PushFrame(frame.PushDiagnosticsResponse);
+ }
+ }
+
+ private void StartDiagnosticsRecording()
+ {
+ using (_notification.PushTaskItem("Starting Recording..."))
+ {
+ Recorder.Start();
+
+ _recordingBarItem.Push();
+ }
+
+ InvalidateRelayCommands();
+ }
+
+ private async void StopRecorderOrPlayer()
+ {
+ if (Recorder.IsRecording)
+ {
+ using (_notification.PushTaskItem("Stopping Recording..."))
+ {
+ await Recorder.Stop();
+ _recordingBarItem.Pop();
+ }
+
+ String recordingName = _notification.ShowTextInput("Enter recording name", "Recording name");
+
+ if (!String.IsNullOrWhiteSpace(recordingName))
+ {
+ using (_notification.PushTaskItem("Saving Recording..."))
+ {
+ String filePath = Path.Combine(_recordingsFolder, recordingName + ".tdr");
+ await Recorder.Save(filePath);
+ Recordings.Insert(0, new DataRecording(filePath));
+ }
+ }
+
+ Recorder.Dispose();
+ Recorder = new DiagnosticsFileRecorder();
+ }
+ else if (Player.IsPlaying)
+ {
+ await Player.Stop();
+ _frameProvider.Disable = false;
+ _playerBarItem.Pop();
+ }
+
+ InvalidateRelayCommands();
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml
new file mode 100644
index 000000000..72f7da03d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml
@@ -0,0 +1,251 @@
+<UserControl x:Class="Tango.MachineStudio.DataCapture.Views.MainView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.DataCapture.ViewModels"
+ xmlns:video="clr-namespace:Tango.Video.DirectCapture;assembly=Tango.Video"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DataCapture"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DataCapture.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="1080" d:DesignWidth="1920" Background="White" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+
+ <UserControl.Resources>
+ <converters:StringEllipsisConverter x:Key="StringEllipsisConverter" />
+ <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
+ <converters:NumberToFileSizeConverter x:Key="NumberToFileSizeConverter"/>
+ <converters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="250"/>
+ <ColumnDefinition Width="1*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid>
+ <DockPanel Margin="10">
+ <Grid DockPanel.Dock="Top">
+ <StackPanel Orientation="Horizontal" Margin="0 0 0 10">
+ <Image Source="../Images/recordings.png" Width="42"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0" Foreground="DimGray" FontSize="16" FontWeight="SemiBold">RECORDINGS</TextBlock>
+ </StackPanel>
+
+ <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Stroke="Gainsboro" StrokeDashArray="5 5 5 5"></Rectangle>
+ </Grid>
+
+ <Grid Margin="0 10 0 0">
+ <ListBox IsEnabled="{Binding Player.IsPlaying,Converter={StaticResource BooleanInverseConverter}}" ItemsSource="{Binding Recordings}" SelectedItem="{Binding SelectedRecording}" HorizontalContentAlignment="Stretch">
+ <ListBox.ItemTemplate>
+ <DataTemplate>
+ <Grid HorizontalAlignment="Stretch">
+ <DockPanel>
+ <Button DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="24" Height="24" Foreground="#FF6F6F" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveRecordingCommand}" CommandParameter="{Binding}">
+ <materialDesign:PackIcon Kind="Delete" Width="20" Height="20" />
+ </Button>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <Image Source="../Images/tape.png" VerticalAlignment="Top" Width="32" Height="40" Stretch="Fill"></Image>
+ <TextBlock VerticalAlignment="Top" Margin="5 5 0 0">
+ <Run Text="{Binding Name,Mode=OneWay}"></Run>
+ <LineBreak/>
+ <Run Text="{Binding Date}" FontSize="10"></Run>
+ </TextBlock>
+ </StackPanel>
+ </DockPanel>
+
+ </Grid>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+ </Grid>
+ </DockPanel>
+
+ <Rectangle HorizontalAlignment="Right" VerticalAlignment="Stretch" Stroke="Gainsboro" StrokeDashArray="5 5 5 5" Margin="0 50 0 50"></Rectangle>
+ </Grid>
+
+ <Grid Grid.Column="1" Margin="10">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="430"/>
+ <RowDefinition Height="419*"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <DockPanel>
+ <StackPanel Orientation="Horizontal" Margin="0 0 0 10" DockPanel.Dock="Top" HorizontalAlignment="Center">
+ <Image Source="../Images/capture-device.png" Width="42"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="10 10 0 0" Foreground="DimGray" FontSize="16" FontWeight="SemiBold">CAPTURE DEVICES</TextBlock>
+ </StackPanel>
+ <ItemsControl Margin="0 20 0 0" ItemsSource="{Binding VideoCaptureProvider.AvailableCaptureDevices}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <UniformGrid Rows="1" Columns="{Binding VideoCaptureProvider.AvailableCaptureDevices.Count}" />
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate DataType="{x:Type video:CaptureDevice}">
+ <Border RenderOptions.BitmapScalingMode="Fant" Width="480">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/video-frame.png" Stretch="Fill"></ImageBrush>
+ </Border.Background>
+
+ <Grid>
+ <Border Margin="33 32 33 55">
+ <Grid>
+ <Border IsHitTestVisible="False" VerticalAlignment="Center" Padding="10" HorizontalAlignment="Center" Background="#20808080" CornerRadius="5">
+ <TextBlock FontSize="11" Text="{Binding Device.Name,Converter={StaticResource StringEllipsisConverter},ConverterParameter=30,FallbackValue='No Camera',TargetNullValue='No Camera'}"></TextBlock>
+ </Border>
+
+ <Image Source="{Binding VideoSource,Mode=OneWay,IsAsync=True}" Stretch="Fill" Visibility="{Binding IsStarted,Converter={StaticResource BooleanToVisibilityConverter}}"></Image>
+
+ <Grid Background="#83000000" Cursor="Hand">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="Opacity" Value="0"></Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="MouseEnter">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="MouseLeave">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+
+ <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ToggleCameraCommand}" CommandParameter="{Binding}" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Width="60" Height="60" Padding="0">
+ <materialDesign:PackIcon Width="40" Height="40">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Kind" Value="Play"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsStarted}" Value="True">
+ <Setter Property="Kind" Value="Stop"></Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding IsStarted}" Value="False">
+ <Setter Property="Kind" Value="Play"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </Button>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+ </Border>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </DockPanel>
+
+ <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Stroke="Gainsboro" StrokeDashArray="5 5 5 5"></Rectangle>
+ </Grid>
+
+ <Grid Grid.Row="1">
+
+ <DockPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="60" Visibility="{Binding Recorder.IsRecording,Converter={StaticResource BooleanToVisibilityConverter}}" TextElement.FontSize="40">
+ <TextBlock DockPanel.Dock="Left">
+ <Run FontWeight="SemiBold" FontStyle="Italic">Total Frames:</Run>
+ <Run FontStyle="Italic" Foreground="#545454" Text="{Binding Recorder.TotalFramesRecorded,StringFormat={}{0:N0},Mode=OneWay,TargetNullValue=0,FallbackValue=0}"></Run>
+ </TextBlock>
+ <TextBlock Margin="80 0 0 0" HorizontalAlignment="Right" Width="250">
+ <Run FontWeight="SemiBold" FontStyle="Italic">File Size:</Run>
+ <Run FontStyle="Italic" Foreground="#545454" Text="{Binding Recorder.TotalBytesRecorded,Mode=OneWay,Converter={StaticResource NumberToFileSizeConverter},TargetNullValue=0,FallbackValue=0}"></Run>
+ </TextBlock>
+ </DockPanel>
+
+ <StackPanel VerticalAlignment="Bottom" Margin="0 0 0 50">
+ <Grid Margin="50 0 0 0">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
+ <Button Command="{Binding MediaStopCommand}" Margin="0 0 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}" Padding="0" Width="150" Height="150" Background="Transparent">
+ <materialDesign:PackIcon Width="100" Height="100" Kind="Rewind" Foreground="{StaticResource AccentColorBrush}" />
+ </Button>
+ <Button Command="{Binding MediaPlayPauseCommand}" Margin="20 0 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}" Padding="0" Width="200" Height="200" Background="Transparent">
+ <materialDesign:PackIcon Width="100" Height="100" Foreground="{StaticResource AccentColorBrush}">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Kind" Value="Play"></Setter>
+ <Style.Triggers>
+ <MultiDataTrigger>
+ <MultiDataTrigger.Conditions>
+ <Condition Binding="{Binding Player.IsPlaying}" Value="True" />
+ <Condition Binding="{Binding Player.IsPaused}" Value="False" />
+ </MultiDataTrigger.Conditions>
+ <Setter Property="Kind" Value="Pause"></Setter>
+ </MultiDataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </Button>
+ <Button Command="{Binding MediaStopCommand}" Margin="20 0 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}" Padding="0" Width="150" Height="150" Background="Transparent">
+ <materialDesign:PackIcon Width="100" Height="100" Kind="Stop" Foreground="{StaticResource AccentColorBrush}" />
+ </Button>
+ <Button Command="{Binding MediaStopCommand}" Margin="20 0 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}" Padding="0" Width="150" Height="150" Background="Transparent">
+ <materialDesign:PackIcon Width="100" Height="100" Kind="FastForward" Foreground="{StaticResource AccentColorBrush}" />
+ </Button>
+ <Button Command="{Binding MediaRecordingCommand}" Margin="20 0 0 0" Style="{StaticResource MaterialDesignFloatingActionButton}" Foreground="#FF7A7A" BorderBrush="#FF8585" Padding="0" Width="100" Height="100" Background="Transparent" ToolTip="Start Recording">
+ <materialDesign:PackIcon Width="50" Height="50" Kind="Record" />
+ </Button>
+ </StackPanel>
+ <Grid>
+ <TextBlock Margin="0 0 50 0" VerticalAlignment="Center" HorizontalAlignment="Right" Foreground="#FF8585" FontSize="60" FontFamily="{StaticResource digital-7}">
+ <TextBlock.Style>
+ <Style TargetType="TextBlock">
+ <Setter Property="Opacity" Value="1"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding Recorder.IsRecording}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Duration="00:00:01" RepeatBehavior="Forever">
+ <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="1" />
+ <DiscreteDoubleKeyFrame KeyTime="00:00:0.5" Value="0" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Duration="00:00:01">
+ <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="1" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </TextBlock.Style>
+ <Run Text="{Binding Player.CurrentTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
+ <Run>/</Run>
+ <Run Text="{Binding Player.TotalTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
+ </TextBlock>
+ </Grid>
+ </Grid>
+ <Slider Margin="10 40 50 0" Visibility="{Binding Recorder.IsRecording,Converter={StaticResource BooleanToVisibilityInverseConverter}}" Maximum="{Binding Player.TotalFrames}" Value="{Binding Player.CurrentFrame}"></Slider>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml.cs
index e5519cb7e..624840d66 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/MainView.xaml.cs
@@ -13,14 +13,14 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
-namespace Tango.MachineStudio.Developer
+namespace Tango.MachineStudio.DataCapture.Views
{
/// <summary>
- /// Interaction logic for UserControl1.xaml
+ /// Interaction logic for MainView.xaml
/// </summary>
- public partial class UserControl1 : UserControl
+ public partial class MainView : UserControl
{
- public UserControl1()
+ public MainView()
{
InitializeComponent();
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml
new file mode 100644
index 000000000..3e76ce6ef
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml
@@ -0,0 +1,53 @@
+<UserControl x:Class="Tango.MachineStudio.DataCapture.Views.PlayingBarView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.DataCapture.ViewModels"
+ xmlns:video="clr-namespace:Tango.Video.DirectCapture;assembly=Tango.Video"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DataCapture"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DataCapture.Views"
+ mc:Ignorable="d"
+ Width="350" Height="30" Background="{StaticResource AccentColorBrush}" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}">
+ <Grid>
+ <DockPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
+ <TextBlock VerticalAlignment="Center" FontFamily="{StaticResource digital-7}" Foreground="#F6F6F6" FontSize="20">
+ <Run Text="{Binding Player.CurrentTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
+ <Run>/</Run>
+ <Run Text="{Binding Player.TotalTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
+ </TextBlock>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <Button Command="{Binding MediaPlayPauseCommand}" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="30" Height="30" Foreground="White">
+ <materialDesign:PackIcon Width="30" Height="30">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Kind" Value="Play"></Setter>
+ <Style.Triggers>
+ <MultiDataTrigger>
+ <MultiDataTrigger.Conditions>
+ <Condition Binding="{Binding Player.IsPlaying}" Value="True" />
+ <Condition Binding="{Binding Player.IsPaused}" Value="False" />
+ </MultiDataTrigger.Conditions>
+ <Setter Property="Kind" Value="Pause"></Setter>
+ </MultiDataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </Button>
+ <Button Command="{Binding MediaStopCommand}" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="30" Height="30" Foreground="White">
+ <materialDesign:PackIcon Kind="Stop" Width="30" Height="30" />
+ </Button>
+ </StackPanel>
+
+ <Slider VerticalAlignment="Center" Margin="10 0 10 0" Foreground="White" Maximum="{Binding Player.TotalFrames}" Value="{Binding Player.CurrentFrame}"></Slider>
+ </DockPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml.cs
new file mode 100644
index 000000000..f9e502f8b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.DataCapture.Views
+{
+ /// <summary>
+ /// Interaction logic for RecordingBarView.xaml
+ /// </summary>
+ public partial class PlayingBarView : UserControl
+ {
+ public PlayingBarView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml
new file mode 100644
index 000000000..d076eb631
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml
@@ -0,0 +1,50 @@
+<UserControl x:Class="Tango.MachineStudio.DataCapture.Views.RecordingBarView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.DataCapture.ViewModels"
+ xmlns:video="clr-namespace:Tango.Video.DirectCapture;assembly=Tango.Video"
+ xmlns:global="clr-namespace:Tango.MachineStudio.DataCapture"
+ xmlns:local="clr-namespace:Tango.MachineStudio.DataCapture.Views"
+ mc:Ignorable="d"
+ Width="200" Height="30" Background="{StaticResource AccentColorBrush}" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}">
+ <Grid>
+ <DockPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
+ <TextBlock VerticalAlignment="Center" FontFamily="{StaticResource digital-7}" Text="{Binding Recorder.RecordingTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}" Foreground="#F6F6F6" FontSize="20"></TextBlock>
+ <Button Command="{Binding MediaStopCommand}" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="30" Height="30" Foreground="White" ToolTip="Stop">
+ <materialDesign:PackIcon Kind="Stop" Width="30" Height="30" />
+ </Button>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal">
+ <Ellipse Width="12" Height="12" Fill="#FF6464" Margin="0 0 0 0">
+ <Ellipse.Style>
+ <Style TargetType="Ellipse">
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="Loaded">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Duration="00:00:01" RepeatBehavior="Forever">
+ <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="1" />
+ <DiscreteDoubleKeyFrame KeyTime="00:00:0.5" Value="0" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Ellipse.Style>
+ </Ellipse>
+ <TextBlock Margin="5 0 0 0" Text="Recording..." VerticalAlignment="Center" Foreground="White" FontWeight="SemiBold" FontStyle="Italic"></TextBlock>
+ </StackPanel>
+ </DockPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml.cs
new file mode 100644
index 000000000..97389a1e5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/RecordingBarView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.DataCapture.Views
+{
+ /// <summary>
+ /// Interaction logic for RecordingBarView.xaml
+ /// </summary>
+ public partial class RecordingBarView : UserControl
+ {
+ public RecordingBarView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/app.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/app.config
new file mode 100644
index 000000000..cacd4cd77
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/app.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/packages.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/packages.config
new file mode 100644
index 000000000..4fd672b32
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/packages.config
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="CommonServiceLocator" version="1.3" targetFramework="net46" />
+ <package id="MahApps.Metro" version="1.5.0" targetFramework="net46" />
+ <package id="MaterialDesignColors" version="1.1.2" targetFramework="net46" />
+ <package id="MaterialDesignThemes" version="2.3.1.953" targetFramework="net46" />
+ <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net46" />
+</packages> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopCMYKToColorConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopCMYKToColorConverter.cs
new file mode 100644
index 000000000..5bc163b18
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopCMYKToColorConverter.cs
@@ -0,0 +1,53 @@
+using ColorMine.ColorSpaces;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class BrushStopCMYKToColorConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Cmyk cmyk = new Cmyk();
+
+ cmyk.C = System.Convert.ToDouble(values[0]) / 100d;
+ cmyk.M = System.Convert.ToDouble(values[1]) / 100d;
+ cmyk.Y = System.Convert.ToDouble(values[2]) / 100d;
+ cmyk.K = System.Convert.ToDouble(values[3]) / 100d;
+
+ IRgb rgb = cmyk.ToRgb();
+
+ return Color.FromRgb((byte)rgb.R, (byte)rgb.G, (byte)rgb.B);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Color color = (Color)value;
+ Rgb rgb = new Rgb(color.R, color.G, color.B);
+ Cmyk cmyk = rgb.To<Cmyk>();
+
+ return new object[] { cmyk.C * 100, cmyk.M * 100, cmyk.Y * 100, cmyk.K * 100 };
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopLabToColorConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopLabToColorConverter.cs
new file mode 100644
index 000000000..f3dc07d3e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopLabToColorConverter.cs
@@ -0,0 +1,52 @@
+using ColorMine.ColorSpaces;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class BrushStopLabToColorConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Lab lab = new Lab();
+
+ lab.L = System.Convert.ToDouble(values[0]);
+ lab.A = System.Convert.ToDouble(values[1]);
+ lab.B = System.Convert.ToDouble(values[2]);
+
+ IRgb rgb = lab.ToRgb();
+
+ return Color.FromRgb((byte)rgb.R, (byte)rgb.G, (byte)rgb.B);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Color color = (Color)value;
+ Rgb rgb = new Rgb(color.R, color.G, color.B);
+ Lab cmyk = rgb.To<Lab>();
+
+ return new object[] { cmyk.L, cmyk.A, cmyk.B };
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToColorConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToColorConverter.cs
new file mode 100644
index 000000000..33cd8cc78
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToColorConverter.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class BrushStopToColorConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ double r = System.Convert.ToDouble(values[0]);
+ double g = System.Convert.ToDouble(values[1]);
+ double b = System.Convert.ToDouble(values[2]);
+
+ return Color.FromRgb((byte)r, (byte)g, (byte)b);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Color color = (Color)value;
+ return new object[] { color.R, color.G, color.B };
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetLimitConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetLimitConverter.cs
new file mode 100644
index 000000000..96c44a5a0
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetLimitConverter.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class BrushStopToOffsetLimitConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ BrushStop stop = values[0] as BrushStop;
+ Segment segment = values[1] as Segment;
+ String sign = parameter.ToString();
+
+ if (stop != null && segment != null)
+ {
+
+ if (stop.IsLast)
+ {
+ return 100d;
+ }
+ else if (stop.IsFirst)
+ {
+ return 0d;
+ }
+ else
+ {
+ return sign == "min" ? 0 : 100d;
+ }
+ }
+ else
+ {
+ return 100d;
+ }
+ }
+ catch
+ {
+ return 100d;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetValueConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetValueConverter.cs
new file mode 100644
index 000000000..d78ef0c8e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/BrushStopToOffsetValueConverter.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class BrushStopToOffsetValueConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ BrushStop stop = values[0] as BrushStop;
+ Segment segment = values[1] as Segment;
+
+ if (stop != null && segment != null)
+ {
+ if (stop.IsLast)
+ {
+ return 100d;
+ }
+ else if (stop.IsFirst)
+ {
+ return 0d;
+ }
+ else
+ {
+ return stop.OffsetPercent;
+ }
+ }
+ else
+ {
+ return 0d;
+ }
+ }
+ catch
+ {
+ return 0d;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/InkVolumeToLiquidRmlFactor.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/InkVolumeToLiquidRmlFactor.cs
new file mode 100644
index 000000000..3b675d23e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/InkVolumeToLiquidRmlFactor.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+using static Tango.Integration.Observables.BrushStop;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ //public class InkVolumeToLiquidRmlFactor : IMultiValueConverter
+ //{
+ // public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ // {
+ // InkVolume inkVolume = values[0] as InkVolume;
+ // Rml selectedRml = values[1] as Rml;
+
+ // if (inkVolume != null && selectedRml != null)
+ // {
+ // return inkVolume.GetLiquidMaxNanoliterPerCentimeter().ToString();
+ // }
+
+ // return String.Empty;
+ // }
+
+ // public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ // {
+ // throw new NotImplementedException();
+ // }
+ //}
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobProgressToPositionConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobProgressToPositionConverter.cs
new file mode 100644
index 000000000..9865b26f8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobProgressToPositionConverter.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class JobProgressToPositionConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Job job = values[0] as Job;
+
+ if (job != null)
+ {
+ double progress = System.Convert.ToDouble(values[1]);
+ double parentElementWidth = System.Convert.ToDouble(values[2]);
+
+ return (progress / job.Length) * parentElementWidth;
+ }
+ else
+ {
+ return 0d;
+ }
+ }
+ catch
+ {
+ return 0d;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobToColumnDefinitionsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobToColumnDefinitionsConverter.cs
new file mode 100644
index 000000000..ac6e53be8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/JobToColumnDefinitionsConverter.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class JobToColumnDefinitionsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ Job job = value as Job;
+
+ List<ColumnDefinition> columns = new List<ColumnDefinition>();
+
+ double totalLength = job.Segments.Sum(x => x.Length);
+
+ foreach (var segment in job.Segments)
+ {
+ columns.Add(new ColumnDefinition() { Width = new GridLength(segment.Length / totalLength, GridUnitType.Star) });
+ }
+
+ return columns;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/ObjectsNotEqualToBooleanConveter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/ObjectsNotEqualToBooleanConveter.cs
new file mode 100644
index 000000000..15bfd6add
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/ObjectsNotEqualToBooleanConveter.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class ObjectsNotEqualToBooleanConveter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ return (values[0] != values[1]);
+ }
+ catch
+ {
+ return true;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/OneToPercentConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/OneToPercentConverter.cs
new file mode 100644
index 000000000..292de5cb4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/OneToPercentConverter.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class OneToPercentConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return System.Convert.ToDouble(value) * 100d;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return System.Convert.ToDouble(value) / 100d;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentLengthToWidthConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentLengthToWidthConverter.cs
new file mode 100644
index 000000000..b632d9d12
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentLengthToWidthConverter.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class SegmentLengthToWidthConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ if (values.Length == 4)
+ {
+ Job job = values[0] as Job;
+
+ if (job != null && values[1] is double)
+ {
+ double jobLength = System.Convert.ToDouble(values[1]);
+ double elementWidth = System.Convert.ToDouble(values[2]);
+ double segmentLength = System.Convert.ToDouble(values[3]);
+ double totalLength = job.Length;
+
+ return (segmentLength / totalLength) * elementWidth;
+ }
+ else
+ {
+ return 0d;
+ }
+ }
+ else
+ {
+ return 0d;
+ }
+ }
+ catch
+ {
+ return 0d;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverter.cs
new file mode 100644
index 000000000..1ac498070
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverter.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class SegmentToBrushConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Segment segment = value as Segment;
+
+ GradientStopCollection stops = new GradientStopCollection();
+
+ foreach (var stop in segment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stops.Add(new GradientStop(stop.Color, stop.OffsetPercent / 100d));
+ }
+
+ LinearGradientBrush brush = new LinearGradientBrush();
+ brush.StartPoint = new Point(0,0);
+ brush.EndPoint = new Point(1, 0);
+
+ brush.GradientStops = stops;
+
+ return brush;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverterMulti.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverterMulti.cs
new file mode 100644
index 000000000..41c1dd4df
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToBrushConverterMulti.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class SegmentToBrushConverterMulti : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Segment segment = values[0] as Segment;
+
+ if (segment != null)
+ {
+ GradientStopCollection stops = new GradientStopCollection();
+
+ foreach (var stop in segment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stops.Add(new GradientStop(stop.Color, stop.OffsetPercent / 100d));
+ }
+
+ LinearGradientBrush brush = new LinearGradientBrush();
+ brush.StartPoint = new Point(0, 0);
+ brush.EndPoint = new Point(1, 0);
+
+ brush.GradientStops = stops;
+
+ return brush;
+ }
+
+ return null;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverter.cs
new file mode 100644
index 000000000..f28a0b594
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverter.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class SegmentToGradientStopsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Segment segment = value as Segment;
+
+ GradientStopCollection stops = new GradientStopCollection();
+
+ foreach (var stop in segment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stops.Add(new GradientStop(stop.Color, stop.OffsetPercent / 100d));
+ }
+
+ return stops;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverterMulti.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverterMulti.cs
new file mode 100644
index 000000000..c50fbb06c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Converters/SegmentToGradientStopsConverterMulti.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Developer.Converters
+{
+ public class SegmentToGradientStopsConverterMulti : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ try
+ {
+ Segment segment = values[0] as Segment;
+
+ if (segment != null)
+ {
+ GradientStopCollection stops = new GradientStopCollection();
+
+ foreach (var stop in segment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stops.Add(new GradientStop(stop.Color, stop.OffsetPercent / 100d));
+ }
+
+ return stops;
+ }
+
+ return null;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/DeveloperModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/DeveloperModule.cs
index c3d351468..6cdda4bc8 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/DeveloperModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/DeveloperModule.cs
@@ -5,42 +5,50 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Developer.Views;
using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.Developer
{
- public class DeveloperModule : IStudioModule
+ /// <summary>
+ /// Represents the Machine Studio developer module.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.StudioModuleBase" />
+ public class DeveloperModule : StudioModuleBase
{
- private bool _isInitialized;
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Developer";
- public string Name => "Developer";
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Research and development, manage RML, STRIP and Process.";
- public string Description => "Research and development, manage RML, STRIP and Process.";
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/developer.jpg");
- public BitmapSource Image => ResourceHelper.GetImageFromResources("Images/developer.jpg");
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MainView();
- public FrameworkElement MainView => new MainView();
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunDeveloperModule;
- public bool IsInitialized => _isInitialized;
-
- public Permissions Permission => Permissions.RunDeveloperModule;
-
- public void Dispose()
- {
- throw new NotImplementedException();
- }
-
- public void Initialize()
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
{
- if (!_isInitialized)
- {
- //Initialize..
-
- _isInitialized = true;
- }
+
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/White-Background.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/White-Background.jpg
new file mode 100644
index 000000000..3810e060f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/White-Background.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/black-screen.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/black-screen.jpg
new file mode 100644
index 000000000..7ed5c3eb2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/black-screen.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/calendar.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/calendar.png
new file mode 100644
index 000000000..763783514
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/calendar.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/camera.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/camera.png
new file mode 100644
index 000000000..526573632
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/camera.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/color-palette.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/color-palette.png
new file mode 100644
index 000000000..b1c58876f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/color-palette.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/colorspace.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/colorspace.png
new file mode 100644
index 000000000..fca9f226e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/colorspace.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/description.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/description.png
new file mode 100644
index 000000000..d6e3d76ea
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/description.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/graphs.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/graphs.png
new file mode 100644
index 000000000..6a211693d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/graphs.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/inter-segment.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/inter-segment.png
new file mode 100644
index 000000000..e7c25faa2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/inter-segment.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/line_graph.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/line_graph.png
new file mode 100644
index 000000000..7e21f4e97
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/line_graph.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/lubrication.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/lubrication.png
new file mode 100644
index 000000000..bba463b31
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/lubrication.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/machine-trans.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/machine-trans.png
new file mode 100644
index 000000000..a7cf65852
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/machine-trans.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/name.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/name.png
new file mode 100644
index 000000000..a25bded5c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/name.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/no-signal.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/no-signal.jpg
new file mode 100644
index 000000000..e8b1313c9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/no-signal.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/rgb.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/rgb.png
new file mode 100644
index 000000000..42f69513b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/rgb.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/ruler.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/ruler.png
new file mode 100644
index 000000000..173e4c204
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/ruler.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment-single.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment-single.png
new file mode 100644
index 000000000..016666122
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment-single.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment.png
new file mode 100644
index 000000000..d0f85b83f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/segment.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/tape.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/tape.png
new file mode 100644
index 000000000..8a4739b23
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/tape.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/video-frame.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/video-frame.png
new file mode 100644
index 000000000..9c29dc438
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/video-frame.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/wind.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/wind.png
new file mode 100644
index 000000000..23d2e0035
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Images/wind.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationManager.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationManager.cs
new file mode 100644
index 000000000..03e022380
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationManager.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Logging;
+using Tango.MachineStudio.Common.Navigation;
+using Tango.MachineStudio.Developer.Views;
+
+namespace Tango.MachineStudio.Developer.Navigation
+{
+ public class DeveloperNavigationManager
+ {
+ public void NavigateTo(DeveloperNavigationView view)
+ {
+ LogManager.Log(String.Format("Navigating to view {0}...", view.ToString()));
+ MainView.Instance.TransitionControl.AutoNavigate(view.ToString());
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationView.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationView.cs
new file mode 100644
index 000000000..6d1c6669e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Navigation/DeveloperNavigationView.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Developer.Navigation
+{
+ public enum DeveloperNavigationView
+ {
+ MachineJobSelectionView,
+ JobView,
+ RunningJobView
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Resources/GraphEx.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Resources/GraphEx.xaml
new file mode 100644
index 000000000..a44a8191c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Resources/GraphEx.xaml
@@ -0,0 +1,126 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Developer.Resources">
+
+ <FontFamily x:Key="FontName">Segoe UI</FontFamily>
+ <FontFamily x:Key="NotesFont">Lucida Console</FontFamily>
+
+ <sys:Double x:Key="ExtraExtraLargeFontSize">28</sys:Double>
+ <sys:Double x:Key="ExtraLargeFontSize">26</sys:Double>
+ <sys:Double x:Key="LargeFontSize">20</sys:Double>
+ <sys:Double x:Key="MediumFontSize">16</sys:Double>
+ <sys:Double x:Key="SmallFontSize">14</sys:Double>
+ <sys:Double x:Key="MiniFontSize">12</sys:Double>
+ <sys:Double x:Key="TinyFontSize">9</sys:Double>
+
+ <!--Colors-->
+ <Color x:Key="borderColor">Silver</Color>
+ <Color x:Key="graphGridLinesColor">#FFE9E9E9</Color>
+ <Color x:Key="graphsMarkerColor">Gray</Color>
+ <Color x:Key="materialColor">#03A9F4</Color>
+
+
+ <!--Brushes-->
+ <SolidColorBrush x:Key="borderBrush" Color="{StaticResource borderColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="BlackBrush" Color="#545454"></SolidColorBrush>
+
+ <SolidColorBrush x:Key="graphGridLinesLightBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesDarkBrush" Color="#FF2E2E2E"></SolidColorBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundLight">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundDark">
+ <GradientStop Color="Black"/>
+ <GradientStop Color="#FF333333" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackground">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLabelBackground" Opacity="0.7">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFD9D9D9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLegendBackground" Opacity="0.7">
+ <GradientStop Color="#FFE9E9E9"/>
+ <GradientStop Color="#FFBDBDBD" Offset="1"/>
+ </LinearGradientBrush>
+
+ <SolidColorBrush Color="#FFF1F1F1" x:Key="topBarBackgroundBrush"></SolidColorBrush>
+
+ <!--Navigation Link Button-->
+ <Style x:Key="LinkButton" TargetType="Button">
+ <Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <TextBlock FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}">
+ <ContentPresenter /></TextBlock>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Foreground" Value="{StaticResource BlackBrush}" />
+ <Style.Triggers>
+ <Trigger Property="IsEnabled" Value="False">
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ </Trigger>
+ <Trigger Property="IsMouseOver" Value="true">
+ <Setter Property="Foreground" Value="{StaticResource AccentColorBrush}" />
+ </Trigger>
+ <EventTrigger RoutedEvent="TouchUp">
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0" To="{StaticResource BlackColor}"></ColorAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ <!--Navigation Link Button-->
+
+
+ <!--Graph Label-->
+ <Style x:Key="graphLabel" TargetType="Label">
+ <Style.Setters>
+ <Setter Property="IsHitTestVisible" Value="False"></Setter>
+ <Setter Property="Margin" Value="-1 -1 0 0"></Setter>
+ <Setter Property="HorizontalAlignment" Value="Left"></Setter>
+ <Setter Property="VerticalAlignment" Value="Top"></Setter>
+ <Setter Property="Padding" Value="0"></Setter>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Border Width="Auto" Padding="0 0 20 0" Height="25" BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1" CornerRadius="0 0 30 0" Background="{StaticResource graphLabelBackground}" >
+ <TextBlock Margin="5 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="{StaticResource TinyFontSize}" Text="{Binding}"></TextBlock>
+ </Border>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ <!--Graph Label-->
+
+
+ <!--Graph Ticks Template-->
+ <DataTemplate x:Key="graphTicksTemplate">
+ <Ellipse Width="3" Height="3" Margin="0 0 0 0" Fill="{StaticResource AccentColorBrush}"></Ellipse>
+ </DataTemplate>
+ <!--Graph Ticks Template-->
+
+ <DataTemplate x:Key="graphTooltipTemplate">
+ <Border CornerRadius="5" BorderThickness="1" BorderBrush="White" Padding="8" MinWidth="50" Margin="20 0 20 0">
+ <Border.Background>
+ <SolidColorBrush Color="Black" Opacity="0.5"></SolidColorBrush>
+ </Border.Background>
+ <TextBlock Foreground="White" FontSize="10" HorizontalAlignment="Center" TextAlignment="Center" Text="{Binding StringFormat='0.000'}"></TextBlock>
+ </Border>
+ </DataTemplate>
+</ResourceDictionary> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Tango.MachineStudio.Developer.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Tango.MachineStudio.Developer.csproj
index 44b50b443..364b8573a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Tango.MachineStudio.Developer.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Tango.MachineStudio.Developer.csproj
@@ -31,8 +31,61 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="DeepEqual, Version=1.6.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\DeepEqual.1.6.0.0\lib\net40\DeepEqual.dll</HintPath>
+ </Reference>
+ <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.dll</HintPath>
+ </Reference>
+ <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
+ </Reference>
+ <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath>
+ </Reference>
+ <Reference Include="MahApps.Metro, Version=1.5.0.23, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignColors, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignColors.1.1.2\lib\net45\MaterialDesignColors.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
+ </Reference>
<Reference Include="System" />
+ <Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Data" />
+ <Reference Include="System.Reactive.Core, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Interfaces, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Interfaces.3.1.1\lib\net45\System.Reactive.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Linq, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Linq.3.1.1\lib\net46\System.Reactive.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.PlatformServices, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.PlatformServices.3.1.1\lib\net46\System.Reactive.PlatformServices.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Windows.Threading, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Windows" />
+ <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
+ </Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@@ -47,25 +100,62 @@
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Converters\BrushStopLabToColorConverter.cs" />
+ <Compile Include="Converters\BrushStopCMYKToColorConverter.cs" />
+ <Compile Include="Converters\BrushStopToColorConverter.cs" />
+ <Compile Include="Converters\BrushStopToOffsetLimitConverter.cs" />
+ <Compile Include="Converters\BrushStopToOffsetValueConverter.cs" />
+ <Compile Include="Converters\InkVolumeToLiquidRmlFactor.cs" />
+ <Compile Include="Converters\JobProgressToPositionConverter.cs" />
+ <Compile Include="Converters\JobToColumnDefinitionsConverter.cs" />
+ <Compile Include="Converters\ObjectsNotEqualToBooleanConveter.cs" />
+ <Compile Include="Converters\OneToPercentConverter.cs" />
+ <Compile Include="Converters\SegmentLengthToWidthConverter.cs" />
+ <Compile Include="Converters\SegmentToBrushConverter.cs" />
+ <Compile Include="Converters\SegmentToBrushConverterMulti.cs" />
+ <Compile Include="Converters\SegmentToGradientStopsConverterMulti.cs" />
+ <Compile Include="Converters\SegmentToGradientStopsConverter.cs" />
<Compile Include="DeveloperModule.cs" />
+ <Compile Include="Navigation\DeveloperNavigationManager.cs" />
+ <Compile Include="Navigation\DeveloperNavigationView.cs" />
+ <Compile Include="ViewModelLocator.cs" />
+ <Compile Include="ViewModels\MainViewVM.cs" />
<Compile Include="Views\MainView.xaml.cs">
<DependentUpon>MainView.xaml</DependentUpon>
</Compile>
- <Page Include="UserControl1.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
+ <Compile Include="Views\IMainView.cs" />
+ <Compile Include="Views\JobView.xaml.cs">
+ <DependentUpon>JobView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\MachineJobSelectionView.xaml.cs">
+ <DependentUpon>MachineJobSelectionView.xaml</DependentUpon>
+ </Compile>
<Compile Include="..\..\..\Versioning\GlobalVersionInfo.cs">
<Link>GlobalVersionInfo.cs</Link>
</Compile>
- <Compile Include="UserControl1.xaml.cs">
- <DependentUpon>UserControl1.xaml</DependentUpon>
- <SubType>Code</SubType>
+ <Compile Include="Views\RunningJobView.xaml.cs">
+ <DependentUpon>RunningJobView.xaml</DependentUpon>
</Compile>
+ <Page Include="Resources\GraphEx.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
<Page Include="Views\MainView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="Views\JobView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\MachineJobSelectionView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\RunningJobView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
@@ -86,32 +176,142 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
+ <None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\..\..\SideChains\ColorMine\ColorMine.csproj">
+ <Project>{37e4ceab-b54b-451f-b535-04cf7da9c459}</Project>
+ <Name>ColorMine</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\SideChains\RealTimeGraphEx\RealTimeGraphEx.csproj">
+ <Project>{b9ae25d6-be35-492f-9079-21a7f3e6f7cc}</Project>
+ <Name>RealTimeGraphEx</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.ColorPicker\Tango.ColorPicker.csproj">
+ <Project>{a2f5af44-29ff-45d6-9d25-ecda5cce88b5}</Project>
+ <Name>Tango.ColorPicker</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj">
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
+ <ProjectReference Include="..\..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
+ <Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
+ <Name>Tango.DAL.Remote</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.DragAndDrop\Tango.DragAndDrop.csproj">
+ <Project>{b112d89a-a106-41ae-a0c1-4abc84c477f5}</Project>
+ <Name>Tango.DragAndDrop</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
+ <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
+ <Name>Tango.Integration</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj">
+ <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project>
+ <Name>Tango.Logging</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.PMR\Tango.PMR.csproj">
+ <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project>
+ <Name>Tango.PMR</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Settings\Tango.Settings.csproj">
+ <Project>{D8F1AD85-526A-4F50-B6DC-D437AF63D8D8}</Project>
+ <Name>Tango.Settings</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj">
<Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
<Name>Tango.SharedUI</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Transport\Tango.Transport.csproj">
+ <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
+ <Name>Tango.Transport</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Video\Tango.Video.csproj">
+ <Project>{9652f972-2bd1-4283-99cb-fc6240434c17}</Project>
+ <Name>Tango.Video</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.MachineStudio.Common\Tango.MachineStudio.Common.csproj">
<Project>{cb0b0aa2-bb24-4bca-a720-45e397684e12}</Project>
<Name>Tango.MachineStudio.Common</Name>
</ProjectReference>
+ <ProjectReference Include="..\Tango.MachineStudio.DB\Tango.MachineStudio.DB.csproj">
+ <Project>{94f7acf8-55e1-4a02-b9bc-a818413fdbbf}</Project>
+ <Name>Tango.MachineStudio.DB</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Tango.MachineStudio.MachineDesigner\Tango.MachineStudio.MachineDesigner.csproj">
+ <Project>{d0ce8122-077d-42a2-9490-028ae4769b52}</Project>
+ <Name>Tango.MachineStudio.MachineDesigner</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Tango.MachineStudio.Technician\Tango.MachineStudio.Technician.csproj">
+ <Project>{5d39c1e1-3ecd-4634-bd1b-2bcf71c54a15}</Project>
+ <Name>Tango.MachineStudio.Technician</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\rgb.png" />
</ItemGroup>
- <ItemGroup />
<ItemGroup>
<Resource Include="Images\developer.jpg" />
</ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\description.png" />
+ <Resource Include="Images\inter-segment.png" />
+ <Resource Include="Images\lubrication.png" />
+ <Resource Include="Images\name.png" />
+ <Resource Include="Images\wind.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\calendar.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\machine-trans.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\graphs.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\line_graph.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\no-signal.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\camera.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\video-frame.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\segment.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\segment-single.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\ruler.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\color-palette.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\colorspace.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\White-Background.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\tape.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\black-screen.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Controls\" />
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModelLocator.cs
new file mode 100644
index 000000000..c5ed7d385
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModelLocator.cs
@@ -0,0 +1,36 @@
+using GalaSoft.MvvmLight;
+using GalaSoft.MvvmLight.Ioc;
+using Microsoft.Practices.ServiceLocation;
+using Tango.MachineStudio.Developer.Navigation;
+using Tango.MachineStudio.Developer.ViewModels;
+using Tango.MachineStudio.Developer.Views;
+
+namespace Tango.MachineStudio.Developer
+{
+ /// <summary>
+ /// This class contains static references to all the view models in the
+ /// application and provides an entry point for the bindings.
+ /// </summary>
+ public static class ViewModelLocator
+ {
+ /// <summary>
+ /// Initializes a new instance of the ViewModelLocator class.
+ /// </summary>
+ static ViewModelLocator()
+ {
+ ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
+
+ SimpleIoc.Default.Register<IMainView>(() => MainView.Instance);
+ SimpleIoc.Default.Register<MainViewVM>();
+ SimpleIoc.Default.Register<DeveloperNavigationManager, DeveloperNavigationManager>();
+ }
+
+ public static MainViewVM MainViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<MainViewVM>();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs
new file mode 100644
index 000000000..cf66efbd6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs
@@ -0,0 +1,1567 @@
+using GalaSoft.MvvmLight.Ioc;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+using Tango.Core.Commands;
+using Tango.Integration.Observables;
+using Tango.Integration.Operators;
+using Tango.Integration.Services;
+using Tango.Logging;
+using Tango.MachineStudio.Common.Authentication;
+using Tango.MachineStudio.Common.Controls;
+using Tango.MachineStudio.Common.Diagnostics;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.MachineStudio.Common.Video;
+using Tango.MachineStudio.Developer.Navigation;
+using Tango.MachineStudio.Developer.Views;
+using Tango.Settings;
+using Tango.SharedUI;
+using Tango.Transport;
+
+namespace Tango.MachineStudio.Developer.ViewModels
+{
+ /// <summary>
+ /// Represents the developer module main view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ public class MainViewVM : ViewModel<IMainView>, IShutdownRequestBlocker, IShutdownListener
+ {
+ private static object _syncLock = new object();
+
+ private INotificationProvider _notification;
+ private TimeSpan _runningJobEstimatedDuration;
+ private JobHandler _jobHandler;
+ private DeveloperNavigationManager _navigation;
+ private bool _blockInvalidateCommands;
+ private IAuthenticationProvider _authentication;
+ private ObservablesContext _machineDbContext;
+ private ObservablesContext _activeJobDbContext;
+
+ #region Properties
+
+ private ObservableCollection<Machine> _machines;
+ /// <summary>
+ /// Gets or sets the machines.
+ /// </summary>
+ public ObservableCollection<Machine> Machines
+ {
+ get { return _machines; }
+ set { _machines = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<ColorSpace> _colorSpaces;
+ /// <summary>
+ /// Gets or sets the color spaces.
+ /// </summary>
+ public ObservableCollection<ColorSpace> ColorSpaces
+ {
+ get { return _colorSpaces; }
+ set { _colorSpaces = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<Rml> _rmls;
+ /// <summary>
+ /// Gets or sets the RMLS.
+ /// </summary>
+ public ObservableCollection<Rml> Rmls
+ {
+ get { return _rmls; }
+ set { _rmls = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<WindingMethod> _windingMethods;
+ /// <summary>
+ /// Gets or sets the winding methods.
+ /// </summary>
+ public ObservableCollection<WindingMethod> WindingMethods
+ {
+ get { return _windingMethods; }
+ set { _windingMethods = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the application manager.
+ /// </summary>
+ public IStudioApplicationManager ApplicationManager { get; set; }
+
+ /// <summary>
+ /// Gets or sets the video capture provider.
+ /// </summary>
+ public IVideoCaptureProvider VideoCaptureProvider { get; set; }
+
+ protected Machine _selectedMachine;
+ /// <summary>
+ /// Gets or sets the selected machine.
+ /// </summary>
+ public Machine SelectedMachine
+ {
+ get { return _selectedMachine; }
+ set
+ {
+ _selectedMachine = value;
+ OnSelectedMachineChanged();
+ RaisePropertyChangedAuto();
+ InvalidateRelayCommands();
+
+ if (_selectedMachine != null)
+ {
+ _selectedMachine.Saved -= SelectedMachine_Saved;
+ _selectedMachine.Saved += SelectedMachine_Saved;
+ }
+ }
+ }
+
+ private List<LiquidTypesRml> _liquidTypesRmls;
+ /// <summary>
+ /// Gets or sets the liquid types RMLS.
+ /// </summary>
+ public List<LiquidTypesRml> LiquidTypesRmls
+ {
+ get { return _liquidTypesRmls; }
+ set { _liquidTypesRmls = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ProcessParametersTablesGroup _rmlProcessParametersTablesGroup;
+ /// <summary>
+ /// Gets or sets the RML process parameters table group (cloned).
+ /// </summary>
+ public ProcessParametersTablesGroup RmlProcessParametersTableGroup
+ {
+ get { return _rmlProcessParametersTablesGroup; }
+ set
+ { _rmlProcessParametersTablesGroup = value; RaisePropertyChangedAuto(); OnProcessParametersTableGroupChanged(); }
+ }
+
+ private ObservableCollection<ProcessParametersTablesGroup> _groupsHistory;
+ /// <summary>
+ /// Gets or sets the RML process parameters groups history.
+ /// </summary>
+ public ObservableCollection<ProcessParametersTablesGroup> GroupsHistory
+ {
+ get { return _groupsHistory; }
+ set { _groupsHistory = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ProcessParametersTablesGroup _selectedGroupHistory;
+ /// <summary>
+ /// Gets or sets the selected process parameters tables group history.
+ /// </summary>
+ public ProcessParametersTablesGroup SelectedGroupHistory
+ {
+ get { return _selectedGroupHistory; }
+ set { _selectedGroupHistory = value; RaisePropertyChangedAuto(); OnSelectedGroupHistoryChanged(); }
+ }
+
+ private ProcessParametersTable _selectedProcessParametersTable;
+ /// <summary>
+ /// Gets or sets the selected process parameters table.
+ /// </summary>
+ public ProcessParametersTable SelectedProcessParametersTable
+ {
+ get { return _selectedProcessParametersTable; }
+ set { _selectedProcessParametersTable = value; RaisePropertyChangedAuto(); OnSelectedParametersTableChanged(); }
+ }
+
+ private Job _activeJob;
+ /// <summary>
+ /// Gets or sets the selected machine job.
+ /// </summary>
+ public Job ActiveJob
+ {
+ get { return _activeJob; }
+ set
+ {
+ _activeJob = value;
+ RaisePropertyChangedAuto();
+ OnActiveJobChanged();
+ }
+ }
+
+ private Job _selectedMachineJob;
+ /// <summary>
+ /// Gets or sets the selected machine job.
+ /// </summary>
+ public Job SelectedMachineJob
+ {
+ get { return _selectedMachineJob; }
+ set { _selectedMachineJob = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<Job> _selectedJobs;
+ /// <summary>
+ /// Gets or sets the selected jobs.
+ /// </summary>
+ public ObservableCollection<Job> SelectedJobs
+ {
+ get { return _selectedJobs; }
+ set { _selectedJobs = value; RaisePropertyChangedAuto(); }
+ }
+
+ private Segment _selectedSegment;
+ /// <summary>
+ /// Gets or sets the job selected segment.
+ /// </summary>
+ public Segment SelectedSegment
+ {
+ get { return _selectedSegment; }
+ set { _selectedSegment = value; RaisePropertyChangedAuto(); OnSelectedSegmentChanged(); }
+ }
+
+ private ObservableCollection<Segment> _selectedSegments;
+ /// <summary>
+ /// Gets or sets the selected segments.
+ /// </summary>
+ public ObservableCollection<Segment> SelectedSegments
+ {
+ get { return _selectedSegments; }
+ set { _selectedSegments = value; RaisePropertyChangedAuto(); }
+ }
+
+ private BrushStop _selectedBrushStop;
+ /// <summary>
+ /// Gets or sets the selected segment selected brush stop.
+ /// </summary>
+ public BrushStop SelectedBrushStop
+ {
+ get { return _selectedBrushStop; }
+ set { _selectedBrushStop = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<BrushStop> _selectedBrushStops;
+ /// <summary>
+ /// Gets or sets the selected brush stops.
+ /// </summary>
+ public ObservableCollection<BrushStop> SelectedBrushStops
+ {
+ get { return _selectedBrushStops; }
+ set { _selectedBrushStops = value; RaisePropertyChangedAuto(); }
+ }
+
+ private Rml _selectedRML;
+ /// <summary>
+ /// Gets or sets the selected RML.
+ /// </summary>
+ public Rml SelectedRML
+ {
+ get { return _selectedRML; }
+ set
+ {
+ _selectedRML = value;
+ InvalidateLiquidFactorsAndProcessTables();
+ RaisePropertyChangedAuto();
+ InvalidateRelayCommands();
+ }
+ }
+
+ private bool _isSideBarOpened;
+ /// <summary>
+ /// Gets or sets a value indicating whether the configuration panels are opened.
+ /// </summary>
+ public bool IsSideBarOpened
+ {
+ get { return _isSideBarOpened; }
+ set { _isSideBarOpened = value; RaisePropertyChangedAuto(); }
+ }
+
+ private TimeSpan _estimatedDuration;
+ /// <summary>
+ /// Gets or sets the estimated duration for the selected job.
+ /// </summary>
+ public TimeSpan EstimatedDuration
+ {
+ get { return _estimatedDuration; }
+ set { _estimatedDuration = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isJobRunning;
+ /// <summary>
+ /// Gets or sets a value indicating whether a job is currently running.
+ /// </summary>
+ public bool IsJobRunning
+ {
+ get { return _isJobRunning; }
+ set { _isJobRunning = value; RaisePropertyChangedAuto(); }
+ }
+
+ private Job _runningJob;
+ /// <summary>
+ /// Gets or sets the currently running job.
+ /// </summary>
+ public Job RunningJob
+ {
+ get { return _runningJob; }
+ set { _runningJob = value; RaisePropertyChangedAuto(); }
+ }
+
+ private double _runningJobProgress;
+ /// <summary>
+ /// Gets or sets the running job current progress.
+ /// </summary>
+ public double RunningJobProgress
+ {
+ get { return _runningJobProgress; }
+ set { _runningJobProgress = value; RaisePropertyChangedAuto(); }
+ }
+
+ private TimeSpan _runningJobRemainingTime;
+ /// <summary>
+ /// Gets or sets the job remaining time.
+ /// </summary>
+ public TimeSpan RunningJobRemainingTime
+ {
+ get { return _runningJobRemainingTime; }
+ set { _runningJobRemainingTime = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isJobCompleted;
+ /// <summary>
+ /// Gets or sets a value indicating whether the running job has completed successfully.
+ /// </summary>
+ public bool IsJobCompleted
+ {
+ get { return _isJobCompleted; }
+ set { _isJobCompleted = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isJobFailed;
+ /// <summary>
+ /// Gets or sets a value indicating whether the running job has failed.
+ /// </summary>
+ public bool IsJobFailed
+ {
+ get { return _isJobFailed; }
+ set { _isJobFailed = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _showJobStatus;
+ /// <summary>
+ /// Gets or sets a value indicating whether to show all the relevant job status areas.
+ /// </summary>
+ public bool ShowJobStatus
+ {
+ get { return _showJobStatus; }
+ set { _showJobStatus = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isJobCanceled;
+ /// <summary>
+ /// Gets or sets a value indicating whether the last running job was canceled.
+ /// </summary>
+ public bool IsJobCanceled
+ {
+ get { return _isJobCanceled; }
+ set { _isJobCanceled = value; RaisePropertyChangedAuto(); }
+ }
+
+ private IMachineOperator _machineOperator;
+ /// <summary>
+ /// Gets or sets the machine operator.
+ /// </summary>
+ public IMachineOperator MachineOperator
+ {
+ get { return _machineOperator; }
+ set { _machineOperator = value; RaisePropertyChangedAuto(); }
+ }
+
+ private IRealTimeGraph _fullScreenGraph;
+ /// <summary>
+ /// Gets or sets the full screen graph.
+ /// </summary>
+ public IRealTimeGraph FullScreenGraph
+ {
+ get { return _fullScreenGraph; }
+ set { _fullScreenGraph = value; RaisePropertyChangedAuto(); }
+ }
+
+ private List<Segment> _runningJobSegments;
+ /// <summary>
+ /// Gets or sets the running job segments.
+ /// </summary>
+ public List<Segment> RunningJobSegments
+ {
+ get { return _runningJobSegments; }
+ set { _runningJobSegments = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ICollectionView _jobsCollectionView;
+ /// <summary>
+ /// Gets or sets the jobs collection view.
+ /// </summary>
+ public ICollectionView JobsCollectionView
+ {
+ get { return _jobsCollectionView; }
+ set
+ {
+ _jobsCollectionView = value;
+ BindingOperations.EnableCollectionSynchronization(_jobsCollectionView, _syncLock);
+
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private ICollectionView _segmentsCollectionView;
+ /// <summary>
+ /// Gets or sets the segments collection view.
+ /// </summary>
+ public ICollectionView SegmentsCollectionView
+ {
+ get { return _segmentsCollectionView; }
+ set
+ {
+ _segmentsCollectionView = value;
+ BindingOperations.EnableCollectionSynchronization(_segmentsCollectionView, _syncLock);
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private ICollectionView _brushStopsCollectionView;
+ /// <summary>
+ /// Gets or sets the brush stops collection view.
+ /// </summary>
+ public ICollectionView BrushStopsCollectionView
+ {
+ get { return _brushStopsCollectionView; }
+ set
+ {
+ _brushStopsCollectionView = value;
+ BindingOperations.EnableCollectionSynchronization(_brushStopsCollectionView, _syncLock);
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private String _jobFilter;
+ /// <summary>
+ /// Gets or sets the job filter.
+ /// </summary>
+ public String JobFilter
+ {
+ get { return _jobFilter; }
+ set { _jobFilter = value; RaisePropertyChangedAuto(); OnJobFilterChanged(); }
+ }
+
+ #endregion
+
+ #region Commands
+
+ /// <summary>
+ /// Gets or sets the edit machine command.
+ /// </summary>
+ public RelayCommand EditMachineCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the edit RML command.
+ /// </summary>
+ public RelayCommand EditRMLCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the toggle side bar command.
+ /// </summary>
+ public RelayCommand ToggleSideBarCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the save process parameters command.
+ /// </summary>
+ public RelayCommand SaveProcessParametersCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the save liquid factors command.
+ /// </summary>
+ public RelayCommand SaveLiquidFactorsCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the add segment command.
+ /// </summary>
+ public RelayCommand AddSegmentCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remove segment command.
+ /// </summary>
+ public RelayCommand RemoveSegmentCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the add job command.
+ /// </summary>
+ public RelayCommand AddJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remove job command.
+ /// </summary>
+ public RelayCommand RemoveJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the add brush stop command.
+ /// </summary>
+ public RelayCommand AddBrushStopCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remove brush stop command.
+ /// </summary>
+ public RelayCommand RemoveBrushStopCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the save job command.
+ /// </summary>
+ public RelayCommand SaveJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the discard job command.
+ /// </summary>
+ public RelayCommand DiscardJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the start job command.
+ /// </summary>
+ public RelayCommand StartJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the stop job command.
+ /// </summary>
+ public RelayCommand StopJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the close job completion status command.
+ /// </summary>
+ public RelayCommand CloseJobCompletionStatusCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the load job command.
+ /// </summary>
+ public RelayCommand LoadJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the duplicate job command.
+ /// </summary>
+ public RelayCommand DuplicateJobCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the duplicate segment command.
+ /// </summary>
+ public RelayCommand DuplicateSegmentCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the duplicate brush stop command.
+ /// </summary>
+ public RelayCommand DuplicateBrushStopCommand { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
+ public MainViewVM(IMainView view) : base(view, true)
+ {
+
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
+ [PreferredConstructor]
+ public MainViewVM(IMainView view, IStudioApplicationManager applicationManager, INotificationProvider notificationProvider, IDiagnosticsFrameProvider diagnosticsFrameProvider, IVideoCaptureProvider videoCaptureProvider, DeveloperNavigationManager navigation, IAuthenticationProvider authentication) : this(view)
+ {
+ SelectedJobs = new ObservableCollection<Job>();
+
+ LogManager.Log("Initializing machine Db context...");
+ _machineDbContext = ObservablesContext.CreateDefault();
+
+ if (SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedMachineGuid != null)
+ {
+ LogManager.Log("Setting last selected machine from settings...");
+ SelectedMachine = _machineDbContext.Machines.SingleOrDefault(x => x.Guid == SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedMachineGuid);
+ }
+
+ if (SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedJobGuid != null && SelectedMachine != null)
+ {
+ LogManager.Log("Setting last selected job from settings...");
+ SelectedMachineJob = SelectedMachine.Jobs.SingleOrDefault(x => x.Guid == SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedJobGuid);
+ }
+
+
+ _authentication = authentication;
+
+ _notification = notificationProvider;
+ _navigation = navigation;
+ ApplicationManager = applicationManager;
+ VideoCaptureProvider = videoCaptureProvider;
+
+ LogManager.Log("Initializing relay commands...");
+
+ //Initialize Commands...
+ EditMachineCommand = new RelayCommand(EditMachine, () => SelectedMachine != null);
+ EditRMLCommand = new RelayCommand(EditRML, () => SelectedRML != null);
+ ToggleSideBarCommand = new RelayCommand(() => IsSideBarOpened = !IsSideBarOpened);
+ SaveProcessParametersCommand = new RelayCommand(SaveProcessParameters, () => SelectedRML != null && SelectedRML.ProcessParametersTablesGroups.Count > 0);
+ SaveLiquidFactorsCommand = new RelayCommand(SaveLiquidFactors, () => SelectedRML != null);
+ AddSegmentCommand = new RelayCommand(AddSegment, () => ActiveJob != null);
+ RemoveSegmentCommand = new RelayCommand(RemoveSelectedSegments, () => SelectedSegment != null);
+ AddJobCommand = new RelayCommand(AddJob, () => SelectedMachine != null);
+ RemoveJobCommand = new RelayCommand(RemoveSelectedJobs, () => SelectedMachineJob != null);
+ AddBrushStopCommand = new RelayCommand(AddBrushStop, () => SelectedSegment != null);
+ RemoveBrushStopCommand = new RelayCommand(RemoveSelectedBrushStops, () => SelectedBrushStop != null);
+ SaveJobCommand = new RelayCommand(SaveActiveJob, () => SelectedMachine != null);
+ DiscardJobCommand = new RelayCommand(BackToJobs, () => SelectedMachine != null);
+ StartJobCommand = new RelayCommand(StartJob, () => ActiveJob != null && !IsJobRunning);
+ StopJobCommand = new RelayCommand(StopJob, () => IsJobRunning);
+ CloseJobCompletionStatusCommand = new RelayCommand(CloseJobCompletionStatusBar);
+ LoadJobCommand = new RelayCommand(LoadSelectedJob, () => SelectedMachineJob != null);
+ DuplicateJobCommand = new RelayCommand(DuplicateSelectedJobs, () => SelectedMachineJob != null);
+ DuplicateSegmentCommand = new RelayCommand(DuplicateSelectedSegments, () => SelectedSegment != null);
+ DuplicateBrushStopCommand = new RelayCommand(DuplicateSelectedBrushStops, () => SelectedBrushStop != null);
+
+ ApplicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ /// <summary>
+ /// Handles the application manager connected machine changes event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="machine">The machine.</param>
+ private void ApplicationManager_ConnectedMachineChanged(object sender, IExternalBridgeClient machine)
+ {
+ MachineOperator = machine;
+ }
+
+ /// <summary>
+ /// Handles the Saved event of the SelectedMachine.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
+ private void SelectedMachine_Saved(object sender, EventArgs e)
+ {
+ InvalidateLiquidFactorsAndProcessTables();
+ SelectedMachine.Reload(_machineDbContext);
+ }
+
+ /// <summary>
+ /// Handles the LengthChanged event of the SelectedJob.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
+ private void ActiveJob_LengthChanged(object sender, EventArgs e)
+ {
+ UpdateEstimatedDuration();
+ }
+
+ /// <summary>
+ /// Handles the DyeingSpeedMinInkUptakeChanged event of the SelectedProcessParametersTable.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
+ private void SelectedProcessParametersTable_DyeingSpeedMinInkUptakeChanged(object sender, EventArgs e)
+ {
+ if (SelectedSegment != null)
+ {
+ foreach (var liquidVolume in SelectedSegment.BrushStops.SelectMany(x => x.LiquidVolumes))
+ {
+ liquidVolume.Invalidate();
+ }
+ }
+
+ UpdateEstimatedDuration();
+ }
+
+ #endregion
+
+ #region Properties Changes
+
+ /// <summary>
+ /// Called when the selected parameters table has changed.
+ /// </summary>
+ protected virtual void OnSelectedParametersTableChanged()
+ {
+ if (SelectedProcessParametersTable != null)
+ {
+ LogManager.Log("Selected process parameters table changed.");
+ SelectedProcessParametersTable.DyeingSpeedMinInkUptakeChanged -= SelectedProcessParametersTable_DyeingSpeedMinInkUptakeChanged;
+ SelectedProcessParametersTable.DyeingSpeedMinInkUptakeChanged += SelectedProcessParametersTable_DyeingSpeedMinInkUptakeChanged;
+
+ SetSegmentBrushStopsLiquidVolumes(SelectedSegment);
+ UpdateEstimatedDuration();
+ }
+ }
+
+ /// <summary>
+ /// Called when the process parameters table group has been changed
+ /// </summary>
+ protected virtual void OnProcessParametersTableGroupChanged()
+ {
+ if (RmlProcessParametersTableGroup != null && RmlProcessParametersTableGroup.ProcessParametersTables.Count > 0)
+ {
+ LogManager.Log("Process parameters group changed...");
+ SelectedProcessParametersTable = RmlProcessParametersTableGroup.ProcessParametersTables.OrderBy(x => x.TableIndex).FirstOrDefault();
+
+ UpdateEstimatedDuration();
+ }
+ }
+
+ /// <summary>
+ /// Called when the selected segment has been changed
+ /// </summary>
+ protected virtual void OnSelectedSegmentChanged()
+ {
+ if (SelectedSegment != null)
+ {
+ LogManager.Log("Selected segment changed...");
+ SetSegmentBrushStopsLiquidVolumes(SelectedSegment);
+ SelectedBrushStop = SelectedSegment.BrushStops.FirstOrDefault();
+
+ BrushStopsCollectionView = CollectionViewSource.GetDefaultView(SelectedSegment.BrushStops);
+ BrushStopsCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrushStop.StopIndex), ListSortDirection.Ascending));
+ }
+ }
+
+ /// <summary>
+ /// Called when the selected group history has been changed
+ /// </summary>
+ protected virtual void OnSelectedGroupHistoryChanged()
+ {
+ if (SelectedGroupHistory != null)
+ {
+ LogManager.Log(String.Format("Parameters group {0} selected from history.", SelectedGroupHistory.Name));
+ RmlProcessParametersTableGroup = SelectedGroupHistory.CloneGroup();
+ }
+ }
+
+ /// <summary>
+ /// Called when the machine has been changed
+ /// </summary>
+ protected virtual void OnSelectedMachineChanged()
+ {
+ if (SelectedMachine != null)
+ {
+ LogManager.Log(String.Format("Machine {0} changed.", SelectedMachine.SerialNumber));
+ ReloadMachine();
+ JobsCollectionView = CollectionViewSource.GetDefaultView(SelectedMachine.Jobs);
+ JobsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Job.LastUpdated), ListSortDirection.Descending));
+ }
+ }
+
+ /// <summary>
+ /// Called when the job filtering has changed.
+ /// </summary>
+ protected virtual void OnJobFilterChanged()
+ {
+ String filter = JobFilter.ToLower();
+
+ JobsCollectionView.Filter = (job) =>
+ {
+ Job j = job as Job;
+ return String.IsNullOrWhiteSpace(filter)
+ ||
+ j.Name.ToLower().Contains(filter) //Job name
+ ||
+ j.User.Contact.FirstName.ToLower().Contains(filter) // User first name
+ ||
+ j.Length.ToString().Contains(filter); //Job length
+ };
+ }
+
+ /// <summary>
+ /// Called when the active job has changed.
+ /// </summary>
+ protected virtual void OnActiveJobChanged()
+ {
+ if (ActiveJob != null)
+ {
+ LogManager.Log(String.Format("Active job {0} changed.", ActiveJob.Name));
+ SegmentsCollectionView = CollectionViewSource.GetDefaultView(ActiveJob.Segments);
+ SegmentsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Segment.SegmentIndex), ListSortDirection.Ascending));
+ }
+ }
+
+ #endregion
+
+ #region Drag & Drop
+
+ /// <summary>
+ /// Switch the segment position in the job.
+ /// </summary>
+ /// <param name="dragged">The dragged.</param>
+ /// <param name="dropped">The dropped.</param>
+ public void OnDropSegment(Segment dragged, Segment dropped)
+ {
+ LogManager.Log(String.Format("Segment {0} Dropped on segment {1}", dragged.SegmentIndex, dropped.SegmentIndex));
+
+ dragged.SegmentIndex = dropped.SegmentIndex;
+ dropped.SegmentIndex++;
+
+ int index = 1;
+
+ foreach (var segment in ActiveJob.Segments.OrderBy(x => x.SegmentIndex))
+ {
+ segment.SegmentIndex = index++;
+ }
+
+ SegmentsCollectionView.Refresh();
+ }
+
+ /// <summary>
+ /// Switch the brush stop position in the segment.
+ /// </summary>
+ /// <param name="dragged">The dragged stop.</param>
+ /// <param name="dropped">The dropped stop.</param>
+ public void OnDropBrushStop(BrushStop dragged, BrushStop dropped)
+ {
+ LogManager.Log(String.Format("BrushStop {0} Dropped on BrushStop {1}", dragged.StopIndex, dropped.StopIndex));
+
+ dragged.SetStopIndex(dropped.StopIndex);
+ dropped.SetStopIndex(dropped.StopIndex + 1);
+ ArrangeBrushStopsIndices();
+ }
+
+ #endregion
+
+ #region Running Job Management
+
+ /// <summary>
+ /// Closes the job completion status bar.
+ /// </summary>
+ private void CloseJobCompletionStatusBar()
+ {
+ LogManager.Log("Closing job completion status bar...");
+ _navigation.NavigateTo(DeveloperNavigationView.JobView);
+ IsJobCompleted = false;
+ IsJobFailed = false;
+ IsJobCanceled = false;
+ ShowJobStatus = false;
+ RunningJob = null;
+ }
+
+ /// <summary>
+ /// Stops the job.
+ /// </summary>
+ private void StopJob()
+ {
+ LogManager.Log("Stopping job...");
+ IsJobRunning = false;
+ IsJobCanceled = true;
+ _jobHandler.Cancel();
+ }
+
+ /// <summary>
+ /// Fails the job.
+ /// </summary>
+ private void SetJobFailed()
+ {
+ LogManager.Log("Setting job failed state...");
+ IsJobRunning = false;
+ IsJobFailed = true;
+ }
+
+ /// <summary>
+ /// Completes the job.
+ /// </summary>
+ private void SetJobCompleted()
+ {
+ LogManager.Log("Setting job completed state...");
+ IsJobRunning = false;
+ IsJobCompleted = true;
+ }
+
+ /// <summary>
+ /// Starts the job.
+ /// </summary>
+ private void StartJob()
+ {
+ LogManager.Log(String.Format("Starting job {0}...", ActiveJob.Name));
+ if (MachineOperator == null || MachineOperator.State != TransportComponentState.Connected)
+ {
+ _notification.ShowError("No machine connected. Could not execute the specified job.");
+ return;
+ }
+
+ if (SelectedProcessParametersTable == null)
+ {
+ _notification.ShowError("No process parameters table selected. Could not execute the specified job.");
+ return;
+ }
+
+ RunningJobRemainingTime = TimeSpan.Zero;
+ RunningJobProgress = 0;
+ IsJobFailed = false;
+ IsJobCanceled = false;
+ IsJobCompleted = false;
+ IsJobRunning = true;
+ ShowJobStatus = true;
+ RunningJob = ActiveJob;
+ _runningJobEstimatedDuration = EstimatedDuration;
+
+ RunningJobSegments = CreateRunningJobEffectiveSegments(RunningJob);
+
+ _navigation.NavigateTo(DeveloperNavigationView.RunningJobView);
+
+ LogManager.Log("Sending job to machine operator...");
+ _jobHandler = MachineOperator.Print(ActiveJob, SelectedProcessParametersTable);
+
+ _jobHandler.StatusReceived += (x, status) =>
+ {
+ RunningJobRemainingTime = _runningJobEstimatedDuration - TimeSpan.FromSeconds(RunningJobProgress / (SelectedProcessParametersTable.DyeingSpeed / 100d));
+ RunningJobProgress = status.Progress;
+
+ foreach (var segment in RunningJobSegments)
+ {
+ var previousSegmentsWithThis = RunningJobSegments.Where(s => RunningJobSegments.IndexOf(s) <= RunningJobSegments.IndexOf(segment)).ToList();
+ var segmentsDuration = TimeSpan.FromSeconds(previousSegmentsWithThis.Sum(s => s.Length) / (SelectedProcessParametersTable.DyeingSpeed / 100d));
+ var segmentDuration = TimeSpan.FromSeconds(segment.Length / (SelectedProcessParametersTable.DyeingSpeed / 100d));
+ TimeSpan remaining = segmentsDuration - TimeSpan.FromSeconds(RunningJobProgress / (SelectedProcessParametersTable.DyeingSpeed / 100d));
+ if (remaining >= TimeSpan.Zero)
+ {
+ segment.RemainingTime = remaining;
+ }
+ if (remaining < segmentDuration)
+ {
+ segment.Started = true;
+ }
+ if (remaining <= TimeSpan.Zero)
+ {
+ segment.Completed = true;
+ segment.Started = false;
+ }
+ }
+ };
+
+ _jobHandler.Failed += (x, ex) =>
+ {
+ LogManager.Log(ex, String.Format("Job {0} has failed.", RunningJob.Name));
+ SetJobFailed();
+
+ InvokeUI(() =>
+ {
+ _notification.ShowError("Job failed. " + ex.Message);
+ });
+ };
+
+ _jobHandler.Completed += (x, e) =>
+ {
+ LogManager.Log(String.Format("Job {0} has completed.", RunningJob.Name));
+ SetJobCompleted();
+ };
+
+ _jobHandler.Canceled += (x, y) =>
+ {
+ LogManager.Log(String.Format("Job {0} has been canceled.", RunningJob.Name));
+ //Finally Canceled..
+ };
+ }
+
+ /// <summary>
+ /// Creates the running job effective segments.
+ /// </summary>
+ /// <param name="job">The job.</param>
+ /// <returns></returns>
+ private List<Segment> CreateRunningJobEffectiveSegments(Job job)
+ {
+ LogManager.Log("Creating job effective segments...");
+
+ List<Segment> segments = new List<Segment>();
+ foreach (var s in job.Segments)
+ {
+ s.Completed = false;
+ s.Started = false;
+ segments.Add(s);
+
+ if (job.EnableInterSegment && job.Segments.IndexOf(s) != job.Segments.Count - 1)
+ {
+ segments.Add(new Segment()
+ {
+ Length = job.InterSegmentLength,
+ BrushStops = new System.Collections.ObjectModel.ObservableCollection<BrushStop>()
+ {
+ new BrushStop()
+ {
+ Color = Colors.White,
+ }
+ },
+ Started = false,
+ Completed = false
+ });
+ }
+ }
+
+ return segments;
+ }
+
+ #endregion
+
+ #region RML
+
+ /// <summary>
+ /// Saves the liquid factors.
+ /// </summary>
+ private async void SaveLiquidFactors()
+ {
+ if (SelectedRML != null)
+ {
+ using (_notification.PushTaskItem("Saving Liquid Factors..."))
+ {
+ LogManager.Log(String.Format("Saving liquid factors for RML {0}...", SelectedRML.Name));
+ await SelectedRML.SaveAsync(_activeJobDbContext);
+ InvalidateLiquidFactorsAndProcessTables();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Navigates to the DB Module in order to edit the selected RML.
+ /// </summary>
+ private void EditRML()
+ {
+ LogManager.Log(String.Format("Requesting DB module for RML {0} editing...", SelectedRML.Name));
+ ApplicationManager.RequestModule("Data Base", SelectedRML);
+ }
+
+ /// <summary>
+ /// Saves the process parameters group.
+ /// </summary>
+ private async void SaveProcessParameters()
+ {
+ var response = _notification.ShowTextInput("Enter Group Name", "Group Name");
+
+ if (response == null) return;
+
+ using (_notification.PushTaskItem("Saving Parameters Group..."))
+ {
+ LogManager.Log(String.Format("Saving process parameters group under the name {0}...", response));
+ ProcessParametersTablesGroup group = new ProcessParametersTablesGroup();
+
+ List<ProcessParametersTable> tables = new List<ProcessParametersTable>();
+ foreach (var table in RmlProcessParametersTableGroup.ProcessParametersTables)
+ {
+ var newTable = table.CloneEntity();
+ newTable.ProcessParametersTablesGroup = group;
+ tables.Add(newTable);
+ }
+
+ group.Active = true;
+ group.ProcessParametersTables = tables.ToObservableCollection();
+ group.Rml = SelectedRML;
+ group.Name = response;
+ group.SaveDate = DateTime.UtcNow;
+
+ foreach (var g in SelectedRML.ProcessParametersTablesGroups)
+ {
+ g.Active = false;
+ }
+
+ SelectedRML.ProcessParametersTablesGroups.Add(group);
+ await SelectedRML.SaveAsync(_activeJobDbContext);
+
+ InvalidateLiquidFactorsAndProcessTables();
+ }
+ }
+
+ /// <summary>
+ /// Invalidates the liquid factors and process parameters tables.
+ /// </summary>
+ private void InvalidateLiquidFactorsAndProcessTables()
+ {
+ if (SelectedRML != null && SelectedMachine != null)
+ {
+ LogManager.Log("Invalidating liquid factors, process parameters and process group history...");
+ LiquidTypesRmls = SelectedMachine.Configuration.IdsPacks.OrderBy(x => x.PackIndex).Select(x => x.LiquidType).SelectMany(x => x.LiquidTypesRmls).Where(x => x.Rml.Guid == SelectedRML.Guid).ToList();
+ RmlProcessParametersTableGroup = SelectedRML.ProcessParametersTablesGroups.ToList().SingleOrDefault(x => x.Active);
+
+ var selectedHistory = RmlProcessParametersTableGroup;
+
+ if (RmlProcessParametersTableGroup != null)
+ {
+ RmlProcessParametersTableGroup = RmlProcessParametersTableGroup.CloneGroup();
+ RmlProcessParametersTableGroup.ProcessParametersTables = RmlProcessParametersTableGroup.ProcessParametersTables.OrderBy(x => x.TableIndex).ToObservableCollection();
+ }
+
+ GroupsHistory = SelectedRML.ProcessParametersTablesGroups.OrderByDescending(x => x.SaveDate).OrderBy(x => !x.Active).ToObservableCollection();
+
+ _selectedGroupHistory = selectedHistory;
+
+ RaisePropertyChangedAuto(nameof(SelectedGroupHistory));
+ }
+ }
+
+ #endregion
+
+ #region Active Job Management
+
+ /// <summary>
+ /// Loads the selected job.
+ /// </summary>
+ private void LoadSelectedJob()
+ {
+ if (SelectedMachineJob != null)
+ {
+ using (_notification.PushTaskItem("Loading job details..."))
+ {
+ LogManager.Log(String.Format("Loading job {0}...", SelectedMachineJob.Name));
+ SelectedSegments = new ObservableCollection<Segment>();
+ SelectedBrushStops = new ObservableCollection<BrushStop>();
+ SelectedRML = null;
+ SelectedSegment = null;
+ SelectedGroupHistory = null;
+ SelectedBrushStop = null;
+ SelectedProcessParametersTable = null;
+ RmlProcessParametersTableGroup = null;
+
+
+ _blockInvalidateCommands = false;
+
+ LogManager.Log("Creating active job DB context...");
+ _activeJobDbContext = ObservablesContext.CreateDefault();
+ _activeJobDbContext.Configuration.LazyLoadingEnabled = true;
+
+ LogManager.Log("Initializing available color spaces, RMLs & Winding methods...");
+ ColorSpaces = _activeJobDbContext.ColorSpaces.ToObservableCollection();
+ Rmls = _activeJobDbContext.Rmls.ToObservableCollection();
+ WindingMethods = _activeJobDbContext.WindingMethods.ToObservableCollection();
+
+ LogManager.Log("Setting active job...");
+ _activeJob = _activeJobDbContext.Jobs.SingleOrDefault(x => x.Guid == SelectedMachineJob.Guid);
+
+ _selectedRML = ActiveJob.Rml;
+
+ LogManager.Log("Setting selected segment...");
+ _selectedSegment = ActiveJob.Segments.FirstOrDefault();
+
+ ActiveJob.LengthChanged -= ActiveJob_LengthChanged;
+ ActiveJob.LengthChanged += ActiveJob_LengthChanged;
+
+ ActiveJob = _activeJob;
+
+ SelectedRML = _selectedRML;
+ SelectedSegment = _selectedSegment;
+
+ UpdateEstimatedDuration();
+
+ _blockInvalidateCommands = false;
+ InvalidateRelayCommands();
+
+ _navigation.NavigateTo(DeveloperNavigationView.JobView);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Saves the active job.
+ /// </summary>
+ private async void SaveActiveJob()
+ {
+ if (ActiveJob != null)
+ {
+ using (_notification.PushTaskItem("Saving job details..."))
+ {
+ LogManager.Log(String.Format("Saving the active job {0}...", ActiveJob.Name));
+ ActiveJob.LastUpdated = DateTime.UtcNow;
+ ActiveJob.Rml = SelectedRML;
+
+ await ActiveJob.SaveAsync(_activeJobDbContext);
+ ReloadMachine();
+ SelectedMachineJob = SelectedMachine.Jobs.SingleOrDefault(x => x.Guid == ActiveJob.Guid);
+ }
+ }
+ }
+
+ private void BackToJobs()
+ {
+ LogManager.Log("User request for 'back to jobs'...");
+ LogManager.Log("Comparing active job with selected job...");
+
+ bool jobModified = !ActiveJob.CompareUsingJson(SelectedMachineJob);
+
+ if (jobModified)
+ {
+ LogManager.Log("Selected job has been modified. Invoking confirmation dialog...");
+ if (_notification.ShowQuestion("This will discard the current job changes. Are you sure?"))
+ {
+ LogManager.Log("Disposing active job db context...");
+ _activeJobDbContext.Dispose();
+ _navigation.NavigateTo(DeveloperNavigationView.MachineJobSelectionView);
+ }
+ }
+ else
+ {
+ LogManager.Log("Disposing active job db context...");
+ _activeJobDbContext.Dispose();
+ _navigation.NavigateTo(DeveloperNavigationView.MachineJobSelectionView);
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void ReloadMachine()
+ {
+ LogManager.Log("Reloading selected machine...");
+ _machineDbContext.Dispose();
+ _machineDbContext = ObservablesContext.CreateDefault();
+ _machineDbContext.Configuration.LazyLoadingEnabled = true;
+ String machineGuid = _selectedMachine.Guid;
+ Machines = _machineDbContext.Machines.ToObservableCollection();
+ _selectedMachine = Machines.SingleOrDefault(x => x.Guid == machineGuid);
+ RaisePropertyChanged(nameof(SelectedMachine));
+
+ JobsCollectionView = CollectionViewSource.GetDefaultView(SelectedMachine.Jobs);
+ JobsCollectionView.SortDescriptions.Add(new SortDescription(nameof(Job.LastUpdated), ListSortDirection.Descending));
+ }
+
+ private void UpdateEstimatedDuration()
+ {
+ if (ActiveJob != null && SelectedProcessParametersTable != null && SelectedProcessParametersTable.DyeingSpeed > 0)
+ {
+ EstimatedDuration = TimeSpan.FromSeconds(ActiveJob.Length / (SelectedProcessParametersTable.DyeingSpeed / 100d));
+ }
+ }
+
+ private void SetSegmentBrushStopsLiquidVolumes(Segment segment)
+ {
+ if (!DesignMode && segment != null)
+ {
+ LogManager.Log("Setting segment brush stops liquid volumes...");
+ foreach (var stop in segment.BrushStops)
+ {
+ stop.SetLiquidVolumes(SelectedMachine.Configuration, SelectedRML, SelectedProcessParametersTable);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Navigates to the Machine Designer Module in order to edit the selected machine.
+ /// </summary>
+ private void EditMachine()
+ {
+ LogManager.Log(String.Format("Requesting machine designer module for machine {0} editing...", SelectedMachine.SerialNumber));
+ ApplicationManager.RequestModule("Machine Designer", SelectedMachine);
+ }
+
+ #endregion
+
+ #region Add / Remove / Duplicate Jobs, Segments & Brush Stops
+
+ /// <summary>
+ /// Arranges the segments indices.
+ /// </summary>
+ private void ArrangeSegmentsIndices()
+ {
+ int index = 1;
+
+ foreach (var segment in ActiveJob.Segments.OrderBy(x => x.SegmentIndex))
+ {
+ segment.SegmentIndex = index++;
+ }
+
+ SegmentsCollectionView.Refresh();
+ }
+
+ /// <summary>
+ /// Arranges the brush stops indices.
+ /// </summary>
+ private void ArrangeBrushStopsIndices()
+ {
+ int index = 0;
+
+ foreach (var stop in SelectedSegment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stop.SetStopIndex(index++);
+ }
+
+ if (SelectedSegment.BrushStops.Count > 1)
+ {
+ SelectedSegment.BrushStops.OrderBy(x => x.StopIndex).First().OffsetPercent = 0;
+ SelectedSegment.BrushStops.OrderBy(x => x.StopIndex).Last().OffsetPercent = 100;
+ }
+
+ foreach (var stop in SelectedSegment.BrushStops.OrderBy(x => x.StopIndex))
+ {
+ stop.RaiseStopIndex();
+ stop.RaiseOffsetChanged();
+ }
+
+ BrushStopsCollectionView.Refresh();
+ }
+
+ /// <summary>
+ /// Removes the selected segments.
+ /// </summary>
+ private void RemoveSelectedSegments()
+ {
+ if (ActiveJob != null && SelectedSegment != null)
+ {
+ if (_notification.ShowQuestion("Are you sure you want to delete the selected segments?"))
+ {
+ LogManager.Log(String.Format("Removing {0} segments...", SelectedSegments.Count));
+
+ SelectedSegments.ToList().ForEach(x =>
+ {
+ ActiveJob.Segments.Remove(x);
+ x.DefferedDelete(_activeJobDbContext);
+ });
+
+ ArrangeSegmentsIndices();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Adds a new segment.
+ /// </summary>
+ private void AddSegment()
+ {
+ if (ActiveJob != null)
+ {
+ LogManager.LogFormat("Adding new segment to job {0}...", ActiveJob.Name);
+ Segment seg = new Segment();
+ seg.Name = "Untitled Segment";
+ seg.Length = 10;
+
+ if (ActiveJob.Segments.Count > 0)
+ {
+ seg.SegmentIndex = ActiveJob.Segments.Max(x => x.SegmentIndex) + 1;
+ }
+ else
+ {
+ seg.SegmentIndex = 1;
+ }
+ ActiveJob.Segments.Add(seg);
+ SelectedSegment = seg;
+ AddBrushStop();
+ ArrangeSegmentsIndices();
+ }
+ }
+
+ /// <summary>
+ /// Removes the selected jobs.
+ /// </summary>
+ private async void RemoveSelectedJobs()
+ {
+ if (SelectedMachine != null && SelectedMachineJob != null)
+ {
+ if (_notification.ShowQuestion("Are you sure you want to delete the selected jobs?"))
+ {
+ LogManager.Log(String.Format("Removing {0} jobs...", SelectedJobs.Count));
+ SelectedJobs.ToList().ForEach(x =>
+ {
+ SelectedMachine.Jobs.Remove(x);
+ x.DefferedDelete(_machineDbContext);
+ });
+
+ using (_notification.PushTaskItem("Removing selected jobs..."))
+ {
+ LogManager.Log("Saving selected machine to database...");
+ await SelectedMachine.SaveAsync(_machineDbContext);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Adds a new job to the selected machine.
+ /// </summary>
+ private async void AddJob()
+ {
+ if (SelectedMachine != null)
+ {
+ String jobName = _notification.ShowTextInput("Please provide a job name", "Name");
+
+ if (!String.IsNullOrWhiteSpace(jobName))
+ {
+ LogManager.Log(String.Format("Adding new job {0}...", jobName));
+
+ Job newJob = new Job();
+ newJob.Name = jobName;
+ newJob.CreationDate = DateTime.UtcNow;
+ newJob.User = _authentication.CurrentUser;
+ newJob.Rml = _machineDbContext.Rmls.FirstOrDefault();
+ newJob.WindingMethod = _machineDbContext.WindingMethods.FirstOrDefault();
+ newJob.Machine = SelectedMachine;
+
+ SelectedMachine.Jobs.Add(newJob);
+ LogManager.Log("Saving selected machine to database...");
+ await SelectedMachine.SaveAsync(_machineDbContext);
+ SelectedMachineJob = newJob;
+ LoadSelectedJob();
+ AddSegment();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Removes the selected brush stop.
+ /// </summary>
+ private void RemoveSelectedBrushStops()
+ {
+ if (SelectedBrushStop != null && SelectedSegment != null)
+ {
+ if (_notification.ShowQuestion("Are you sure you want to delete the selected colors?"))
+ {
+ LogManager.Log(String.Format("Removing {0} brush stops...", SelectedBrushStops.Count));
+
+ SelectedBrushStops.ToList().ForEach(x =>
+ {
+ SelectedSegment.BrushStops.Remove(x);
+ x.DefferedDelete(_activeJobDbContext);
+ });
+
+ ArrangeBrushStopsIndices();
+ }
+ }
+ }
+
+ /// <summary>
+ /// Adds a new brush stop to the selected segment.
+ /// </summary>
+ private void AddBrushStop()
+ {
+ if (SelectedSegment != null)
+ {
+ LogManager.LogFormat("Adding new brush stop to segment...", SelectedSegment.SegmentIndex.ToString());
+
+ var stop = new BrushStop();
+
+ if (SelectedSegment.BrushStops.Count > 0)
+ {
+ stop.StopIndex = SelectedSegment.BrushStops.Max(x => x.StopIndex) + 1;
+ }
+ else
+ {
+ stop.StopIndex = 0;
+ }
+
+ stop.OffsetPercent = 100;
+ stop.Segment = SelectedSegment;
+ stop.ColorSpace = _activeJobDbContext.ColorSpaces.FirstOrDefault();
+ stop.Color = Colors.Black;
+ stop.SetLiquidVolumes(SelectedMachine.Configuration, SelectedRML, SelectedProcessParametersTable);
+ SelectedSegment.BrushStops.Add(stop);
+ SelectedSegment.BrushStops.ToList().ForEach(x => x.RaiseOffsetChanged());
+ ArrangeBrushStopsIndices();
+ }
+ }
+
+ /// <summary>
+ /// Duplicates the selected brush stops.
+ /// </summary>
+ private void DuplicateSelectedBrushStops()
+ {
+ LogManager.LogFormat("Duplicating {0} brush stops...", SelectedBrushStops.Count);
+
+ foreach (var stop in SelectedBrushStops.OrderBy(x => x.StopIndex))
+ {
+ var cloned = stop.Clone();
+ cloned.StopIndex = SelectedSegment.BrushStops.Max(x => x.StopIndex) + 1;
+ SelectedSegment.BrushStops.Add(cloned);
+ }
+
+ ArrangeBrushStopsIndices();
+ }
+
+ /// <summary>
+ /// Duplicates the selected segments.
+ /// </summary>
+ private void DuplicateSelectedSegments()
+ {
+ LogManager.LogFormat("Duplicating {0} segments...", SelectedSegments.Count);
+
+ foreach (var segment in SelectedSegments.OrderBy(x => x.SegmentIndex))
+ {
+ var cloned = segment.Clone();
+ cloned.SegmentIndex = ActiveJob.Segments.Max(x => x.SegmentIndex) + 1;
+ ActiveJob.Segments.Add(cloned);
+ }
+
+ ArrangeSegmentsIndices();
+ }
+
+ /// <summary>
+ /// Duplicates the selected jobs.
+ /// </summary>
+ private async void DuplicateSelectedJobs()
+ {
+ if (SelectedMachineJob != null)
+ {
+ using (_notification.PushTaskItem("Cloning selected jobs..."))
+ {
+ LogManager.LogFormat("Duplicating {0} jobs...", SelectedJobs.Count);
+
+ int index = SelectedMachine.Jobs.Max(x => x.JobIndex);
+
+ foreach (var job in SelectedJobs)
+ {
+ var cloned = job.Clone();
+ cloned.JobIndex = ++index;
+ SelectedMachine.Jobs.Add(cloned);
+ }
+
+ LogManager.Log("Saving selected machine to database...");
+ await SelectedMachine.SaveAsync(_machineDbContext);
+ }
+ }
+ }
+
+ #endregion
+
+ #region Override Methods
+
+ protected override void RaisePropertyChangedAuto([CallerMemberName] string caller = null)
+ {
+ base.RaisePropertyChangedAuto(caller);
+
+ if (!_blockInvalidateCommands)
+ {
+ InvalidateRelayCommands();
+ }
+ }
+
+ #endregion
+
+ #region IShutdownRequestBlocker
+
+ public Task<bool> OnShutdownRequest()
+ {
+ if (IsJobRunning)
+ {
+ InvokeUI(() =>
+ {
+ _notification.ShowWarning("Please stop the currently running job before closing the developer module.");
+ });
+
+ return Task.FromResult(false);
+ }
+
+ return Task.FromResult(true);
+ }
+
+ #endregion
+
+ #region IShutdownListener
+
+ public void OnShuttingDown()
+ {
+ SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedMachineGuid = SelectedMachine != null ? SelectedMachine.Guid : null;
+ SettingsManager.Default.MachineStudio.DeveloperModule.LastSelectedJobGuid = SelectedMachineJob != null ? SelectedMachineJob.Guid : null;
+ }
+
+ #endregion
+
+ #region IMainView
+
+ protected override void OnViewAttached()
+ {
+ base.OnViewAttached();
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/IMainView.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/IMainView.cs
new file mode 100644
index 000000000..17a59a761
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/IMainView.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.Developer.Views
+{
+ public interface IMainView : IView
+ {
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml
new file mode 100644
index 000000000..4467b1f28
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml
@@ -0,0 +1,1380 @@
+<UserControl x:Class="Tango.MachineStudio.Developer.Views.JobView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Developer"
+ xmlns:dragAndDrop="clr-namespace:Tango.DragAndDrop;assembly=Tango.DragAndDrop"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
+ xmlns:techViews="clr-namespace:Tango.MachineStudio.Technician.Views;assembly=Tango.MachineStudio.Technician"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:printing="clr-namespace:Tango.Integration.Printing;assembly=Tango.Integration"
+ xmlns:dispensing="clr-namespace:Tango.Integration.Dispensing;assembly=Tango.Integration"
+ xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+ xmlns:db="clr-namespace:Tango.MachineStudio.DB.Views.DBViews;assembly=Tango.MachineStudio.DB"
+ xmlns:commonControls="clr-namespace:Tango.MachineStudio.Common.Controls;assembly=Tango.MachineStudio.Common"
+ xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
+ xmlns:designer="clr-namespace:Tango.MachineStudio.MachineDesigner.Views;assembly=Tango.MachineStudio.MachineDesigner"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Developer.ViewModels"
+ xmlns:localConverters="clr-namespace:Tango.MachineStudio.Developer.Converters"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:observables="clr-namespace:Tango.Integration.Observables;assembly=Tango.Integration"
+ xmlns:editors="clr-namespace:Tango.SharedUI.Editors;assembly=Tango.SharedUI"
+ xmlns:video="clr-namespace:Tango.Video.DirectCapture;assembly=Tango.Video"
+ xmlns:shapes="clr-namespace:Tango.SharedUI.Shapes;assembly=Tango.SharedUI"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Developer.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+
+ <UserControl.Resources>
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+
+ <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
+ <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
+ <converters:ColorToIntegerConverter x:Key="ColorToIntegerConverter"></converters:ColorToIntegerConverter>
+ <converters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+ <converters:NullObjectToBooleanConverter x:Key="NullObjectToBooleanConverter"></converters:NullObjectToBooleanConverter>
+ <converters:GreaterThanToBooleanConverter x:Key="GreaterThanToBooleanConverter"></converters:GreaterThanToBooleanConverter>
+ <converters:SmallerThanToBooleanConverter x:Key="SmallerThanToBooleanConverter"></converters:SmallerThanToBooleanConverter>
+ <localConverters:BrushStopToColorConverter x:Key="BrushStopToColorConverter" />
+ <localConverters:BrushStopCMYKToColorConverter x:Key="BrushStopCMYKToColorConverter" />
+ <localConverters:BrushStopLabToColorConverter x:Key="BrushStopLabToColorConverter" />
+ <localConverters:SegmentToGradientStopsConverter x:Key="SegmentToGradientStopsConverter" />
+ <localConverters:BrushStopToOffsetLimitConverter x:Key="BrushStopToOffsetLimitConverter" />
+ <localConverters:JobToColumnDefinitionsConverter x:Key="JobToColumnDefinitionsConverter" />
+ <localConverters:SegmentLengthToWidthConverter x:Key="SegmentLengthToWidthConverter" />
+ <localConverters:SegmentToGradientStopsConverterMulti x:Key="SegmentToGradientStopsConverterMulti" />
+ <localConverters:SegmentToBrushConverter x:Key="SegmentToBrushConverter" />
+ <localConverters:SegmentToBrushConverterMulti x:Key="SegmentToBrushConverterMulti" />
+ <localConverters:ObjectsNotEqualToBooleanConveter x:Key="ObjectsNotEqualToBooleanConveter" />
+ <localConverters:JobProgressToPositionConverter x:Key="JobProgressToPositionConverter" />
+ <localConverters:BrushStopToOffsetValueConverter x:Key="BrushStopToOffsetValueConverter" />
+ <converters:StringEllipsisConverter x:Key="StringEllipsisConverter" />
+ <converters:NumberToFileSizeConverter x:Key="NumberToFileSizeConverter"/>
+ <localConverters:OneToPercentConverter x:Key="OneToPercentConverter"/>
+ <converters:EnumToItemsSourceConverter x:Key="EnumToItemsSourceConverter" />
+ <converters:EnumToDescriptionConverter x:Key="EnumToDescriptionConverter" />
+
+
+ <ObjectDataProvider x:Key="dispenserDivisions" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
+ <ObjectDataProvider.MethodParameters>
+ <x:Type TypeName="dispensing:DispenserStepDivisions"/>
+ </ObjectDataProvider.MethodParameters>
+ </ObjectDataProvider>
+
+
+ <SolidColorBrush x:Key="SideBarBackground" Color="White">
+
+ </SolidColorBrush>
+
+ <Color x:Key="dummyColor">Transparent</Color>
+
+ <Style x:Key="brushStopBorder" TargetType="Border">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Droppable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Draggable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.DraggingSurface" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}"></Setter>
+ <Style.Triggers>
+ <Trigger Property="dragAndDrop:DragAndDropService.IsDraggableOver" Value="True">
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ <Trigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.EnterActions>
+ <Trigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.ExitActions>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+
+ <Style TargetType="Border" x:Key="JobFieldBorder">
+ <Setter Property="BorderBrush" Value="#A5A4A4"></Setter>
+ <Setter Property="BorderThickness" Value="0 0 1 1"></Setter>
+ <Setter Property="CornerRadius" Value="100 10 100 0"></Setter>
+ <Setter Property="Padding" Value="10 5 10 5"></Setter>
+ <Setter Property="Margin" Value="0 0 10 0"></Setter>
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
+ <GradientStop Color="#00E6E6E6"/>
+ <GradientStop Color="#DEDEDE" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style TargetType="ContentControl" x:Key="colorPicker">
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate>
+ <Grid>
+ <ToggleButton Cursor="Hand" x:Name="PopupButton" BorderThickness="0" Height="30" Background="Transparent" Foreground="{StaticResource AccentColorBrush}" VerticalAlignment="Center" Margin="30 0 0 0" IsChecked="{Binding ElementName=Popup, Path=IsOpen}">
+ <ToggleButton.Style>
+ <Style TargetType="ToggleButton" BasedOn="{StaticResource emptyToggleButton}">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsOpen, ElementName=Popup}" Value="True">
+ <Setter Property="IsEnabled" Value="False" />
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ToggleButton.Style>
+
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="Pencil" Width="32" Height="32">
+ <materialDesign:PackIcon.Foreground>
+ <SolidColorBrush Color="{Binding Color}"></SolidColorBrush>
+ </materialDesign:PackIcon.Foreground>
+ </materialDesign:PackIcon>
+ <TextBlock Margin="5 0 0 0" FontSize="14" VerticalAlignment="Center">SELECT COLOR</TextBlock>
+ </StackPanel>
+ </ToggleButton>
+ <Popup x:Name="Popup" MouseDown="Popup_MouseDown" PopupAnimation="Fade" StaysOpen="False" PlacementTarget="{Binding ElementName=PopupButton}" Placement="Bottom" AllowsTransparency="True">
+ <Border Background="#E6FFFFFF" Height="250" Width="500" CornerRadius="5" Margin="10">
+ <Border.Effect>
+ <DropShadowEffect ShadowDepth="0" BlurRadius="10" />
+ </Border.Effect>
+ <Grid>
+ <Grid Margin="10">
+ <commonControls:HiveColorPickerControl SelectedColorChanged="HiveColorPickerControl_SelectedColorChanged" SelectedColor="{Binding Color,Mode=TwoWay}" DemoMode="True" />
+ </Grid>
+ </Grid>
+ </Border>
+ </Popup>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid Grid.Row="1">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="1*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Margin="0 10 10 0" Grid.Column="2">
+ <Grid Grid.Row="1">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="1*" />
+ </Grid.ColumnDefinitions>
+
+ <Grid Background="#96FFFFFF">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="Width" Value="304"></Setter>
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleY="1" ScaleX="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsSideBarOpened}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX" To="0" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX" To="1" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <DockPanel>
+ <Border DockPanel.Dock="Bottom" Margin="10">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Command="{Binding DuplicateSegmentCommand}" Margin="0 0 4 0" Background="#FF9A6A" BorderBrush="#FF9A6A" Height="42" Padding="10" ToolTip="Duplicate Segment">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="ContentCopy" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">Duplicate</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Command="{Binding RemoveSegmentCommand}" Margin="0 0 4 0" Background="#FF6A6A" BorderBrush="#FF6A6A" Height="42" Padding="10" ToolTip="Remove Segment">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Delete" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">Remove</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Command="{Binding AddSegmentCommand}" Background="#68B367" BorderBrush="#68B367" Height="42" Padding="10" ToolTip="Add Segment">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Plus" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">New</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Border>
+
+ <controls:MultiSelectListBox Style="{StaticResource {x:Type ListBox}}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged" ItemsSource="{Binding SegmentsCollectionView}" SelectedItem="{Binding SelectedSegment}" SelectedItemsList="{Binding SelectedSegments,Mode=TwoWay}" HorizontalContentAlignment="Stretch">
+ <ListBox.ItemContainerStyle>
+ <Style TargetType="ListBoxItem" BasedOn="{StaticResource basicListBoxItem}">
+
+ </Style>
+ </ListBox.ItemContainerStyle>
+ <ListBox.ItemTemplate>
+ <DataTemplate>
+ <Grid Margin="5 10" Style="{StaticResource draggableDroppableGrid}" dragAndDrop:DragAndDropService.Drop="OnSegmentDrop">
+ <Polygon Points="40,0 290,0 290,100 0,100 0,30" StrokeThickness="0.2" IsHitTestVisible="False">
+ <Polygon.Effect>
+ <DropShadowEffect Opacity="0.5" />
+ </Polygon.Effect>
+ <Polygon.Style>
+ <Style TargetType="Polygon">
+ <Setter Property="Stroke" Value="Black"></Setter>
+ <Setter Property="Fill">
+ <Setter.Value>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop Color="#00EEEEEE" Offset="0" />
+ <GradientStop Color="#FFB5B5B5" Offset="1" />
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected,FallbackValue=False}" Value="True">
+ <Setter Property="Stroke" Value="Black"></Setter>
+ <Setter Property="Fill">
+ <Setter.Value>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop Color="White" Offset="0" />
+ <GradientStop Color="{StaticResource AccentColor}" Offset="2" />
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Polygon.Style>
+ </Polygon>
+ <Border Height="100" Padding="5" IsHitTestVisible="False">
+ <Grid>
+ <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" FontStyle="Italic">
+ <Run>#</Run>
+ <Run>SEGMENT</Run>
+ <Run Text="{Binding SegmentIndex}"></Run>
+ </TextBlock>
+ <Rectangle VerticalAlignment="Bottom" Height="8">
+ <Rectangle.Fill>
+ <MultiBinding Converter="{StaticResource SegmentToBrushConverterMulti}">
+ <Binding Path="."></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob.Length"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.SelectedBrushStop.Color"></Binding>
+ </MultiBinding>
+ </Rectangle.Fill>
+ </Rectangle>
+ </Grid>
+ </Border>
+
+ </Grid>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </controls:MultiSelectListBox>
+ </DockPanel>
+
+ <Rectangle HorizontalAlignment="Right" StrokeThickness="1" Width="3" Margin="0 0 0 0">
+ <Rectangle.Fill>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop Offset="0" Color="#ECECEC" />
+ <GradientStop Offset="0.5" Color="Black" />
+ <GradientStop Offset="1.1" Color="Black" />
+ </LinearGradientBrush>
+ </Rectangle.Fill>
+ <Rectangle.Stroke>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop Offset="0" Color="White" />
+ <GradientStop Offset="0.5" Color="White" />
+ <GradientStop Offset="1" Color="White" />
+ </LinearGradientBrush>
+ </Rectangle.Stroke>
+ </Rectangle>
+ </Grid>
+
+ <Grid Grid.Column="1">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <StackPanel>
+ <Grid>
+ <StackPanel Orientation="Horizontal" Margin="10">
+ <Image Source="../Images/rgb.png" Width="24"></Image>
+ <TextBlock Margin="5 0 0 0" Text="{Binding ActiveJob.Name,FallbackValue='UNSET'}" FontSize="16" FontWeight="SemiBold" VerticalAlignment="Center"></TextBlock>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" Margin="0 5 0 0" HorizontalAlignment="Right">
+ <TextBlock Margin="0 0 5 0" Text="{Binding ActiveJob.CreationDate,FallbackValue='UNSET'}" FontSize="12" Foreground="Gray" FontStyle="Italic" VerticalAlignment="Center"></TextBlock>
+ <Image Source="../Images/calendar.png" Width="16"></Image>
+ </StackPanel>
+ </Grid>
+
+ <StackPanel Orientation="Horizontal" Margin="10 20 0 0" MaxWidth="1000" HorizontalAlignment="Left">
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/name.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Name</TextBlock>
+ </StackPanel>
+ <TextBox Margin="0 3 0 0" Width="100" HorizontalAlignment="Left" Text="{Binding ActiveJob.Name,UpdateSourceTrigger=PropertyChanged}"></TextBox>
+ </StackPanel>
+ </Border>
+
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="10 5 5 5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/wind.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Winding Method</TextBlock>
+ </StackPanel>
+ <ComboBox Width="90" HorizontalAlignment="Left" ItemsSource="{Binding WindingMethods}" SelectedItem="{Binding ActiveJob.WindingMethod}" DisplayMemberPath="Name" ></ComboBox>
+ </StackPanel>
+ </Border>
+
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="20 5 5 5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/inter-segment.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Inter Segment</TextBlock>
+ </StackPanel>
+ <DockPanel LastChildFill="True">
+ <ToggleButton Margin="10 0 25 0" DockPanel.Dock="Right" VerticalAlignment="Bottom" HorizontalAlignment="Right" IsChecked="{Binding ActiveJob.EnableInterSegment}"></ToggleButton>
+ <mahapps:NumericUpDown Width="70" HorizontalAlignment="Left" StringFormat="{}{0:N1} m" FontFamily="{StaticResource digital-7}" IsEnabled="{Binding ActiveJob.EnableInterSegment}" Margin="0 2 0 0" HideUpDownButtons="True" Minimum="0" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0 0 0 1" BorderBrush="DimGray" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding ActiveJob.InterSegmentLength,Mode=TwoWay}"></mahapps:NumericUpDown>
+ </DockPanel>
+ </StackPanel>
+ </Border>
+
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="20 5 5 5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/lubrication.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Lubrication</TextBlock>
+ </StackPanel>
+ <DockPanel LastChildFill="True" Margin="0 10 30 0">
+ <ToggleButton DockPanel.Dock="Right" VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding ActiveJob.EnableLubrication}"></ToggleButton>
+ </DockPanel>
+ </StackPanel>
+ </Border>
+
+ <Border Style="{StaticResource JobFieldBorder}" Height="90" Width="200">
+ <StackPanel Width="200">
+ <StackPanel Orientation="Horizontal" Margin="10 0 0 0">
+ <Image Source="../Images/description.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Description</TextBlock>
+ </StackPanel>
+
+ <Border BorderThickness="0" BorderBrush="Silver" CornerRadius="5" Margin="0 0 5 5">
+ <TextBox Padding="5 0 0 0" FontStyle="Italic" Background="Transparent" Style="{x:Null}" BorderThickness="0" Margin="5" Height="40" Text="{Binding ActiveJob.Description}" VerticalAlignment="Stretch" materialDesign:HintAssist.Hint="Enter description" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto"></TextBox>
+ </Border>
+ </StackPanel>
+ </Border>
+ </StackPanel>
+
+
+ </StackPanel>
+
+ <Grid HorizontalAlignment="Right" Margin="0 0 10 0">
+ <StackPanel Orientation="Horizontal">
+ <Button Height="70" Width="135" Margin="0 0 10 0" Background="White" Foreground="#202020" VerticalAlignment="Bottom" BorderBrush="Transparent" Command="{Binding DiscardJobCommand}">
+ <StackPanel>
+ <materialDesign:PackIcon HorizontalAlignment="Center" Width="24" Height="24" Kind="KeyboardBackspace" />
+ <TextBlock VerticalAlignment="Center" Margin="0 10 0 0">TO JOBS</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Height="70" Width="135" Margin="0 0 0 0" Background="White" Foreground="#202020" VerticalAlignment="Bottom" BorderBrush="Transparent" Command="{Binding SaveJobCommand}">
+ <StackPanel>
+ <materialDesign:PackIcon HorizontalAlignment="Center" Width="24" Height="24" Kind="ContentSave" />
+ <TextBlock VerticalAlignment="Center" Margin="0 10 0 0">SAVE JOB</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ <Grid Grid.Row="1" Margin="0 20 0 0">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Grid>
+
+ <Grid Grid.Column="1" Margin="10 5 0 0">
+ <DockPanel>
+ <Grid Margin="0 10 0 0">
+ <DockPanel>
+ <Grid DockPanel.Dock="Top">
+ <Grid>
+ <StackPanel Orientation="Horizontal">
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/ruler.png" Width="32"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Length</TextBlock>
+ </StackPanel>
+ <mahapps:NumericUpDown HideUpDownButtons="True" Width="90" HorizontalAlignment="Left" FontFamily="{StaticResource digital-7}" StringFormat="{}{0:N1} m" Margin="0 2 0 0" Minimum="1" Maximum="10000" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0 0 0 1" BorderBrush="DimGray" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Left" Value="{Binding SelectedSegment.Length,Mode=TwoWay}"></mahapps:NumericUpDown>
+ </StackPanel>
+ </Border>
+
+ <Grid Margin="0 0 0 0">
+ <StackPanel>
+ <TextBlock>MEDIA</TextBlock>
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <ComboBox Width="200" ItemsSource="{Binding Rmls}" SelectedItem="{Binding SelectedRML}">
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel>
+ <TextBlock Text="{Binding Name}" FontWeight="Bold" FontStyle="Italic"></TextBlock>
+ <TextBlock FontSize="11" Text="{Binding Manufacturer}" Foreground="Gray"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+
+ <Button Margin="20 30 0 0" Command="{Binding EditRMLCommand}" HorizontalAlignment="Right" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="Pencil"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">EDIT MEDIA</TextBlock>
+ </StackPanel>
+ </Button>
+
+
+
+
+ </StackPanel>
+ </StackPanel>
+
+
+ </Grid>
+
+
+ </StackPanel>
+
+ <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Orientation="Horizontal" Margin="0 40 40 0">
+ <materialDesign:PackIcon Kind="ChevronLeft" Width="24" Height="24" />
+ <TextBlock Margin="10 -2 10 0" VerticalAlignment="Center"><Run>RML LIQUID FACTORS</Run> <Run FontSize="10" Foreground="DimGray">( Max Nanolitter/CM )</Run></TextBlock>
+ <materialDesign:PackIcon Kind="ChevronRight" Width="24" Height="24" />
+ </StackPanel>
+
+ <Grid HorizontalAlignment="Right" Margin="0 0 0 0">
+ <Grid>
+ <DockPanel>
+ <Grid>
+ <StackPanel HorizontalAlignment="Right" Margin="0 0 0 0">
+ <StackPanel Margin="0 10 0 0" Orientation="Horizontal" VerticalAlignment="Center">
+ <ItemsControl ItemsSource="{Binding LiquidTypesRmls}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel IsItemsHost="True"></WrapPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate DataType="{x:Type observables:LiquidTypesRml}">
+ <StackPanel Margin="0 0 10 0">
+ <TextBlock HorizontalAlignment="Center" FontSize="10" Foreground="DimGray" Text="{Binding LiquidType.Name}"></TextBlock>
+ <Grid Width="58" Height="48" Margin="0 5 0 0">
+ <shapes:Hexagon StrokeThickness="1" Stroke="Gray">
+ <shapes:Hexagon.Fill>
+ <LinearGradientBrush Opacity="0.7" >
+ <GradientStop Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ <GradientStop Color="White" Offset="1"/>
+ </LinearGradientBrush>
+ </shapes:Hexagon.Fill>
+ </shapes:Hexagon>
+
+ <TextBox Style="{x:Null}" Background="Transparent" Foreground="Black" BorderThickness="0" Text="{Binding MaxNlPerCm}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontWeight="Bold" FontStyle="Italic"></TextBox>
+ </Grid>
+ </StackPanel>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+
+ <Button Command="{Binding SaveLiquidFactorsCommand}" HorizontalAlignment="Right" Margin="0 20 0 0" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="Harddisk"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">SAVE FACTORS</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </StackPanel>
+
+
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+
+ <Border DockPanel.Dock="Bottom" Margin="10">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Command="{Binding DuplicateBrushStopCommand}" Margin="0 0 4 0" Background="#FF9A6A" BorderBrush="#FF9A6A" Height="42" Padding="10">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="ContentCopy" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">Duplicate</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Command="{Binding RemoveBrushStopCommand}" Margin="0 0 4 0" Background="#FF6A6A" BorderBrush="#FF6A6A" Height="42" Padding="10">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Delete" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">Remove</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Command="{Binding AddBrushStopCommand}" Background="#68B367" BorderBrush="#68B367" Height="42" Padding="10">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Plus" Width="24" Height="24"></materialDesign:PackIcon>
+ <TextBlock VerticalAlignment="Center">New</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Border>
+
+ <Grid Margin="0 40 0 0">
+ <DockPanel>
+ <Grid DockPanel.Dock="Top">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
+ <Image Source="../Images/color-palette.png" Width="42"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0" Foreground="DimGray" FontSize="16" FontWeight="SemiBold">SEGMENT BRUSH</TextBlock>
+ </StackPanel>
+
+ <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Center" Height="15" Margin="200 0 10 0" StrokeThickness="1" Stroke="Gainsboro">
+ <Rectangle.Fill>
+ <LinearGradientBrush StartPoint="0,0" EndPoint="1,0" x:Name="gradientBrush"></LinearGradientBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+ </Grid>
+ <Grid Margin="0 10 10 0">
+ <controls:MultiSelectListBox SelectionMode="Extended" Style="{x:Null}" Background="Transparent" ScrollViewer.CanContentScroll="False" BorderThickness="0" ItemsSource="{Binding BrushStopsCollectionView}" SelectedItem="{Binding SelectedBrushStop}" SelectedItemsList="{Binding SelectedBrushStops,Mode=TwoWay}" HorizontalContentAlignment="Stretch">
+ <ListBox.ItemContainerStyle>
+ <Style TargetType="ListBoxItem" BasedOn="{StaticResource basicListBoxItem}">
+
+ </Style>
+ </ListBox.ItemContainerStyle>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate DataType="{x:Type observables:BrushStop}">
+
+ <StackPanel Margin="0 0 0 5">
+ <Border BorderThickness="1" CornerRadius="5" Padding="10" dragAndDrop:DragAndDropService.Drop="OnBrushStopBorderDrop">
+ <Border.Style>
+ <Style TargetType="Border" BasedOn="{StaticResource brushStopBorder}">
+ <Setter Property="BorderBrush" Value="#B5B5B5"></Setter>
+ <Setter Property="Background" Value="#70FFFFFF"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected,FallbackValue=False}" Value="True">
+ <Setter Property="BorderBrush" Value="Gainsboro"></Setter>
+ <Setter Property="Background" Value="{StaticResource SideBarBackground}"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+ <Grid>
+ <DockPanel>
+ <ContentControl DockPanel.Dock="Left">
+ <ContentControl.Style>
+ <Style TargetType="ContentControl">
+ <Setter Property="Content">
+ <Setter.Value>
+ <Rectangle/>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ColorSpace.Name}" Value="Volume">
+ <Setter Property="Content">
+ <Setter.Value>
+ <StackPanel VerticalAlignment="Center">
+ <ItemsControl ItemsSource="{Binding LiquidVolumes}" VerticalAlignment="Center">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel VerticalAlignment="Center" Orientation="Horizontal" IsItemsHost="True"></StackPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <ContentControl Style="{StaticResource numberBorder}" Width="60" Height="60" Margin="10 0 0 0">
+ <ContentControl.Foreground>
+ <SolidColorBrush Color="{Binding IdsPack.LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"></SolidColorBrush>
+ </ContentControl.Foreground>
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Volume, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0.0" HideUpDownButtons="True" Minimum="0" Maximum="1000" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </StackPanel>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding ColorSpace.Name}" Value="RGB">
+ <Setter Property="Content">
+ <Setter.Value>
+ <StackPanel Orientation="Horizontal">
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="#FF6F6F" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Red, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="255" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="#92FF92" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Green, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="255" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="#3C7EF4" BorderThickness="1" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Blue, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="255" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="False" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource colorPicker}"></ContentControl>
+ </StackPanel>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding ColorSpace.Name}" Value="CMYK">
+ <Setter Property="Content">
+ <Setter.Value>
+ <StackPanel Orientation="Horizontal">
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="Cyan" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Cyan,Converter={StaticResource OneToPercentConverter}, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="100" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="Magenta" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Magenta,Converter={StaticResource OneToPercentConverter}, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="100" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="Yellow" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Yellow,Converter={StaticResource OneToPercentConverter}, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="100" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="Black" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding Black,Converter={StaticResource OneToPercentConverter}, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0" HideUpDownButtons="True" Minimum="0" Maximum="100" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <Rectangle Margin="30 0 0 0" Width="50" Height="50" StrokeThickness="1" Stroke="Gray">
+ <Rectangle.Fill>
+ <SolidColorBrush Color="{Binding Color}">
+ </SolidColorBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+ </StackPanel>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding ColorSpace.Name}" Value="LAB">
+ <Setter Property="Content">
+ <Setter.Value>
+ <StackPanel Orientation="Horizontal">
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="Gray" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding L, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0.0" HideUpDownButtons="True" Minimum="0" Maximum="100" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="#FF8A8A" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding A, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0.0" HideUpDownButtons="True" Minimum="-128" Maximum="128" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <ContentControl Style="{StaticResource numberBorder}" Foreground="#92FF92" Width="60" Height="60" Margin="10 0 0 0">
+ <mahapps:NumericUpDown FontSize="16" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Value="{Binding B, Mode=TwoWay}" Background="Transparent" Width="40" StringFormat="0.0" HideUpDownButtons="True" Minimum="-128" Maximum="128" InterceptArrowKeys="True" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" HorizontalContentAlignment="Center">
+ <mahapps:NumericUpDown.Resources>
+ <Style TargetType="TextBox"/>
+ </mahapps:NumericUpDown.Resources>
+ </mahapps:NumericUpDown>
+ </ContentControl>
+
+ <Rectangle Margin="30 0 0 0" Width="50" Height="50" StrokeThickness="1" Stroke="Gray">
+ <Rectangle.Fill>
+ <SolidColorBrush Color="{Binding Color}">
+ </SolidColorBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+ </StackPanel>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ContentControl.Style>
+ </ContentControl>
+
+ <Grid DockPanel.Dock="Right">
+ <Border Style="{StaticResource JobFieldBorder}">
+ <StackPanel Margin="5" Width="140">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/colorspace.png" Width="24"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="5 0 0 0" FontSize="10">Color Space</TextBlock>
+ </StackPanel>
+ <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ColorSpaces}" SelectedItem="{Binding ColorSpace}" DisplayMemberPath="Name" Width="100" HorizontalAlignment="Left">
+ <ComboBox.ItemContainerStyle>
+ <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
+ <Setter Property="Background" Value="#ECECEC"></Setter>
+ </Style>
+ </ComboBox.ItemContainerStyle>
+ </ComboBox>
+ </StackPanel>
+ </Border>
+ </Grid>
+ <Grid>
+ <StackPanel VerticalAlignment="Center">
+ <StackPanel.Style>
+ <Style TargetType="StackPanel">
+ <Setter Property="Visibility" Value="Hidden"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.SelectedSegment.BrushStops.Count,Converter={StaticResource GreaterThanToBooleanConverter},ConverterParameter=1}" Value="True">
+ <Setter Property="Visibility" Value="Visible"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </StackPanel.Style>
+ <TextBlock Width="180" TextAlignment="Center" HorizontalAlignment="Center" FontSize="16">
+ <Run FontWeight="Bold" FontStyle="Italic" Text="OFFSET:" Foreground="#5E5E5E"></Run>
+ <Run FontFamily="{StaticResource digital-7}" Text="{Binding OffsetPercent,StringFormat={}{0:F1}%}"></Run>
+ <Run Foreground="Gray" Text="{Binding OffsetMeters,Mode=OneWay,StringFormat={} ( {0:F1}m )}"></Run>
+ </TextBlock>
+ <Slider ValueChanged="Offset_Slider_ValueChanged" Style="{StaticResource GradientOffsetSlider}" SmallChange="0.1" IsSnapToTickEnabled="True" TickFrequency="0.1" Margin="0 20 0 0" HorizontalAlignment="Center" Width="500" Value="{Binding OffsetPercent}" IsEnabled="{Binding IsMiddle}">
+ <Slider.Foreground>
+ <SolidColorBrush Color="{Binding Color}"></SolidColorBrush>
+ </Slider.Foreground>
+ <Slider.Minimum>
+ <MultiBinding Converter="{StaticResource BrushStopToOffsetLimitConverter}" ConverterParameter="min">
+ <Binding Path="."></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl,Mode=FindAncestor}" Path="DataContext.SelectedSegment"></Binding>
+ <Binding Path="StopIndex"></Binding>
+ </MultiBinding>
+ </Slider.Minimum>
+ <Slider.Maximum>
+ <MultiBinding Converter="{StaticResource BrushStopToOffsetLimitConverter}" ConverterParameter="max">
+ <Binding Path="." Delay="500"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl,Mode=FindAncestor}" Path="DataContext.SelectedSegment"></Binding>
+ <Binding Path="StopIndex"></Binding>
+ </MultiBinding>
+ </Slider.Maximum>
+ </Slider>
+ </StackPanel>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Border>
+
+ <StackPanel>
+ <Grid VerticalAlignment="Top" Visibility="{Binding ElementName=toggleExpand,Path=IsChecked,Converter={StaticResource BooleanToVisibilityConverter}}">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="0" />
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ElementName=toggleExpand, Path=IsChecked}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="1" Duration="00:00:0.2" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="0" Duration="00:00:0.2" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <ContentControl>
+ <ContentControl.Style>
+ <Style TargetType="ContentControl">
+ <Setter Property="Content" Value="{x:Null}"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ElementName=toggleExpand,Path=IsChecked}" Value="True">
+ <Setter Property="Content">
+ <Setter.Value>
+ <DataGrid ItemsSource="{Binding LiquidVolumes}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" Background="Transparent" SelectionUnit="FullRow">
+ <DataGrid.CellStyle>
+ <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
+ <Setter Property="BorderThickness" Value="0"/>
+ <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
+ </Style>
+ </DataGrid.CellStyle>
+ <DataGrid.Columns>
+ <DataGridTemplateColumn Header="IDS PACK">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <Grid x:Name="t0">
+ <Polygon x:Name="t1" Points="0,0 15,0 0,15 0,0" Margin="-15 -11 0 0">
+ <Polygon.Fill>
+ <SolidColorBrush x:Name="t2" Color="{Binding IdsPack.LiquidType.Color,Converter={StaticResource ColorToIntegerConverter},FallbackValue={StaticResource dummyColor}}" />
+ </Polygon.Fill>
+ </Polygon>
+ <TextBlock FontWeight="SemiBold" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center" Text="{Binding IdsPack.LiquidType.Name}"></TextBlock>
+ </Grid>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="D/F">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding IdsPack.DispenserType.NlPerPulse,StringFormat='0.0'}"></Run>
+ <Run Text="(nl)" FontSize="9" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="STEP">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <ComboBox ItemsSource="{Binding Source={StaticResource dispenserDivisions}}" SelectedItem="{Binding DispenserStepDivision,UpdateSourceTrigger=PropertyChanged}">
+ <ComboBox.ItemContainerStyle>
+ <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
+ <Setter Property="Background" Value="#ECECEC"></Setter>
+ </Style>
+ </ComboBox.ItemContainerStyle>
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding Converter={StaticResource EnumToDescriptionConverter}}"></TextBlock>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="MAX NL / CM">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding LiquidMaxNanoliterPerCentimeter,Mode=OneWay,StringFormat='0.0'}"></Run>
+ <Run Text="(nl)" FontSize="9" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="VOLUME">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding Volume,StringFormat='0.0'}"></Run>
+ <Run Text="%" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="FORMULA">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding IdsPack.IdsPackFormula.Name}"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="NL / CM">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding NanoliterPerCentimeter,Mode=OneWay,StringFormat='0.0'}"></Run>
+ <Run Text="(nl)" FontSize="9" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="NL / SEC">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center">
+ <Run Text="{Binding NanoliterPerSecond,Mode=OneWay,StringFormat='0.0'}"></Run>
+ <Run Text="(nl)" FontSize="9" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="PULSE / SEC">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <Label VerticalAlignment="Center">
+ <Label.Style>
+ <Style TargetType="Label">
+ <Setter Property="Content">
+ <Setter.Value>
+ <TextBlock>
+ <Run Text="{Binding PulsePerSecond,Mode=OneWay,StringFormat='0.0'}"></Run>
+ <Run Text="(pulse)" FontSize="9" Foreground="Gray"></Run>
+ </TextBlock>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding DispenserStepDivision}" Value="{x:Static dispensing:DispenserStepDivisions.Auto}">
+ <Setter Property="Content" Value="Auto"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Label.Style>
+ </Label>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ </DataGrid.Columns>
+ </DataGrid>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ContentControl.Style>
+ </ContentControl>
+ </Grid>
+ <ToggleButton Margin="5" x:Name="toggleExpand" Style="{StaticResource MaterialDesignFlatToggleButton}" ToolTip="View more" HorizontalAlignment="Right" Padding="0" Width="24" Height="24" VerticalContentAlignment="Center">
+ <materialDesign:PackIcon VerticalAlignment="Center">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Kind" Value="ArrowDown"></Setter>
+ <Setter Property="Margin" Value="0"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton},Path=IsChecked}" Value="True">
+ <Setter Property="Kind" Value="ArrowUp"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </ToggleButton>
+ </StackPanel>
+ </StackPanel>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </controls:MultiSelectListBox>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Grid>
+
+ <Grid Height="80" Grid.Row="1">
+ <DockPanel>
+ <Grid DockPanel.Dock="Left" VerticalAlignment="Center" Margin="20 15 0 0">
+ <TextBlock FontSize="16" Margin="0 0 0 0">
+ <Run FontWeight="Bold">ESTIMATED DURATION:</Run>
+ <Run Foreground="Black" FontSize="22" FontStyle="Italic" FontFamily="{StaticResource digital-7}" Text="{Binding EstimatedDuration,StringFormat=hh\\:mm\\:ss,TargetNullValue='00:00:00'}"></Run>
+ </TextBlock>
+ </Grid>
+
+ <Grid DockPanel.Dock="Right" Margin="0 0 10 0">
+ <StackPanel Orientation="Horizontal">
+ <Button Height="60" Width="280" Command="{Binding StartJobCommand}" Click="OnJobStartClick">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Width="32" Height="32" Kind="ClockFast" />
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0" FontSize="18">START JOB</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Grid>
+
+ <Grid Margin="0 -18 0 0">
+ <Border VerticalAlignment="Center" Height="55" Margin="30 0 40 0" ClipToBounds="False">
+ <Grid ClipToBounds="False">
+ <ItemsControl x:Name="jobBrushList" ClipToBounds="False">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <Grid>
+ <Grid.Width>
+ <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}">
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob.Length"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding>
+ <Binding Path="Length"></Binding>
+ </MultiBinding>
+ </Grid.Width>
+ <Rectangle VerticalAlignment="Bottom" Height="20">
+ <Rectangle.Fill>
+ <MultiBinding Converter="{StaticResource SegmentToBrushConverterMulti}">
+ <Binding Path="."></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.ActiveJob.Length"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.SelectedBrushStop.Color"></Binding>
+ </MultiBinding>
+ </Rectangle.Fill>
+ </Rectangle>
+
+ <StackPanel Margin="0 0 0 0" HorizontalAlignment="Center">
+ <TextBlock FontSize="12" HorizontalAlignment="Right" Foreground="Black">
+ <Run Text="{Binding Length,Mode=OneWay}"></Run>
+ <Run Foreground="Gray" FontSize="10" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5" Kind="Triangle" Width="8" Height="8" Foreground="DimGray">
+ <materialDesign:PackIcon.RenderTransform>
+ <RotateTransform Angle="180" />
+ </materialDesign:PackIcon.RenderTransform>
+ </materialDesign:PackIcon>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+
+ <StackPanel Margin="-20 -5 0 0" HorizontalAlignment="Left">
+ <TextBlock FontSize="12" Foreground="Black">
+ <Run Text="0"></Run>
+ <Run Foreground="Gray" FontSize="10" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Kind="SubdirectoryArrowRight" Width="16" Height="16" Foreground="DimGray">
+
+ </materialDesign:PackIcon>
+ </StackPanel>
+
+ <StackPanel Margin="0 -5 -20 0" HorizontalAlignment="Right">
+ <TextBlock FontSize="12" Foreground="Black">
+ <Run Text="{Binding ActiveJob.Length,Mode=OneWay}"></Run>
+ <Run Foreground="Gray" FontSize="10" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Kind="FlagCheckered" Width="16" Height="16" Foreground="DimGray">
+
+ </materialDesign:PackIcon>
+ </StackPanel>
+
+ <Border BorderBrush="Gainsboro" BorderThickness="1" VerticalAlignment="Bottom" Height="20">
+
+ </Border>
+ </Grid>
+ </Border>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+
+ <Grid>
+ <Grid Background="#B9FFFFFF">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="Width" Value="520"></Setter>
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleY="1" ScaleX="0"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsSideBarOpened}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX" To="1" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX" To="0" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Background="Transparent">
+ <StackPanel>
+ <Expander Header="PROCESS PARAMETERS" IsExpanded="True" Background="Transparent">
+ <Grid>
+ <Grid>
+ <StackPanel Orientation="Vertical" Margin="5">
+
+ <Border MaxHeight="200" Margin="5">
+ <DockPanel>
+ <ComboBox Margin="0 10 0 0" ItemsSource="{Binding GroupsHistory}" SelectedItem="{Binding SelectedGroupHistory}">
+ <ComboBox.ItemContainerStyle>
+ <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
+ <Setter Property="Background" Value="#E6FFFFFF"></Setter>
+ <Setter Property="Padding" Value="5"></Setter>
+ </Style>
+ </ComboBox.ItemContainerStyle>
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal" Margin="0 10">
+ <TextBlock Text="{Binding Name}" FontWeight="Bold" VerticalAlignment="Center">
+ <TextBlock.Style>
+ <Style TargetType="TextBlock">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding Active}" Value="True">
+ <Setter Property="Foreground" Value="#FF5F5F"></Setter>
+ <Setter Property="FontStyle" Value="Italic"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </TextBlock.Style>
+ </TextBlock>
+ <TextBlock Text="{Binding SaveDate}" Margin="10 0 0 0" FontStyle="Italic" Foreground="Gray" VerticalAlignment="Center"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+
+ </DockPanel>
+ </Border>
+ <ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" Background="Transparent" BorderThickness="0" Style="{x:Null}" HorizontalContentAlignment="Stretch" ItemsSource="{Binding RmlProcessParametersTableGroup.ProcessParametersTables}" SelectedItem="{Binding SelectedProcessParametersTable}" IsEnabled="{Binding RmlProcessParametersTableGroup.Active}">
+ <ListBox.ItemContainerStyle>
+ <Style TargetType="ListBoxItem" BasedOn="{StaticResource basicListBoxItem}">
+
+ </Style>
+ </ListBox.ItemContainerStyle>
+ <!--<ListBox.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel IsItemsHost="True"></WrapPanel>
+ </ItemsPanelTemplate>
+ </ListBox.ItemsPanel>-->
+ <ListBox.ItemTemplate>
+ <DataTemplate DataType="{x:Type observables:ProcessParametersTable}">
+ <Border Padding="5" CornerRadius="5" BorderThickness="1" Height="245" Margin="5">
+ <Border.Style>
+ <Style TargetType="Border" BasedOn="{StaticResource brushStopBorder}">
+ <Setter Property="BorderBrush" Value="Silver"></Setter>
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected,FallbackValue=False}" Value="True">
+ <Setter Property="BorderBrush" Value="{StaticResource AccentColorBrush}"></Setter>
+ <Setter Property="Background" Value="#D4FFFFFF"></Setter>
+ <Setter Property="Opacity" Value="1"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+ <Grid>
+ <DockPanel>
+ <TextBox materialDesign:HintAssist.Hint="Table Name" DockPanel.Dock="Top" Text="{Binding Name}"></TextBox>
+ <WrapPanel Orientation="Vertical" Margin="0 5 0 0">
+ <WrapPanel.Resources>
+ <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
+ <Setter Property="FontSize" Value="10"></Setter>
+ <Setter Property="Foreground" Value="#7A7A7A"></Setter>
+ <Setter Property="Margin" Value="0 5 0 5"></Setter>
+ <Setter Property="MinWidth" Value="80"></Setter>
+ </Style>
+
+ <Style TargetType="mahapps:NumericUpDown">
+ <Setter Property="FontFamily" Value="{StaticResource digital-7}"></Setter>
+ </Style>
+
+ <Style TargetType="ContentControl">
+ <!--<Setter Property="FontFamily" Value="digital-7"></Setter>-->
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ContentControl">
+ <Grid>
+ <Border>
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="BorderBrush" Value="Gainsboro"></Setter>
+ <Setter Property="BorderThickness" Value="1"></Setter>
+ <Setter Property="Padding" Value="2"></Setter>
+ <Setter Property="Margin" Value="5"></Setter>
+ <Setter Property="CornerRadius" Value="3"></Setter>
+ </Style>
+ </Border.Style>
+ <ContentPresenter Content="{TemplateBinding Content}"></ContentPresenter>
+ </Border>
+
+ <materialDesign:PackIcon HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0 0 0 0" Width="12" Height="12" Kind="Settings"></materialDesign:PackIcon>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+
+ </WrapPanel.Resources>
+ <editors:ParameterizedEditor ParameterizedObject="{Binding}">
+ <editors:ParameterizedEditor.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel IsItemsHost="True" Orientation="Vertical" />
+ </ItemsPanelTemplate>
+ </editors:ParameterizedEditor.ItemsPanel>
+ <editors:ParameterizedEditor.DoubleTemplate>
+ <DataTemplate>
+ <ContentControl>
+ <StackPanel>
+ <TextBlock Text="{Binding Name}" FontSize="10"></TextBlock>
+ <mahapps:NumericUpDown FontSize="16" Minimum="0" Margin="0 5 0 0" HideUpDownButtons="True" HorizontalContentAlignment="Center" Maximum="10000" StringFormat="0.0" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" Value="{Binding Value,Mode=TwoWay}"></mahapps:NumericUpDown>
+ </StackPanel>
+ </ContentControl>
+ </DataTemplate>
+ </editors:ParameterizedEditor.DoubleTemplate>
+ </editors:ParameterizedEditor>
+ </WrapPanel>
+ </DockPanel>
+
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="5" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}">
+ <TextBlock Text="Active" FontWeight="Bold" FontStyle="Italic" FontSize="13" VerticalAlignment="Center"></TextBlock>
+ <materialDesign:PackIcon Foreground="#90E990" Kind="CheckboxBlankCircle" VerticalAlignment="Center" Margin="5 0 0 0">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Opacity" Value="0"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected,FallbackValue=False}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Duration="00:00:01" RepeatBehavior="Forever">
+ <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="1" />
+ <DiscreteDoubleKeyFrame KeyTime="00:00:0.5" Value="0" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Duration="00:00:01">
+ <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="0" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </StackPanel>
+ </Grid>
+ </Border>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+
+ <StackPanel Margin="10 20" VerticalAlignment="Bottom" Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Height="40" Command="{Binding SaveProcessParametersCommand}" HorizontalAlignment="Left">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="ContentSave"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">SAVE PARAMETERS</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Height="40" Margin="10 0 0 0" Command="{Binding PushProcessParametersCommand}" HorizontalAlignment="Left">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="ArrowRightBold"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">PUSH PARAMETERS</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </StackPanel>
+ </Grid>
+
+ <Grid Background="White">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="Visibility" Value="Visible"></Setter>
+ <Style.Triggers>
+ <MultiDataTrigger>
+ <MultiDataTrigger.Conditions>
+ <Condition Binding="{Binding SelectedMachine,Converter={StaticResource NullObjectToBooleanConverter}}" Value="True"></Condition>
+ <Condition Binding="{Binding SelectedRML,Converter={StaticResource NullObjectToBooleanConverter}}" Value="True"></Condition>
+ </MultiDataTrigger.Conditions>
+ <Setter Property="Visibility" Value="Collapsed"></Setter>
+ </MultiDataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <TextBlock Foreground="#FA9292" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24">SELECT MACHINE &amp; MEDIA</TextBlock>
+ </Grid>
+ </Grid>
+ </Expander>
+ <Expander Header="CONTROL PARAMETERS" IsExpanded="False" Background="#8EFFFFFF">
+
+ </Expander>
+ </StackPanel>
+ </ScrollViewer>
+
+ <Rectangle HorizontalAlignment="Right" Stroke="#383838" VerticalAlignment="Top" Height="427"></Rectangle>
+ <Rectangle HorizontalAlignment="Right" Stroke="#383838" VerticalAlignment="Bottom" Height="428"></Rectangle>
+ </Grid>
+
+ <Button Background="Transparent" Command="{Binding ToggleSideBarCommand}" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" HorizontalAlignment="Right" VerticalAlignment="Center" Height="200" Width="50" Margin="0 0 -50 0">
+ <Border Background="#F1F1F1" CornerRadius="0 10 10 0" BorderThickness="0 1 1 1" BorderBrush="#383838">
+ <Grid>
+ <TextBlock Foreground="#FF7272" Text="CONFIGURATION" FontSize="16" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Center" HorizontalAlignment="Center">
+ <TextBlock.LayoutTransform>
+ <RotateTransform Angle="270"></RotateTransform>
+ </TextBlock.LayoutTransform>
+ </TextBlock>
+ </Grid>
+ </Border>
+ </Button>
+ </Grid>
+
+ <dragAndDrop:DraggingSurface x:Name="draggingSurface" />
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml.cs
new file mode 100644
index 000000000..27ea3cae8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/JobView.xaml.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Windows.Threading;
+using Tango.DragAndDrop;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Developer.Converters;
+using Tango.MachineStudio.Developer.ViewModels;
+
+namespace Tango.MachineStudio.Developer.Views
+{
+ /// <summary>
+ /// Interaction logic for JobView.xaml
+ /// </summary>
+ public partial class JobView : UserControl
+ {
+ private MainViewVM _vm;
+ private DispatcherTimer _jobBrushTimer;
+
+ public DraggingSurface DraggingSurface
+ {
+ get { return (DraggingSurface)GetValue(DraggingSurfaceProperty); }
+ set { SetValue(DraggingSurfaceProperty, value); }
+ }
+ public static readonly DependencyProperty DraggingSurfaceProperty =
+ DependencyProperty.Register("DraggingSurface", typeof(DraggingSurface), typeof(JobView), new PropertyMetadata(null));
+
+ public JobView()
+ {
+ InitializeComponent();
+
+ DraggingSurface = draggingSurface;
+
+ this.Loaded += (x, y) =>
+ {
+ _vm = DataContext as MainViewVM;
+ };
+
+ _jobBrushTimer = new DispatcherTimer();
+ _jobBrushTimer.Interval = TimeSpan.FromSeconds(1);
+ _jobBrushTimer.Tick += _jobBrushTimer_Tick;
+ _jobBrushTimer.Start();
+ }
+
+ private void _jobBrushTimer_Tick(object sender, EventArgs e)
+ {
+ if (_vm != null && _vm.ActiveJob != null)
+ {
+ List<Segment> segments = new List<Segment>();
+ foreach (var s in _vm.ActiveJob.Segments)
+ {
+ segments.Add(s);
+
+ if (_vm.ActiveJob.EnableInterSegment && _vm.ActiveJob.Segments.IndexOf(s) != _vm.ActiveJob.Segments.Count - 1)
+ {
+ segments.Add(new Segment()
+ {
+ Length = _vm.ActiveJob.InterSegmentLength,
+ BrushStops = new System.Collections.ObjectModel.ObservableCollection<BrushStop>()
+ {
+ new BrushStop()
+ {
+ Color = Colors.White,
+ }
+ },
+ });
+ }
+ }
+
+ jobBrushList.ItemsSource = segments;
+ }
+ }
+
+ private void Offset_Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+ {
+ UpdateGradientBrushDisplay();
+ }
+
+ private void UpdateGradientBrushDisplay()
+ {
+ if (_vm.SelectedSegment != null)
+ {
+ SegmentToGradientStopsConverter converter = new SegmentToGradientStopsConverter();
+ GradientStopCollection stops = converter.Convert(_vm.SelectedSegment, null, null, null) as GradientStopCollection;
+ gradientBrush.GradientStops = stops;
+ }
+ else
+ {
+ gradientBrush.GradientStops = new GradientStopCollection();
+ }
+ }
+
+ private void OnBrushStopBorderDrop(object sender, DropEventArgs e)
+ {
+ if (e.Draggable.DataContext is BrushStop)
+ {
+ _vm.OnDropBrushStop(e.Draggable.DataContext as BrushStop, e.Droppable.DataContext as BrushStop);
+ }
+ }
+
+ private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateGradientBrushDisplay();
+ }
+
+ private void OnJobStartClick(object sender, RoutedEventArgs e)
+ {
+
+ }
+
+ private void HiveColorPickerControl_SelectedColorChanged(object sender, Color e)
+ {
+ UpdateGradientBrushDisplay();
+ }
+
+ private void Popup_MouseDown(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ }
+
+ private void OnSegmentDrop(object sender, DropEventArgs e)
+ {
+ _vm.OnDropSegment(e.Draggable.DataContext as Segment, e.Droppable.DataContext as Segment);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml
new file mode 100644
index 000000000..fcb730de7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml
@@ -0,0 +1,214 @@
+<UserControl x:Class="Tango.MachineStudio.Developer.Views.MachineJobSelectionView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Developer"
+ xmlns:designer="clr-namespace:Tango.MachineStudio.MachineDesigner.Views;assembly=Tango.MachineStudio.MachineDesigner"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:localConverters="clr-namespace:Tango.MachineStudio.Developer.Converters"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Developer.ViewModels"
+ xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:observables="clr-namespace:Tango.Integration.Observables;assembly=Tango.Integration"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Developer.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+
+ <UserControl.Resources>
+ <localConverters:SegmentToBrushConverterMulti x:Key="SegmentToBrushConverterMulti" />
+ <converters:DateTimeUTCToShortDateTimeConverter x:Key="DateTimeUTCToShortDateTimeConverter"/>
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="600"/>
+ <ColumnDefinition Width="1*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Background="#B1FFFFFF">
+ <StackPanel>
+ <TextBlock Margin="40 20" FontSize="30" FontWeight="SemiBold" FontStyle="Italic">TARGET MACHINE</TextBlock>
+ <ComboBox ItemsSource="{Binding Machines}" FontSize="20" SelectedItem="{Binding SelectedMachine}" materialDesign:HintAssist.Hint="Serial Number" Margin="40 0 40 0">
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel>
+ <TextBlock Text="{Binding SerialNumber}" FontWeight="Bold" FontStyle="Italic"></TextBlock>
+ <TextBlock FontSize="11" Text="{Binding Name}" Foreground="Gray"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ <designer:MachineView Width="600" IsHitTestVisible="False" Margin="0 40 0 0" DataContext="{Binding SelectedMachine}" />
+ <Button Command="{Binding EditMachineCommand}" HorizontalAlignment="Right" Margin="0 10 20 20" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="Pencil"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">EDIT</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Column="1">
+ <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="1100" Height="700">
+ <DockPanel>
+ <Grid DockPanel.Dock="Top">
+ <StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/machine-trans.png" RenderOptions.BitmapScalingMode="Fant" Width="50"></Image>
+ <TextBlock VerticalAlignment="Center" FontWeight="SemiBold" Margin="30 0 0 0" FontSize="30" FontStyle="Italic">MACHINE JOBS</TextBlock>
+ </StackPanel>
+ <Rectangle HorizontalAlignment="Stretch" Margin="0 10 0 0" VerticalAlignment="Bottom" StrokeThickness="1" Height="3">
+ <Rectangle.Fill>
+ <LinearGradientBrush StartPoint="0,1" EndPoint="1,1">
+ <GradientStop Offset="0" Color="Transparent" />
+ <GradientStop Offset="0.5" Color="{StaticResource AccentColor}" />
+ <GradientStop Offset="1.1" Color="Transparent" />
+ </LinearGradientBrush>
+ </Rectangle.Fill>
+ <Rectangle.Stroke>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop Offset="0" Color="Transparent" />
+ <GradientStop Offset="0.5" Color="White" />
+ <GradientStop Offset="1" Color="Transparent" />
+ </LinearGradientBrush>
+ </Rectangle.Stroke>
+ </Rectangle>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0 0 10 0">
+ <materialDesign:PackIcon Kind="Magnify" Width="26" Height="26"/>
+ <TextBox Width="300" materialDesign:HintAssist.Hint="Search" Text="{Binding JobFilter,UpdateSourceTrigger=PropertyChanged}"></TextBox>
+ </StackPanel>
+ </Grid>
+
+ <Grid DockPanel.Dock="Bottom" Margin="0 20 0 0">
+ <StackPanel VerticalAlignment="Center" Orientation="Horizontal" HorizontalAlignment="Left" Margin="20 0 0 0">
+ <Button Margin="0 0 10 0" MinWidth="160" Height="50" Background="#FF7575" BorderBrush="#FF7575" Command="{Binding RemoveJobCommand}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Delete" Width="20" Height="20" />
+ <TextBlock Margin="5 0 0 0" FontSize="16">DELETE</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Margin="0 0 10 0" MinWidth="160" Height="50" Background="#FF995A" BorderBrush="#FF995A" Command="{Binding DuplicateJobCommand}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="ContentCopy" Width="20" Height="20" />
+ <TextBlock Margin="5 0 0 0" FontSize="16">DUPLICATE</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button Margin="0 0 10 0" MinWidth="160" Height="50" Background="#65C682" BorderBrush="#65C682" Command="{Binding AddJobCommand}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Plus" Width="20" Height="20" />
+ <TextBlock Margin="5 0 0 0" FontSize="16">NEW JOB</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Margin="50 0 10 0" MinWidth="200" Height="60" Command="{Binding LoadJobCommand}">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock FontSize="18" VerticalAlignment="Center">LOAD JOB</TextBlock>
+ <materialDesign:PackIcon Margin="5 0 0 0" Kind="ChevronRight" Width="30" Height="30" />
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Grid>
+
+ <Grid Margin="0 20 0 0">
+ <controls:MultiSelectDataGrid Style="{StaticResource {x:Type DataGrid}}" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="True" CanUserSortColumns="True" AutoGenerateColumns="False" Background="Transparent" ItemsSource="{Binding JobsCollectionView}" SelectedItem="{Binding SelectedMachineJob}" SelectedItemsList="{Binding SelectedJobs,Mode=TwoWay}">
+ <DataGrid.CellStyle>
+ <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
+ <Setter Property="BorderThickness" Value="0"/>
+ <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
+ <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
+ </Style>
+ </DataGrid.CellStyle>
+ <DataGrid.Columns>
+ <DataGridTemplateColumn>
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <Image Source="../Images/rgb.png" Width="40" Margin="5"></Image>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="NAME" CanUserSort="True" SortMemberPath="Name">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding Name}" VerticalAlignment="Center" FontSize="14"></TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="CREATION DATE" Width="170" CanUserSort="True" SortMemberPath="CreationDate">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding CreationDate,Converter={StaticResource DateTimeUTCToShortDateTimeConverter}}" VerticalAlignment="Center" FontSize="14"></TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="LAST MODIFIED" Width="170" CanUserSort="True" SortMemberPath="LastUpdated">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding LastUpdated,Converter={StaticResource DateTimeUTCToShortDateTimeConverter}}" VerticalAlignment="Center" FontSize="14"></TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="LAST RUN" Width="170" CanUserSort="True" SortMemberPath="LastRun">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding LastRun,Converter={StaticResource DateTimeUTCToShortDateTimeConverter},FallbackValue='Never',TargetNullValue='Never'}" VerticalAlignment="Center" FontSize="14"></TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="USER" Width="100" CanUserSort="True" SortMemberPath="User">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock Text="{Binding User.Contact.FirstName}" VerticalAlignment="Center" FontSize="14"></TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Header="LENGTH" Width="100" CanUserSort="True" SortMemberPath="Length">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <TextBlock VerticalAlignment="Center" FontSize="14">
+ <Run Text="{Binding Length,Mode=OneWay}"></Run>
+ <Run Text="m" Foreground="Gray"></Run>
+ </TextBlock>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ <DataGridTemplateColumn Width="1*">
+ <DataGridTemplateColumn.CellTemplate>
+ <DataTemplate>
+ <ItemsControl HorizontalAlignment="Right" ItemsSource="{Binding Segments}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+
+ </StackPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <Border Width="25" Height="25" Margin="10 0 0 0" BorderThickness="1" BorderBrush="DimGray" CornerRadius="3">
+ <Border.Background>
+ <MultiBinding Converter="{StaticResource SegmentToBrushConverterMulti}">
+ <Binding Path="."></Binding>
+ </MultiBinding>
+ </Border.Background>
+ </Border>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </DataTemplate>
+ </DataGridTemplateColumn.CellTemplate>
+ </DataGridTemplateColumn>
+ </DataGrid.Columns>
+ </controls:MultiSelectDataGrid>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml.cs
new file mode 100644
index 000000000..52786a59f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MachineJobSelectionView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Developer.Views
+{
+ /// <summary>
+ /// Interaction logic for MachineJobSelectionView.xaml
+ /// </summary>
+ public partial class MachineJobSelectionView : UserControl
+ {
+ public MachineJobSelectionView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml
index cd91b007f..7a50a499e 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml
@@ -3,10 +3,412 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:localConverters="clr-namespace:Tango.MachineStudio.Developer.Converters"
xmlns:local="clr-namespace:Tango.MachineStudio.Developer.Views"
+ xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Developer.ViewModels"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Developer"
mc:Ignorable="d"
- d:DesignHeight="300" d:DesignWidth="300" Background="#CBCBCB">
+ d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+
+ <UserControl.Resources>
+ <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
+ <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
+ <converters:ColorToIntegerConverter x:Key="ColorToIntegerConverter"></converters:ColorToIntegerConverter>
+ <converters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+ <converters:NullObjectToBooleanConverter x:Key="NullObjectToBooleanConverter"></converters:NullObjectToBooleanConverter>
+ <converters:GreaterThanToBooleanConverter x:Key="GreaterThanToBooleanConverter"></converters:GreaterThanToBooleanConverter>
+ <converters:SmallerThanToBooleanConverter x:Key="SmallerThanToBooleanConverter"></converters:SmallerThanToBooleanConverter>
+ <localConverters:BrushStopToColorConverter x:Key="BrushStopToColorConverter" />
+ <localConverters:BrushStopCMYKToColorConverter x:Key="BrushStopCMYKToColorConverter" />
+ <localConverters:BrushStopLabToColorConverter x:Key="BrushStopLabToColorConverter" />
+ <localConverters:SegmentToGradientStopsConverter x:Key="SegmentToGradientStopsConverter" />
+ <localConverters:BrushStopToOffsetLimitConverter x:Key="BrushStopToOffsetLimitConverter" />
+ <localConverters:JobToColumnDefinitionsConverter x:Key="JobToColumnDefinitionsConverter" />
+ <localConverters:SegmentLengthToWidthConverter x:Key="SegmentLengthToWidthConverter" />
+ <localConverters:SegmentToGradientStopsConverterMulti x:Key="SegmentToGradientStopsConverterMulti" />
+ <localConverters:SegmentToBrushConverter x:Key="SegmentToBrushConverter" />
+ <localConverters:SegmentToBrushConverterMulti x:Key="SegmentToBrushConverterMulti" />
+ <localConverters:ObjectsNotEqualToBooleanConveter x:Key="ObjectsNotEqualToBooleanConveter" />
+ <localConverters:JobProgressToPositionConverter x:Key="JobProgressToPositionConverter" />
+ <localConverters:BrushStopToOffsetValueConverter x:Key="BrushStopToOffsetValueConverter" />
+ <converters:StringEllipsisConverter x:Key="StringEllipsisConverter" />
+
+
+ <SolidColorBrush x:Key="SideBarBackground" Color="White">
+
+ </SolidColorBrush>
+
+ <Color x:Key="dummyColor">Transparent</Color>
+ </UserControl.Resources>
+
+
<Grid>
- <TextBlock FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center">DEVLOPER MODULE</TextBlock>
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="1*" />
+ </Grid.RowDefinitions>
+
+ <StackPanel>
+ <Grid Background="#202020" TextElement.Foreground="Silver">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="0" />
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ShowJobStatus}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="1" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="0" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <Border BorderBrush="#404040" BorderThickness="0 0 0 1" Padding="20">
+ <DockPanel>
+ <Grid DockPanel.Dock="Left" MinWidth="190" VerticalAlignment="Center" Margin="0 0 0 0">
+ <StackPanel Orientation="Vertical" Visibility="{Binding IsJobRunning,Converter={StaticResource BooleanToVisibilityConverter}}">
+ <ProgressBar Foreground="#FF6464" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" IsIndeterminate="True" Style="{StaticResource MaterialDesignCircularProgressBar}" Value="0" />
+ <TextBlock Margin="0 10 0 0" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14" FontStyle="Italic" FontWeight="DemiBold" Foreground="#FF6464" TextWrapping="Wrap">
+ <Run Text="Running '"></Run>
+ <Run Text="{Binding RunningJob.Name}"></Run>
+ <Run Text="'..."></Run>
+ </TextBlock>
+ </StackPanel>
+ </Grid>
+ <StackPanel DockPanel.Dock="Right" VerticalAlignment="Center" Margin="0 20 0 0">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" FontSize="30" FontFamily="{StaticResource digital-7}" Margin="0 0 40 0" Foreground="#FF6464" Width="100" Text="{Binding RunningJobRemainingTime,StringFormat=hh\\:mm\\:ss}"></TextBlock>
+
+ <Button Height="40" Width="170" Command="{Binding StopJobCommand}" Background="#FF6464" BorderBrush="#FF6464">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Width="24" Height="24" Kind="Stop" />
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">STOP</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </StackPanel>
+ <Grid>
+ <Grid>
+ <Border Margin="0 10 0 0" VerticalAlignment="Bottom" Width="1200" BorderBrush="#404040" BorderThickness="0" ClipToBounds="False">
+ <Grid ClipToBounds="False" >
+
+ <ItemsControl ClipToBounds="False" x:Name="runningJobBrushList" ItemsSource="{Binding RunningJobSegments}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <Grid ClipToBounds="False">
+ <Grid.Width>
+ <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}">
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.RunningJob"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.RunningJob.Length"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding>
+ <Binding Path="Length"></Binding>
+ </MultiBinding>
+ </Grid.Width>
+
+ <StackPanel Margin="0 0 0 0" ClipToBounds="False">
+
+ <StackPanel Margin="0 0 0 0" HorizontalAlignment="Center" VerticalAlignment="Center">
+ <TextBlock Margin="0 0 0 0" FontSize="14" HorizontalAlignment="Right">
+ <Run Text="{Binding Length,Mode=OneWay}"></Run>
+ <Run FontSize="12" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5" Kind="Triangle" Width="12" Height="12">
+ <materialDesign:PackIcon.RenderTransform>
+ <RotateTransform Angle="180" />
+ </materialDesign:PackIcon.RenderTransform>
+ </materialDesign:PackIcon>
+ </StackPanel>
+
+ <Rectangle Height="30" Margin="0 10 0 0" VerticalAlignment="Center">
+ <Rectangle.Fill>
+ <MultiBinding Converter="{StaticResource SegmentToBrushConverterMulti}">
+ <Binding Path="."></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.RunningJob"></Binding>
+ <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.RunningJob.Length"></Binding>
+ </MultiBinding>
+ </Rectangle.Fill>
+ </Rectangle>
+
+ <Canvas Height="30" HorizontalAlignment="Center" Width="80">
+ <Label Padding="0" Margin="0">
+ <Label.Style>
+ <Style TargetType="Label">
+ <Setter Property="Content" Value="{x:Null}"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding Started}" Value="True">
+ <Setter Property="Content">
+ <Setter.Value>
+ <TextBlock Text="{Binding RemainingTime,StringFormat=hh\\:mm\\:ss}" Foreground="#FF6464" FontFamily="{StaticResource digital-7}" HorizontalAlignment="Center" Margin="10" FontSize="20"></TextBlock>
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding Completed}" Value="True">
+ <Setter Property="Content">
+ <Setter.Value>
+ <materialDesign:PackIcon Margin="30 10 0 0" HorizontalAlignment="Center" Width="24" Height="24" Kind="Check" Foreground="#47FF00" />
+ </Setter.Value>
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Label.Style>
+ </Label>
+ </Canvas>
+ </StackPanel>
+
+ <Rectangle HorizontalAlignment="Right" Stroke="White" Margin="0 35 0 25"></Rectangle>
+ </Grid>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+
+ <StackPanel Margin="-40 -5 0 0" HorizontalAlignment="Left">
+ <TextBlock FontSize="14">
+ <Run Text="0"></Run>
+ <Run FontSize="13" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Kind="SubdirectoryArrowRight" Width="20" Height="20">
+
+ </materialDesign:PackIcon>
+ </StackPanel>
+
+ <StackPanel Margin="0 -5 -40 0" HorizontalAlignment="Right">
+ <TextBlock FontSize="14">
+ <Run Text="{Binding RunningJob.Length,Mode=OneWay}"></Run>
+ <Run FontSize="13" Text="m"></Run>
+ </TextBlock>
+ <materialDesign:PackIcon HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Kind="FlagCheckered" Width="20" Height="20">
+
+ </materialDesign:PackIcon>
+ </StackPanel>
+
+ <Border BorderBrush="#404040" BorderThickness="1" VerticalAlignment="Center" Height="30" Margin="0 11 0 0">
+
+ </Border>
+
+ <Canvas x:Name="jobProgressCanvas">
+ <Grid Canvas.Top="0">
+ <Canvas.Left>
+ <MultiBinding Converter="{StaticResource JobProgressToPositionConverter}">
+ <Binding Path="RunningJob" />
+ <Binding Path="RunningJobProgress" />
+ <Binding ElementName="jobProgressCanvas" Path="ActualWidth" />
+ </MultiBinding>
+ </Canvas.Left>
+ <materialDesign:PackIcon Kind="MapMarker" Foreground="#FF6464" Width="35" Height="35" Margin="-17 0 0 0" />
+ <TextBlock Margin="-11 -23 0 0" FontSize="16" Foreground="#FF6464" VerticalAlignment="Top" Height="18" Text="{Binding RunningJobProgress,StringFormat=0.0}"></TextBlock>
+ </Grid>
+ </Canvas>
+ </Grid>
+ </Border>
+ </Grid>
+ </Grid>
+ </DockPanel>
+ </Border>
+
+ <ProgressBar IsIndeterminate="True" VerticalAlignment="Bottom" Height="3" Visibility="{Binding IsJobRunning,Converter={StaticResource BooleanToVisibilityConverter}}"></ProgressBar>
+ </Grid>
+
+ <Grid Background="#C1FFC7">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="0" />
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsJobCompleted}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="1" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="0" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+
+ <Border BorderBrush="#404040" BorderThickness="0 1 0 1" Padding="5">
+ <DockPanel>
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <materialDesign:PackIcon Kind="Check" Width="32" Height="32" VerticalAlignment="Center" />
+ <TextBlock VerticalAlignment="Center" FontSize="16" FontWeight="SemiBold" Margin="10 0 0 0" FontStyle="Italic">Job Completed Successfully</TextBlock>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Right" Margin="0 0 10 0">
+ <Button Height="20" Padding="0" Command="{Binding CloseJobCompletionStatusCommand}" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Foreground="#202020" VerticalAlignment="Center" Width="20" Height="20" Kind="Close" />
+ </StackPanel>
+ </Button>
+ </StackPanel>
+
+ <Grid>
+
+ </Grid>
+ </DockPanel>
+ </Border>
+ </Grid>
+
+ <Grid Background="#FF8888">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="0" />
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsJobFailed}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="1" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="0" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+
+ <Border BorderBrush="#404040" BorderThickness="0 1 0 1" Padding="5">
+ <DockPanel>
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <materialDesign:PackIcon Kind="Alert" Width="32" Height="32" VerticalAlignment="Center" />
+ <TextBlock VerticalAlignment="Center" FontSize="16" FontWeight="SemiBold" Margin="10 0 0 0" FontStyle="Italic">Job Failed To Complete</TextBlock>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Right" Margin="0 0 10 0">
+ <!--<Button Height="40" Width="170" Command="{Binding ViewResultsCommand}" Background="#303030" BorderBrush="#202020">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Width="24" Height="24" Kind="ChartLine" />
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">RESULTS</TextBlock>
+ </StackPanel>
+ </Button>-->
+
+ <Button Padding="0" Height="20" Command="{Binding CloseJobCompletionStatusCommand}" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Foreground="#202020" VerticalAlignment="Center" Width="20" Height="20" Kind="Close" />
+ </StackPanel>
+ </Button>
+ </StackPanel>
+
+ <Grid>
+
+ </Grid>
+ </DockPanel>
+ </Border>
+ </Grid>
+
+ <Grid Background="#FFE388">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="LayoutTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="0" />
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsJobCanceled}" Value="True">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="1" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY" To="0" Duration="00:00:0.3" />
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+
+ <Border BorderBrush="#404040" BorderThickness="0 1 0 1" Padding="5">
+ <DockPanel>
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
+ <materialDesign:PackIcon Kind="Alert" Width="32" Height="32" VerticalAlignment="Center" />
+ <TextBlock VerticalAlignment="Center" FontSize="16" FontWeight="SemiBold" Margin="10 0 0 0" FontStyle="Italic">Job Aborted By User</TextBlock>
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" DockPanel.Dock="Right" Margin="0 0 10 0">
+ <Button Padding="0" Height="20" Command="{Binding CloseJobCompletionStatusCommand}" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Foreground="#202020" VerticalAlignment="Center" Width="20" Height="20" Kind="Close" />
+ </StackPanel>
+ </Button>
+ </StackPanel>
+
+ <Grid>
+
+ </Grid>
+ </DockPanel>
+ </Border>
+ </Grid>
+ </StackPanel>
+
+
+ <Grid Grid.Row="1">
+ <controls:MultiTransitionControl x:Name="TransitionControl" TransitionType="Slide">
+ <controls:MultiTransitionControl.Controls>
+ <ContentControl Tag="MachineJobSelectionView">
+ <local:MachineJobSelectionView/>
+ </ContentControl>
+ <ContentControl Tag="JobView">
+ <local:JobView/>
+ </ContentControl>
+ <ContentControl Tag="RunningJobView">
+ <local:RunningJobView/>
+ </ContentControl>
+ </controls:MultiTransitionControl.Controls>
+ </controls:MultiTransitionControl>
+ </Grid>
+ </Grid>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml.cs
index 6ebfd9832..ab181e8dc 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/MainView.xaml.cs
@@ -12,17 +12,33 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using Tango.SharedUI;
namespace Tango.MachineStudio.Developer.Views
{
/// <summary>
- /// Interaction logic for MainView.xaml
+ /// Interaction logic for DeveloperView.xaml
/// </summary>
- public partial class MainView : UserControl
+ public partial class MainView : UserControl, IMainView
{
+ private bool _loaded;
+ public static MainView Instance { get; set; }
+
public MainView()
{
InitializeComponent();
+ Instance = this;
+
+ Loaded += (x, y) =>
+ {
+ if (!_loaded)
+ {
+ _loaded = true;
+ ViewAttached?.Invoke(this, this);
+ }
+ };
}
+
+ public event EventHandler<IView> ViewAttached;
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml
new file mode 100644
index 000000000..30941f3dd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml
@@ -0,0 +1,45 @@
+<UserControl x:Class="Tango.MachineStudio.Developer.Views.RunningJobView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Developer.ViewModels"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Developer"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Developer.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+ <Grid>
+ <Grid Margin="40">
+ <DockPanel>
+ <StackPanel Margin="0 20 0 0" Orientation="Horizontal" DockPanel.Dock="Top">
+ <materialDesign:PackIcon Kind="Settings" Width="60" Height="60" />
+ <TextBlock FontSize="30" FontWeight="SemiBold" VerticalAlignment="Center" Margin="10 0 0 0">Job Status</TextBlock>
+ </StackPanel>
+
+ <Grid DockPanel.Dock="Bottom" Height="40">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0 0 0 0">
+ <Button Command="{Binding ExportToExcelCommand}" Style="{StaticResource MaterialDesignFlatButton}">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon VerticalAlignment="Center" Kind="FileExcel"></materialDesign:PackIcon>
+ <TextBlock Margin="10 0 0 0">EXPORT TO EXCEL</TextBlock>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Grid>
+
+ <Grid>
+ <DataGrid Background="Transparent" Margin="0 20 0 0" BorderThickness="1" BorderBrush="Gainsboro">
+ <DataGrid.Columns>
+ <DataGridTextColumn Width="Auto" Header="#"/>
+ <DataGridTextColumn Width="200" Header="TIME STAMP"/>
+ <DataGridTextColumn Width="100" Header="CODE"/>
+ <DataGridTextColumn Width="200" Header="NAME"/>
+ <DataGridTextColumn Width="1*" Header="DESCRIPTION"/>
+ </DataGrid.Columns>
+ </DataGrid>
+ </Grid>
+ </DockPanel>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml.cs
new file mode 100644
index 000000000..74ace554e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/Views/RunningJobView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Developer.Views
+{
+ /// <summary>
+ /// Interaction logic for RunningJobView.xaml
+ /// </summary>
+ public partial class RunningJobView : UserControl
+ {
+ public RunningJobView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/app.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/app.config
index cacd4cd77..4a6cb0526 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/app.config
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/app.config
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
+ <configSections>
+ <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+ <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+ </configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
@@ -8,4 +12,10 @@
</dependentAssembly>
</assemblyBinding>
</runtime>
+ <entityFramework>
+ <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
+ <providers>
+ <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+ </providers>
+ </entityFramework>
</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/packages.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/packages.config
new file mode 100644
index 000000000..c3235a090
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/packages.config
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="CommonServiceLocator" version="1.3" targetFramework="net46" />
+ <package id="DeepEqual" version="1.6.0.0" targetFramework="net46" />
+ <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
+ <package id="Google.Protobuf" version="3.4.1" targetFramework="net46" />
+ <package id="MahApps.Metro" version="1.5.0" targetFramework="net46" />
+ <package id="MaterialDesignColors" version="1.1.2" targetFramework="net46" />
+ <package id="MaterialDesignThemes" version="2.3.1.953" targetFramework="net46" />
+ <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net46" />
+ <package id="System.Reactive" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Core" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Interfaces" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Linq" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.PlatformServices" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Windows.Threading" version="3.1.1" targetFramework="net46" />
+</packages> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachineVersionsProvider.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachineVersionsProvider.cs
new file mode 100644
index 000000000..c018e3ce8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachineVersionsProvider.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.AutoComplete.Editors;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.MachineDesigner.AutoComplete
+{
+ /// <summary>
+ /// Represents an auto-complete <see cref="MachineVersion">Machine Versions</see> provider.
+ /// </summary>
+ /// <seealso cref="Tango.AutoComplete.Editors.ISuggestionProvider" />
+ public class MachineVersionsProvider : ISuggestionProvider
+ {
+ public String Text { get; set; }
+
+ public IEnumerable GetSuggestions(string filter)
+ {
+ Text = filter;
+ return ObservablesEntitiesAdapter.Instance.MachineVersions.Where(x => x.Version.ToString().StartsWith(filter, StringComparison.CurrentCultureIgnoreCase) || x.Name.StartsWith(filter, StringComparison.CurrentCultureIgnoreCase)).ToList();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachinesProvider.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachinesProvider.cs
index 943c52f81..9261f648a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachinesProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/AutoComplete/MachinesProvider.cs
@@ -5,12 +5,21 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.AutoComplete.Editors;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
namespace Tango.MachineStudio.MachineDesigner.AutoComplete
{
+ /// <summary>
+ /// Represents an auto-complete <see cref="Machine">Machines</see> provider.
+ /// </summary>
+ /// <seealso cref="Tango.AutoComplete.Editors.ISuggestionProvider" />
public class MachinesProvider : ISuggestionProvider
{
+ /// <summary>
+ /// Gets the suggestions.
+ /// </summary>
+ /// <param name="filter">The filter.</param>
+ /// <returns></returns>
public IEnumerable GetSuggestions(string filter)
{
return ObservablesEntitiesAdapter.Instance.Machines.Where(x => x.SerialNumber.StartsWith(filter, StringComparison.CurrentCultureIgnoreCase)).ToList();
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Images/formula.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Images/formula.png
new file mode 100644
index 000000000..6f476e79c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Images/formula.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/MachineDesignerModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/MachineDesignerModule.cs
index db937028b..a6fa13f08 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/MachineDesignerModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/MachineDesignerModule.cs
@@ -5,33 +5,48 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.MachineDesigner.Views;
using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.MachineDesigner
{
- public class MachineDesignerModule : IStudioModule
+ /// <summary>
+ /// Represents a machine designer Machine Studio module providing an interactive GUI for managing machine configurations.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public class MachineDesignerModule : StudioModuleBase
{
- public string Name => "Machine Designer";
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Machine Designer";
- public string Description => "Provides a graphical control over machine configurations. Create, manage and deploy machine configurations using simple drag and drop interface.";
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Provides a graphical control over machine configurations. Create, manage and deploy machine configurations using simple drag and drop interface.";
- public BitmapSource Image => ResourceHelper.GetImageFromResources("Images/machine-designer-module.jpg");
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/machine-designer-module.jpg");
- public FrameworkElement MainView => new MainView();
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MainView();
- public Permissions Permission => Permissions.RunDeveloperModule;
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunMachineDesignerModule;
- public bool IsInitialized => true;
-
- public void Dispose()
- {
-
- }
-
- public void Initialize()
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
{
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
index 46ec20fdc..46571f99c 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Tango.MachineStudio.MachineDesigner.csproj
@@ -78,8 +78,16 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AutoComplete\MachinesProvider.cs" />
+ <Compile Include="AutoComplete\MachineVersionsProvider.cs" />
<Compile Include="ViewModelLocator.cs" />
+ <Compile Include="ViewModels\MachineVersionDialogVM.cs" />
<Compile Include="ViewModels\MainViewVM.cs" />
+ <Compile Include="Views\MachineVersionDialog.xaml.cs">
+ <DependentUpon>MachineVersionDialog.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\MachineView.xaml.cs">
+ <DependentUpon>MachineView.xaml</DependentUpon>
+ </Compile>
<Compile Include="Views\MainView.xaml.cs">
<DependentUpon>MainView.xaml</DependentUpon>
</Compile>
@@ -87,6 +95,14 @@
<Link>GlobalVersionInfo.cs</Link>
</Compile>
<Compile Include="MachineDesignerModule.cs" />
+ <Page Include="Views\MachineVersionDialog.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\MachineView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Views\MainView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -130,10 +146,6 @@
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
<Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
<Name>Tango.DAL.Remote</Name>
@@ -142,6 +154,10 @@
<Project>{b112d89a-a106-41ae-a0c1-4abc84c477f5}</Project>
<Name>Tango.DragAndDrop</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
+ <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
+ <Name>Tango.Integration</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj">
<Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project>
<Name>Tango.Logging</Name>
@@ -210,5 +226,8 @@
<ItemGroup>
<Resource Include="Images\machine-designer-module.jpg" />
</ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\formula.png" />
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MachineVersionDialogVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MachineVersionDialogVM.cs
new file mode 100644
index 000000000..15bebefc8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MachineVersionDialogVM.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.Commands;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.MachineDesigner.AutoComplete;
+
+namespace Tango.MachineStudio.MachineDesigner.ViewModels
+{
+ public class MachineVersionDialogVM : DialogViewVM
+ {
+ public ObservablesEntitiesAdapter Adapter { get; set; }
+
+ public double Version { get; set; }
+
+ private String _versionName;
+
+ public String VersionName
+ {
+ get { return _versionName; }
+ set { _versionName = value; RaisePropertyChangedAuto(); }
+ }
+
+ private MachineVersion _selectedVersion;
+
+ public MachineVersion SelectedVersion
+ {
+ get { return _selectedVersion; }
+ set
+ {
+ _selectedVersion = value;
+ RaisePropertyChangedAuto();
+ VersionName = value != null ? value.Name : null;
+ Version = value != null ? value.Version : 0;
+ }
+ }
+
+ public RelayCommand AcceptCommand { get; set; }
+
+ public RelayCommand CancelCommand { get; set; }
+
+ public MachineVersionDialogVM()
+ {
+ Adapter = ObservablesEntitiesAdapter.Instance;
+ AcceptCommand = new RelayCommand(() =>
+ {
+ Accept();
+ });
+ CancelCommand = new RelayCommand(Cancel);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
index ca1c95a03..6fbd5852d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs
@@ -9,17 +9,22 @@ using System.Threading.Tasks;
using System.Windows.Data;
using Tango.Core.Commands;
using Tango.Core.Helpers;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Notifications;
using Tango.SharedUI;
using SimpleValidator.Extensions;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.MachineStudio.Common;
namespace Tango.MachineStudio.MachineDesigner.ViewModels
{
- public class MainViewVM : ViewModel
+ public class MainViewVM : ViewModel, IModuleRequestListener
{
private bool _isSaving;
private INotificationProvider _notification;
+
+
+ #region Properties
private ObservablesEntitiesAdapter _adapter;
/// <summary>
@@ -33,7 +38,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
private Machine _machine;
/// <summary>
- /// Gets or sets the machine.
+ /// Gets or sets the current editable machine.
/// </summary>
public Machine Machine
{
@@ -42,6 +47,9 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
private Machine _selectedMachine;
+ /// <summary>
+ /// Gets or sets the selected machine from the drop down.
+ /// </summary>
public Machine SelectedMachine
{
get { return _selectedMachine; }
@@ -50,7 +58,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
private Configuration _configuration;
/// <summary>
- /// Gets or sets the configuration.
+ /// Gets or sets the editable machine configuration.
/// </summary>
public Configuration Configuration
{
@@ -69,17 +77,18 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
private ObservableCollection<Configuration> _history;
-
+ /// <summary>
+ /// Gets or sets the machine configuration history.
+ /// </summary>
public ObservableCollection<Configuration> History
{
get { return _history; }
set { _history = value; RaisePropertyChangedAuto(); }
}
-
private Configuration _selectedHistoryConfiguration;
/// <summary>
- /// Gets or sets the selected history configuration.
+ /// Gets or sets the machine selected configuration from history.
/// </summary>
public Configuration SelectedHistoryConfiguration
{
@@ -88,20 +97,49 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
private String _filter;
-
+ /// <summary>
+ /// Gets or sets the configuration components filter.
+ /// </summary>
public String Filter
{
get { return _filter; }
set { _filter = value; RaisePropertyChangedAuto(); OnFilterChanged(); }
}
+ #endregion
+
+ #region Commands
+
+ /// <summary>
+ /// Gets or sets the save command.
+ /// </summary>
public RelayCommand SaveCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the add ids command.
+ /// </summary>
public RelayCommand AddIdsCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the remove ids command.
+ /// </summary>
public RelayCommand RemoveIdsCommand { get; set; }
/// <summary>
+ /// Gets or sets the set version configuration command.
+ /// </summary>
+ public RelayCommand SetVersionConfigurationCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the set as default command.
+ /// </summary>
+ public RelayCommand SetAsDefaultCommand { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
/// Initializes a new instance of the <see cref="MainViewVM"/> class.
/// </summary>
public MainViewVM(INotificationProvider notification)
@@ -117,9 +155,18 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
SaveCommand = new RelayCommand(Save, (x) => !_isSaving);
AddIdsCommand = new RelayCommand(AddIds, (x) => !_isSaving && Configuration.IdsPacks.Count < 8);
RemoveIdsCommand = new RelayCommand(RemoveIds, (x) => !_isSaving && SelectedIds != null);
+ SetVersionConfigurationCommand = new RelayCommand(SetVersionConfiguration,(x) => !_isSaving);
+ SetAsDefaultCommand = new RelayCommand(SetAsDefaultConfiguration,(x) => !_isSaving);
}
- private void OnSelectedMachineChanged()
+ #endregion
+
+ #region Virtual Methods
+
+ /// <summary>
+ /// Called when the selected machine has changed.
+ /// </summary>
+ protected virtual void OnSelectedMachineChanged()
{
if (SelectedMachine != null)
{
@@ -133,136 +180,224 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
}
- public void DropIdsPack(IdsPack idsPack1, IdsPack idsPack2)
+ /// <summary>
+ /// Called when the history configuration has been selected
+ /// </summary>
+ protected virtual void OnHistoryConfigurationSelected()
{
- Configuration.IdsPacks.Swap(idsPack1, idsPack2);
+ if (SelectedHistoryConfiguration != null)
+ {
+ Configuration = SelectedHistoryConfiguration.CloneConfiguration();
+ }
}
- private void OnHistoryConfigurationSelected()
+ /// <summary>
+ /// Called when the filter has changed
+ /// </summary>
+ protected virtual void OnFilterChanged()
{
- if (SelectedHistoryConfiguration != null)
+
+
+ List<ICollectionView> collections = new List<ICollectionView>();
+ collections.Add(Adapter.ApplicationDisplayPanelVersionsViewSource);
+ collections.Add(Adapter.ApplicationVersionsViewSource);
+ collections.Add(Adapter.EmbeddedSoftwareVersionsViewSource);
+ collections.Add(Adapter.EmbeddedFirmwareVersionsViewSource);
+ collections.Add(Adapter.ApplicationOsVersionsViewSource);
+ collections.Add(Adapter.ApplicationVersionsViewSource);
+ collections.Add(Adapter.DispenserTypesViewSource);
+ collections.Add(Adapter.CartridgeTypesViewSource);
+ collections.Add(Adapter.LiquidTypesViewSource);
+ collections.Add(Adapter.MidTankTypesViewSource);
+ collections.Add(Adapter.HardwareVersionsViewSource);
+
+ foreach (var collection in collections)
{
- Configuration = SelectedHistoryConfiguration.CloneConfiguration();
+ collection.Filter = (x) =>
+ {
+ foreach (var prop in x.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(y => y.PropertyType == typeof(String)))
+ {
+ String value = prop.GetValue(x).ToStringSafe();
+
+ if (value != null)
+ {
+ if (value.ToLower().Contains(Filter.ToLower()))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
}
}
+ #endregion
+
+ #region Drag Drop Handlers
+
+ /// <summary>
+ /// Drops the ids pack.
+ /// </summary>
+ /// <param name="idsPack1">The ids pack1.</param>
+ /// <param name="idsPack2">The ids pack2.</param>
+ public void DropIdsPack(IdsPack idsPack1, IdsPack idsPack2)
+ {
+ Configuration.IdsPacks.Swap(idsPack1, idsPack2);
+ }
+
+ /// <summary>
+ /// Drops the touch panel.
+ /// </summary>
+ /// <param name="applicationDisplayPanelVersion">The application display panel version.</param>
public void DropTouchPanel(ApplicationDisplayPanelVersion applicationDisplayPanelVersion)
{
- Configuration.ApplicationDisplayPanelVersions = applicationDisplayPanelVersion;
+ Configuration.ApplicationDisplayPanelVersion = applicationDisplayPanelVersion;
Configuration.ApplicationDisplayPanelVersionGuid = applicationDisplayPanelVersion.Guid;
}
+ /// <summary>
+ /// Drops the application firmware version.
+ /// </summary>
+ /// <param name="applicationFirmwareVersion">The application firmware version.</param>
public void DropApplicationFirmwareVersion(ApplicationFirmwareVersion applicationFirmwareVersion)
{
- Configuration.ApplicationFirmwareVersions = applicationFirmwareVersion;
+ Configuration.ApplicationFirmwareVersion = applicationFirmwareVersion;
Configuration.ApplicationFirmwareVersionGuid = applicationFirmwareVersion.Guid;
}
+ /// <summary>
+ /// Drops the application version.
+ /// </summary>
+ /// <param name="applicationVersion">The application version.</param>
public void DropApplicationVersion(ApplicationVersion applicationVersion)
{
- Configuration.ApplicationVersions = applicationVersion;
+ Configuration.ApplicationVersion = applicationVersion;
Configuration.ApplicationVersionGuid = applicationVersion.Guid;
}
+ /// <summary>
+ /// Drops the hardware version.
+ /// </summary>
+ /// <param name="hardwareVersion">The hardware version.</param>
public void DropHardwareVersion(HardwareVersion hardwareVersion)
{
- Configuration.HardwareVersions = hardwareVersion;
+ Configuration.HardwareVersion = hardwareVersion;
Configuration.HardwareVersionGuid = hardwareVersion.Guid;
}
+ /// <summary>
+ /// Drops the embedded firmware.
+ /// </summary>
+ /// <param name="embeddedFirmwareVersion">The embedded firmware version.</param>
public void DropEmbeddedFirmware(EmbeddedFirmwareVersion embeddedFirmwareVersion)
{
- Configuration.EmbeddedFirmwareVersions = embeddedFirmwareVersion;
+ Configuration.EmbeddedFirmwareVersion = embeddedFirmwareVersion;
Configuration.EmbeddedFirmwareVersionGuid = embeddedFirmwareVersion.Guid;
}
+ /// <summary>
+ /// Drops the embedded software.
+ /// </summary>
+ /// <param name="embeddedSoftwareVersion">The embedded software version.</param>
public void DropEmbeddedSoftware(EmbeddedSoftwareVersion embeddedSoftwareVersion)
{
- Configuration.EmbeddedSoftwareVersions = embeddedSoftwareVersion;
+ Configuration.EmbeddedSoftwareVersion = embeddedSoftwareVersion;
Configuration.EmbeddedSoftwareVersionGuid = embeddedSoftwareVersion.Guid;
}
+ /// <summary>
+ /// Drops the application os version.
+ /// </summary>
+ /// <param name="applicationOsVersion">The application os version.</param>
public void DropApplicationOsVersion(ApplicationOsVersion applicationOsVersion)
{
- Configuration.ApplicationOsVersions = applicationOsVersion;
+ Configuration.ApplicationOsVersion = applicationOsVersion;
Configuration.ApplicationVersionGuid = applicationOsVersion.Guid;
}
- private void RemoveIds()
- {
- Configuration.IdsPacks.Remove(SelectedIds);
- SelectedIds = null;
- }
-
- private void AddIds()
- {
- Configuration.IdsPacks.Add(new IdsPack() { Configuration = Configuration });
- InvalidateRelayCommands();
- }
-
+ /// <summary>
+ /// Drops the type of the cartridge.
+ /// </summary>
+ /// <param name="cartridgeType">Type of the cartridge.</param>
+ /// <param name="idsPack">The ids pack.</param>
public void DropCartridgeType(CartridgeType cartridgeType, IdsPack idsPack)
{
- idsPack.CartridgeTypes = cartridgeType;
+ idsPack.CartridgeType = cartridgeType;
idsPack.CartridgeTypeGuid = cartridgeType.Guid;
}
- public void DropDispenser(Dispenser dispenser, IdsPack idsPack)
+ /// <summary>
+ /// Drops the dispenser.
+ /// </summary>
+ /// <param name="dispenserType">The dispenser.</param>
+ /// <param name="idsPack">The ids pack.</param>
+ public void DropDispenserType(DispenserType dispenserType, IdsPack idsPack)
{
- idsPack.Dispenser = dispenser;
- idsPack.DispenserGuid = dispenser.Guid;
+ idsPack.DispenserType = dispenserType;
+ idsPack.DispenserTypeGuid = dispenserType.Guid;
}
+ /// <summary>
+ /// Drops the type of the mid tank.
+ /// </summary>
+ /// <param name="midTankType">Type of the mid tank.</param>
+ /// <param name="idsPack">The ids pack.</param>
public void DropMidTankType(MidTankType midTankType, IdsPack idsPack)
{
- idsPack.MidTankTypes = midTankType;
+ idsPack.MidTankType = midTankType;
idsPack.MidTankTypeGuid = midTankType.Guid;
}
+ /// <summary>
+ /// Drops the type of the liquid.
+ /// </summary>
+ /// <param name="liquidType">Type of the liquid.</param>
+ /// <param name="idsPack">The ids pack.</param>
public void DropLiquidType(LiquidType liquidType, IdsPack idsPack)
{
- idsPack.LiquidTypes = liquidType;
+ idsPack.LiquidType = liquidType;
idsPack.LiquidTypeGuid = liquidType.Guid;
}
- private void OnFilterChanged()
+ /// <summary>
+ /// Drops the ids formula.
+ /// </summary>
+ /// <param name="idsPackFormula">The ids pack formula.</param>
+ /// <param name="idsPack">The ids pack.</param>
+ /// <exception cref="NotImplementedException"></exception>
+ public void DropIdsFormula(IdsPackFormula idsPackFormula, IdsPack idsPack)
{
+ idsPack.IdsPackFormula = idsPackFormula;
+ idsPack.IdsPackFormulaGuid = idsPackFormula.Guid;
+ }
+ #endregion
- List<ICollectionView> collections = new List<ICollectionView>();
- collections.Add(Adapter.ApplicationDisplayPanelVersionsViewSource);
- collections.Add(Adapter.ApplicationVersionsViewSource);
- collections.Add(Adapter.EmbeddedSoftwareVersionsViewSource);
- collections.Add(Adapter.EmbeddedFirmwareVersionsViewSource);
- collections.Add(Adapter.ApplicationOsVersionsViewSource);
- collections.Add(Adapter.ApplicationVersionsViewSource);
- collections.Add(Adapter.DispensersViewSource);
- collections.Add(Adapter.CartridgeTypesViewSource);
- collections.Add(Adapter.LiquidTypesViewSource);
- collections.Add(Adapter.MidTankTypesViewSource);
- collections.Add(Adapter.HardwareVersionsViewSource);
+ #region Private Methods
- foreach (var collection in collections)
- {
- collection.Filter = (x) =>
- {
- foreach (var prop in x.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(y => y.PropertyType == typeof(String)))
- {
- String value = prop.GetValue(x).ToStringSafe();
-
- if (value != null)
- {
- if (value.ToLower().Contains(Filter.ToLower()))
- {
- return true;
- }
- }
- }
+ /// <summary>
+ /// Removes the selected IDS pack.
+ /// </summary>
+ private void RemoveIds()
+ {
+ Configuration.IdsPacks.Remove(SelectedIds);
+ SelectedIds = null;
+ }
- return false;
- };
- }
+ /// <summary>
+ /// Adds a new IDS pack.
+ /// </summary>
+ private void AddIds()
+ {
+ Configuration.IdsPacks.Add(new IdsPack() { Configuration = Configuration });
+ InvalidateRelayCommands();
}
+ /// <summary>
+ /// Saves the current machine configuration.
+ /// </summary>
private async void Save()
{
foreach (var ids in Configuration.IdsPacks)
@@ -276,9 +411,9 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
List<String> errors = new List<string>();
- if (Machine.MachineVersions == null)
+ if (Machine.MachineVersion == null)
{
- errors.Add("Machine Version is required.");
+ errors.Add("Machine version is required.");
}
if (Machine.Name.IsNullOrWhiteSpace())
@@ -301,39 +436,39 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
errors.Add("Configuration name is required.");
}
- if (Configuration.ApplicationDisplayPanelVersions == null)
+ if (Configuration.ApplicationDisplayPanelVersion == null)
{
errors.Add("Touch Panel is required.");
}
- if (Configuration.ApplicationFirmwareVersions == null)
+ if (Configuration.ApplicationFirmwareVersion == null)
{
- errors.Add("Application Firmware is required.");
+ errors.Add("Application firmware is required.");
}
- if (Configuration.ApplicationOsVersions == null)
+ if (Configuration.ApplicationOsVersion == null)
{
- errors.Add("Application OS Version is required.");
+ errors.Add("Application operation system is required.");
}
- if (Configuration.ApplicationVersions == null)
+ if (Configuration.ApplicationVersion == null)
{
- errors.Add("Application Version is required.");
+ errors.Add("Application version is required.");
}
- if (Configuration.EmbeddedFirmwareVersions == null)
+ if (Configuration.EmbeddedFirmwareVersion == null)
{
- errors.Add("Embedded Firmware is required.");
+ errors.Add("Embedded firmware is required.");
}
- if (Configuration.EmbeddedSoftwareVersions == null)
+ if (Configuration.EmbeddedSoftwareVersion == null)
{
- errors.Add("Embedded Software is required.");
+ errors.Add("Embedded software is required.");
}
- if (Configuration.HardwareVersions == null)
+ if (Configuration.HardwareVersion == null)
{
- errors.Add("Hardware Version is required.");
+ errors.Add("Hardware version is required.");
}
foreach (var pack in Configuration.IdsPacks)
@@ -343,31 +478,22 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
errors.Add(String.Format("Name is required on IDS pack number '{0}'.", Configuration.IdsPacks.IndexOf(pack) + 1));
continue;
}
- if (pack.CartridgeTypes == null)
+ if (pack.CartridgeType == null)
{
errors.Add(String.Format("Cartridge type is required on IDS pack '{0}'.", pack.Name));
}
- if (pack.Dispenser == null)
+ if (pack.DispenserType == null)
{
- errors.Add(String.Format("Dispenser is required on IDS pack '{0}'.", pack.Name));
+ errors.Add(String.Format("Dispenser type is required on IDS pack '{0}'.", pack.Name));
}
- if (pack.LiquidTypes == null)
+ if (pack.LiquidType == null)
{
errors.Add(String.Format("Liquid type is required on IDS pack '{0}'.", pack.Name));
}
- if (pack.MidTankTypes == null)
+ if (pack.MidTankType == null)
{
errors.Add(String.Format("Mid Tank type is required on IDS pack '{0}'.", pack.Name));
}
-
- var taken_ids = Adapter.Machines.Where(x => x.SerialNumber.ToLower() != Machine.SerialNumber).SelectMany(x => x.MachinesConfigurations).Select(x => x.Configuration).SelectMany(x => x.IdsPacks).ToList().FirstOrDefault(x => x.Dispenser.SerialNumber.ToLower() == pack.Dispenser.SerialNumber.ToLower());
- if (taken_ids != null && taken_ids.Configuration.MachinesConfigurations.Count > 0)
- {
- if (!_notification.ShowQuestion(String.Format("The Dispenser '{1}' on IDS pack '{0}' is already taken by another machine ('{2}', '{3}'). Are you sure you want to assign it to this machine?", pack.Name, pack.Dispenser.SerialNumber, taken_ids.Configuration.MachinesConfigurations.First().Machine.Name, taken_ids.Configuration.MachinesConfigurations.First().Machine.SerialNumber)))
- {
- return;
- }
- }
}
if (errors.Count > 0)
@@ -403,7 +529,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
Configuration = Configuration,
Machine = Machine,
});
- await Machine.SaveAsync();
+ await Machine.SaveAsync(Adapter.Context);
Machine = Adapter.Machines.SingleOrDefault(x => x.Guid == Machine.Guid);
Configuration = Machine.Configuration.CloneConfiguration();
@@ -419,7 +545,6 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
machine.Name = Machine.Name;
machine.SerialNumber = Machine.SerialNumber;
- machine.Configuration = Configuration;
machine.Organization = Machine.Organization;
@@ -431,8 +556,14 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
Machine = machine
});
}
+ else
+ {
+ machine.Configuration.DefferedDelete(Adapter.Context);
+ }
- await machine.SaveAsync();
+ machine.Configuration = Configuration;
+
+ await machine.SaveAsync(Adapter.Context);
Machine = Adapter.Machines.SingleOrDefault(x => x.Guid == machine.Guid);
Configuration = Machine.Configuration.CloneConfiguration();
@@ -453,10 +584,88 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels
}
}
+ /// <summary>
+ /// Sets the specified machine history.
+ /// </summary>
+ /// <param name="machine">The machine.</param>
private void SetHistory(Machine machine)
{
History = machine.MachinesConfigurations.Select(x => x.Configuration).ToObservableCollection();
History.Insert(0, machine.Configuration);
}
+
+ /// <summary>
+ /// Sets the current configuration to the selected machine version default configuration.
+ /// </summary>
+ private void SetVersionConfiguration()
+ {
+ if (Machine.MachineVersion != null)
+ {
+ Configuration = Machine.MachineVersion.DefaultConfiguration.CloneConfiguration();
+ }
+ else
+ {
+ _notification.ShowError("No machine version selected.");
+ }
+ }
+
+ /// <summary>
+ /// Sets the current configuration as a default machine version configuration.
+ /// </summary>
+ private void SetAsDefaultConfiguration()
+ {
+ _notification.ShowModalDialog<MachineVersionDialogVM>(async (vm) =>
+ {
+ try
+ {
+ using (_notification.PushTaskItem("Saving Default Configuration..."))
+ {
+ if (vm.SelectedVersion != null)
+ {
+ vm.SelectedVersion.DefaultConfiguration = Configuration.CloneConfiguration();
+ vm.SelectedVersion.DefaultConfigurationGuid = vm.SelectedVersion.DefaultConfiguration.Guid;
+ await vm.SelectedVersion.SaveAsync(Adapter.Context);
+ }
+ else
+ {
+ MachineVersion newVersion = new MachineVersion();
+ newVersion.Version = vm.Version;
+ newVersion.Name = vm.VersionName;
+
+ newVersion.DefaultConfiguration = Configuration.CloneConfiguration();
+ newVersion.DefaultConfigurationGuid = newVersion.DefaultConfiguration.Guid;
+ await newVersion.SaveAsync(Adapter.Context);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ _notification.ShowError(ex.Message);
+ }
+
+ }, () =>
+ {
+
+ });
+ }
+
+ #endregion
+
+ #region IModuleRequestListener
+
+ /// <summary>
+ /// Called when the request has been made.
+ /// </summary>
+ /// <param name="module">The module instance.</param>
+ /// <param name="args">The arguments.</param>
+ public void OnRequestModule(IStudioModule module, object args)
+ {
+ if (module is MachineDesignerModule)
+ {
+ SelectedMachine = Adapter.Machines.SingleOrDefault(x => x.Guid == (args as Machine).Guid);
+ }
+ }
+
+ #endregion
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml
new file mode 100644
index 000000000..f6c39a6cd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml
@@ -0,0 +1,71 @@
+<UserControl x:Class="Tango.MachineStudio.MachineDesigner.Views.MachineVersionDialog"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:providers="clr-namespace:Tango.MachineStudio.MachineDesigner.AutoComplete"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:local="clr-namespace:Tango.MachineStudio.MachineDesigner.Views"
+ mc:Ignorable="d" Width="530" Height="239" Background="White">
+
+ <UserControl.Resources>
+ <providers:MachineVersionsProvider x:Key="VersionsProvider"></providers:MachineVersionsProvider>
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="50"/>
+ <RowDefinition Height="1*"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <StackPanel Orientation="Horizontal" Margin="10">
+ <materialDesign:PackIcon Width="24" Height="24" Kind="Verified" VerticalAlignment="Center"></materialDesign:PackIcon>
+ <TextBlock Text="Default Version Configuration" VerticalAlignment="Center" Margin="10 0 0 0" FontSize="16"></TextBlock>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Row="1" Margin="10">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="Auto"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <StackPanel Margin="10">
+ <TextBlock>Version</TextBlock>
+ <ComboBox ItemsSource="{Binding Adapter.MachineVersions}" Text="{Binding Version}" DisplayMemberPath="Version" SelectedItem="{Binding SelectedVersion}" IsEditable="True" materialDesign:HintAssist.Hint="Select or enter a new version name"></ComboBox>
+ <TextBlock Margin="0 10 0 0">Name</TextBlock>
+ <TextBox materialDesign:HintAssist.Hint="Version name" Text="{Binding VersionName}">
+ <TextBox.Style>
+ <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
+ <Setter Property="IsEnabled" Value="False"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding SelectedVersion}" Value="{x:Null}">
+ <Setter Property="IsEnabled" Value="True"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </TextBox.Style>
+ </TextBox>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Row="1">
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
+ <Button Command="{Binding AcceptCommand}" Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 8 8 0">
+ ACCEPT
+ </Button>
+ <Button Command="{Binding CancelCommand}" Style="{StaticResource MaterialDesignFlatButton}" IsCancel="False" Margin="0 8 8 0">
+ CANCEL
+ </Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml.cs
new file mode 100644
index 000000000..3d59d7cda
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineVersionDialog.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.MachineDesigner.Views
+{
+ /// <summary>
+ /// Interaction logic for MachineVersionDialog.xaml
+ /// </summary>
+ public partial class MachineVersionDialog : UserControl
+ {
+ public MachineVersionDialog()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml
new file mode 100644
index 000000000..4d75651f7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml
@@ -0,0 +1,327 @@
+<UserControl x:Class="Tango.MachineStudio.MachineDesigner.Views.MachineView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:dragAndDrop="clr-namespace:Tango.DragAndDrop;assembly=Tango.DragAndDrop"
+ xmlns:global="clr-namespace:Tango.MachineStudio.MachineDesigner"
+ xmlns:fa="http://schemas.fontawesome.io/icons/"
+ xmlns:providers="clr-namespace:Tango.MachineStudio.MachineDesigner.AutoComplete"
+ xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.MachineDesigner.ViewModels"
+ xmlns:local="clr-namespace:Tango.MachineStudio.MachineDesigner.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <sharedConverters:ColorToIntegerConverter x:Key="ColorToIntegerConverter" />
+ <providers:MachinesProvider x:Key="MachinesProvider"></providers:MachinesProvider>
+
+ <Style x:Key="draggableGrid" TargetType="Grid">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ </Style>
+
+ <Style TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}">
+ <Setter Property="HeaderTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <TextBlock Text="{Binding}" FontSize="13"></TextBlock>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <Viewbox MaxWidth="1200" Grid.Row="1" >
+ <Grid VerticalAlignment="Top">
+
+ <Image IsHitTestVisible="False" Source="../Images/machine-full-fx.png" MaxWidth="800" RenderOptions.BitmapScalingMode="Fant">
+ <Image.Effect>
+ <DropShadowEffect ShadowDepth="0" BlurRadius="20" Opacity="1" RenderingBias="Performance" Color="DimGray"></DropShadowEffect>
+ </Image.Effect>
+ </Image>
+
+ <Canvas ClipToBounds="False" x:Name="canvas">
+
+ <Grid x:Name="hardwareGrid" Style="{StaticResource draggableGrid}" Width="118" Height="27" Canvas.Left="342" Canvas.Top="80" Background="#6B303030" IsHitTestVisible="True">
+ <Border BorderBrush="#6C6C6C" BorderThickness="1" IsHitTestVisible="False">
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/hardware.png" Width="10" VerticalAlignment="Center" Margin="5" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="2 0 2 0" VerticalAlignment="Center" TextAlignment="Center" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="6" TextWrapping="Wrap">
+ <Run Text="{Binding Configuration.HardwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.HardwareVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+ </Border>
+ </Grid>
+
+ <TextBlock Canvas.Left="532" FontStyle="Italic" Foreground="Gray" Canvas.Top="-22">Hardware</TextBlock>
+ <Grid Width="97" Height="90" Canvas.Left="431" Canvas.Top="-13">
+ <Rectangle Stroke="Gray" VerticalAlignment="Top" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="222" Canvas.Left="446" FontStyle="Italic" Foreground="Gray">Add IDS</TextBlock>
+ <Grid Width="23" Height="20" Canvas.Top="231" Canvas.Left="414">
+ <Rectangle Stroke="Gray" VerticalAlignment="Top" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="255" Canvas.Left="500" FontStyle="Italic" Foreground="Gray">Remove IDS</TextBlock>
+ <Grid Width="35" Height="8" Canvas.Top="264" Canvas.Left="460">
+ <Rectangle Stroke="Gray" VerticalAlignment="Top" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <Button Style="{StaticResource MaterialDesignFlatButton}" Height="24" Width="24" Padding="0" Canvas.Left="402" Canvas.Top="253">
+ <materialDesign:PackIcon Kind="Plus" Width="24" Height="24"></materialDesign:PackIcon>
+ </Button>
+
+ <Button Style="{StaticResource MaterialDesignFlatButton}" Height="24" Width="24" Padding="0" Canvas.Left="430" Canvas.Top="252">
+ <materialDesign:PackIcon Kind="Minus" Width="24" Height="24"></materialDesign:PackIcon>
+ </Button>
+
+ <Grid x:Name="gridIds" Width="310" Height="195" Canvas.Top="314" Canvas.Left="420">
+ <ListBox ItemsSource="{Binding Configuration.IdsPacks}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
+ <ListBox.ItemContainerStyle>
+ <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
+ <Setter Property="Padding" Value="0"></Setter>
+ <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
+ <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
+ </Style>
+ </ListBox.ItemContainerStyle>
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <UniformGrid Columns="8"></UniformGrid>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <Grid dragAndDrop:DragAndDropService.DraggableBorderBrush="{StaticResource AccentColorBrush}" >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="30"/>
+ </Grid.RowDefinitions>
+ <Grid.Style>
+ <Style TargetType="Grid" BasedOn="{StaticResource draggableGrid}">
+ <Style.Triggers>
+
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <UniformGrid Columns="1" Rows="2">
+ <Grid Margin="2">
+ <Image IsHitTestVisible="False" Source="../Images/dispenser.png" RenderOptions.BitmapScalingMode="Fant">
+ <Image.Style>
+ <Style TargetType="Image">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding DispenserType}" Value="{x:Null}">
+ <Setter Property="Opacity" Value="0.2"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Image.Style>
+ </Image>
+ <Rectangle IsHitTestVisible="False" Margin="14 25 13 34">
+ <Rectangle.Fill>
+ <LinearGradientBrush StartPoint="0,0" EndPoint="0,0.8" Opacity="0.8">
+ <GradientStop Offset="0" Color="Transparent" />
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ </LinearGradientBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+ </Grid>
+
+ <Grid Margin="2">
+ <Image IsHitTestVisible="False" Stretch="Fill" Source="../Images/mid-tank.png" RenderOptions.BitmapScalingMode="Fant">
+ <Image.Style>
+ <Style TargetType="Image">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding MidTankType}" Value="{x:Null}">
+ <Setter Property="Opacity" Value="0.2"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Image.Style>
+ </Image>
+ <Rectangle IsHitTestVisible="False" Margin="4 25 4 1">
+ <Rectangle.Fill>
+ <LinearGradientBrush StartPoint="0,0" EndPoint="0,0.8" Opacity="0.8">
+ <GradientStop Offset="0" Color="Transparent" />
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ </LinearGradientBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+ </Grid>
+ </UniformGrid>
+
+ <Grid Grid.Row="1" Margin="3" IsHitTestVisible="False">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding CartridgeType}" Value="{x:Null}">
+ <Setter Property="Opacity" Value="0.2"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <Border BorderBrush="#252525" BorderThickness="1" CornerRadius="3">
+ <Border.Background>
+ <LinearGradientBrush>
+ <GradientStop Color="#FF252525"/>
+ <GradientStop Color="#FF838383" Offset="1"/>
+ </LinearGradientBrush>
+ </Border.Background>
+ </Border>
+ <Border BorderBrush="#252525" BorderThickness="1" CornerRadius="3">
+ <Border.Background>
+ <LinearGradientBrush Opacity="0.7">
+ <GradientStop Offset="0" Color="Transparent" />
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ </LinearGradientBrush>
+ </Border.Background>
+ </Border>
+ </Grid>
+ </Grid>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ListBox>
+
+ <Grid Margin="0 50 0 0">
+ <Grid.Style>
+ <Style TargetType="Grid">
+ <Setter Property="Visibility" Value="Hidden"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding Configuration.IdsPacks.Count}" Value="0">
+ <Setter Property="Visibility" Value="Visible"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" Foreground="Gainsboro">NO IDS PACKS</TextBlock>
+ </Grid>
+
+ <Rectangle VerticalAlignment="Bottom" Stroke="DimGray" StrokeThickness="1">
+ <Rectangle.Effect>
+ <DropShadowEffect ShadowDepth="1" Opacity="1" Color="Black" />
+ </Rectangle.Effect>
+ </Rectangle>
+ </Grid>
+
+ <Grid x:Name="gridEmbedded" Style="{StaticResource draggableGrid}" Width="70" Height="100" Canvas.Left="80" Canvas.Top="331" IsHitTestVisible="True" SnapsToDevicePixels="True">
+ <Image Source="../Images/ti-tm4c129x.png" RenderOptions.BitmapScalingMode="Fant"></Image>
+ </Grid>
+
+ <Grid Width="61" IsHitTestVisible="True" SnapsToDevicePixels="True" ClipToBounds="True" Height="42" Canvas.Left="85" Canvas.Top="385">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*" />
+ <RowDefinition Height="1*" />
+ </Grid.RowDefinitions>
+
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/embedded.png" Width="10" VerticalAlignment="Center" Margin="1" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock VerticalAlignment="Center" Padding="1" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="5" TextAlignment="Center" TextWrapping="Wrap" Height="15" Margin="0,6,0,0" Width="47"><Run Text="{Binding Configuration.EmbeddedFirmwareVersion.Name}"/><Run Text=" "/><Run Text="{Binding Configuration.EmbeddedFirmwareVersion.Version}"/></TextBlock>
+ </StackPanel>
+ <StackPanel Grid.Row="1" Orientation="Horizontal">
+ <Image Source="../Images/embedded-software.png" Width="10" VerticalAlignment="Center" Margin="1" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="1" IsHitTestVisible="False" VerticalAlignment="Center" Foreground="Gainsboro" FontSize="5" TextAlignment="Center" TextWrapping="Wrap" Height="14" Margin="0,6,0,1" Width="47">
+ <Run Text="{Binding Configuration.EmbeddedSoftwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.EmbeddedSoftwareVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+ </Grid>
+
+ <TextBlock Canvas.Top="163" Canvas.Left="288" FontStyle="Italic" Foreground="Gray">Touch Panel</TextBlock>
+ <Grid Width="53" Height="55" Canvas.Top="184" Canvas.Left="279">
+ <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Right" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="441" Canvas.Left="156" FontStyle="Italic" Foreground="Gray">Embedded Firmware</TextBlock>
+ <Grid Width="82" Height="26" Canvas.Top="410" Canvas.Left="158">
+ <Rectangle Stroke="Gray" VerticalAlignment="Top" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Right" StrokeThickness="1" StrokeDashArray="6" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="310" Canvas.Left="340" FontStyle="Italic" Foreground="Gray">Dispensers</TextBlock>
+ <Grid Width="53" Height="20" Canvas.Top="331" Canvas.Left="377">
+ <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="395" Canvas.Left="331" FontStyle="Italic" Foreground="Gray">Mid Tanks</TextBlock>
+ <Grid Width="62" Height="29" Canvas.Top="418" Canvas.Left="357">
+ <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <TextBlock Canvas.Top="469" Canvas.Left="304" FontStyle="Italic" Foreground="Gray">Cartridges</TextBlock>
+ <Grid Width="87" Height="10" Canvas.Top="487" Canvas.Left="332">
+ <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/>
+ </Grid>
+
+ <Grid x:Name="gridTablet" Width="67" IsHitTestVisible="True" SnapsToDevicePixels="True" ClipToBounds="True" Height="90" Canvas.Left="188" Canvas.Top="198">
+ <Grid.Style>
+ <Style TargetType="Grid" BasedOn="{StaticResource draggableGrid}">
+ <Setter Property="Background" Value="#2B2B2B"></Setter>
+ <Style.Triggers>
+ <Trigger Property="dragAndDrop:DragAndDropService.IsDraggableOver" Value="True">
+ <Setter Property="Background" Value="Black"></Setter>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Style>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*" />
+ <RowDefinition Height="1*" />
+ <RowDefinition Height="1*" />
+ <RowDefinition Height="1*" />
+ </Grid.RowDefinitions>
+
+ <StackPanel>
+ <Image Source="../Images/tablet.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="2 0 2 0" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
+ <Run Text="{Binding Configuration.ApplicationDisplayPanelVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationDisplayPanelVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+
+ <StackPanel Grid.Row="2" >
+ <Image Source="../Images/app.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
+ <Run Text="{Binding Configuration.ApplicationVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+
+
+ <StackPanel Grid.Row="3" >
+ <Image Source="../Images/application-firmware.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
+ <Run Text="{Binding Configuration.ApplicationFirmwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationFirmwareVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+
+ <StackPanel Grid.Row="1" >
+ <Image Source="../Images/android.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
+ <Run Text="{Binding Configuration.ApplicationOsVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationOsVersion.Version}"></Run>
+ </TextBlock>
+ </StackPanel>
+ </Grid>
+ </Canvas>
+ </Grid>
+ </Viewbox>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml.cs
new file mode 100644
index 000000000..67fa0d5bf
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MachineView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.MachineDesigner.Views
+{
+ /// <summary>
+ /// Interaction logic for MachineView.xaml
+ /// </summary>
+ public partial class MachineView : UserControl
+ {
+ public MachineView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml
index 5324959e4..6257fa2af 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml
@@ -13,7 +13,7 @@
xmlns:vm="clr-namespace:Tango.MachineStudio.MachineDesigner.ViewModels"
xmlns:local="clr-namespace:Tango.MachineStudio.MachineDesigner.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" Background="White" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
+ d:DesignHeight="720" d:DesignWidth="1280" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">
<UserControl.Resources>
<sharedConverters:ColorToIntegerConverter x:Key="ColorToIntegerConverter" />
@@ -123,8 +123,8 @@
<StackPanel Orientation="Horizontal">
<Image Source="../Images/hardware.png" Width="10" VerticalAlignment="Center" Margin="5" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="2 0 2 0" VerticalAlignment="Center" TextAlignment="Center" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="6" TextWrapping="Wrap">
- <Run Text="{Binding Configuration.HardwareVersions.Name}"></Run>
- <Run Text="{Binding Configuration.HardwareVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.HardwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.HardwareVersion.Version}"></Run>
</TextBlock>
</StackPanel>
</Border>
@@ -189,7 +189,7 @@
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
- <DataTrigger Binding="{Binding Dispenser}" Value="{x:Null}">
+ <DataTrigger Binding="{Binding DispenserType}" Value="{x:Null}">
<Setter Property="Opacity" Value="0.2"></Setter>
</DataTrigger>
</Style.Triggers>
@@ -200,7 +200,7 @@
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,0.8" Opacity="0.8">
<GradientStop Offset="0" Color="Transparent" />
- <GradientStop Offset="1" Color="{Binding LiquidTypes.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
@@ -211,7 +211,7 @@
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
- <DataTrigger Binding="{Binding MidTankTypes}" Value="{x:Null}">
+ <DataTrigger Binding="{Binding MidTankType}" Value="{x:Null}">
<Setter Property="Opacity" Value="0.2"></Setter>
</DataTrigger>
</Style.Triggers>
@@ -222,10 +222,16 @@
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,0.8" Opacity="0.8">
<GradientStop Offset="0" Color="Transparent" />
- <GradientStop Offset="1" Color="{Binding LiquidTypes.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
+
+ <TextBlock Text="{Binding IdsPackFormula.Name}" TextWrapping="Wrap" Height="30" IsHitTestVisible="False" Width="50" Margin="-20 15 0 0" FontSize="7" TextAlignment="Center" RenderTransformOrigin="0.5,0.5" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center">
+ <TextBlock.LayoutTransform>
+ <RotateTransform Angle="90" />
+ </TextBlock.LayoutTransform>
+ </TextBlock>
</Grid>
</UniformGrid>
@@ -233,7 +239,7 @@
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
- <DataTrigger Binding="{Binding CartridgeTypes}" Value="{x:Null}">
+ <DataTrigger Binding="{Binding CartridgeType}" Value="{x:Null}">
<Setter Property="Opacity" Value="0.2"></Setter>
</DataTrigger>
</Style.Triggers>
@@ -251,7 +257,7 @@
<Border.Background>
<LinearGradientBrush Opacity="0.7">
<GradientStop Offset="0" Color="Transparent" />
- <GradientStop Offset="1" Color="{Binding LiquidTypes.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
+ <GradientStop Offset="1" Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
</LinearGradientBrush>
</Border.Background>
</Border>
@@ -294,13 +300,13 @@
<StackPanel Orientation="Horizontal">
<Image Source="../Images/embedded.png" Width="10" VerticalAlignment="Center" Margin="1" RenderOptions.BitmapScalingMode="Fant"></Image>
- <TextBlock VerticalAlignment="Center" Padding="1" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="5" TextAlignment="Center" TextWrapping="Wrap" Height="15" Margin="0,6,0,0" Width="47"><Run Text="{Binding Configuration.EmbeddedFirmwareVersions.Name}"/><Run Text=" "/><Run Text="{Binding Configuration.EmbeddedFirmwareVersions.Version}"/></TextBlock>
+ <TextBlock VerticalAlignment="Center" Padding="1" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="5" TextAlignment="Center" TextWrapping="Wrap" Height="15" Margin="0,6,0,0" Width="47"><Run Text="{Binding Configuration.EmbeddedFirmwareVersion.Name}"/><Run Text=" "/><Run Text="{Binding Configuration.EmbeddedFirmwareVersion.Version}"/></TextBlock>
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Image Source="../Images/embedded-software.png" Width="10" VerticalAlignment="Center" Margin="1" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="1" IsHitTestVisible="False" VerticalAlignment="Center" Foreground="Gainsboro" FontSize="5" TextAlignment="Center" TextWrapping="Wrap" Height="14" Margin="0,6,0,1" Width="47">
- <Run Text="{Binding Configuration.EmbeddedSoftwareVersions.Name}"></Run>
- <Run Text="{Binding Configuration.EmbeddedSoftwareVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.EmbeddedSoftwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.EmbeddedSoftwareVersion.Version}"></Run>
</TextBlock>
</StackPanel>
</Grid>
@@ -356,16 +362,16 @@
<StackPanel>
<Image Source="../Images/tablet.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="2 0 2 0" Foreground="Gainsboro" IsHitTestVisible="False" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
- <Run Text="{Binding Configuration.ApplicationDisplayPanelVersions.Name}"></Run>
- <Run Text="{Binding Configuration.ApplicationDisplayPanelVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.ApplicationDisplayPanelVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationDisplayPanelVersion.Version}"></Run>
</TextBlock>
</StackPanel>
<StackPanel Grid.Row="2" >
<Image Source="../Images/app.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
- <Run Text="{Binding Configuration.ApplicationVersions.Name}"></Run>
- <Run Text="{Binding Configuration.ApplicationVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.ApplicationVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationVersion.Version}"></Run>
</TextBlock>
</StackPanel>
@@ -373,16 +379,16 @@
<StackPanel Grid.Row="3" >
<Image Source="../Images/application-firmware.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
- <Run Text="{Binding Configuration.ApplicationFirmwareVersions.Name}"></Run>
- <Run Text="{Binding Configuration.ApplicationFirmwareVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.ApplicationFirmwareVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationFirmwareVersion.Version}"></Run>
</TextBlock>
</StackPanel>
<StackPanel Grid.Row="1" >
<Image Source="../Images/android.png" Width="10" Margin="2" RenderOptions.BitmapScalingMode="Fant"></Image>
<TextBlock Padding="2 0 2 0" IsHitTestVisible="False" Foreground="Gainsboro" FontSize="6" TextAlignment="Center" TextWrapping="Wrap">
- <Run Text="{Binding Configuration.ApplicationOsVersions.Name}"></Run>
- <Run Text="{Binding Configuration.ApplicationOsVersions.Version}"></Run>
+ <Run Text="{Binding Configuration.ApplicationOsVersion.Name}"></Run>
+ <Run Text="{Binding Configuration.ApplicationOsVersion.Version}"></Run>
</TextBlock>
</StackPanel>
</Grid>
@@ -403,19 +409,23 @@
<StackPanel Margin="20 0 0 0">
<StackPanel Orientation="Horizontal" Margin="0 3 0 3">
<Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/injection.png" Width="12" VerticalAlignment="Center"></Image>
- <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Dispenser:</Run> <Run FontStyle="Italic" Text="{Binding Dispenser.SerialNumber}"></Run></TextBlock>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Dispenser:</Run> <Run FontStyle="Italic" Text="{Binding DispenserType.Name}"></Run></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0 3 0 3">
- <Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/cartridge.png" Width="12" VerticalAlignment="Center"></Image>
- <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Cartridge:</Run> <Run FontStyle="Italic" Text="{Binding CartridgeTypes.Name}"></Run></TextBlock>
+ <Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/tank.png" Width="12" VerticalAlignment="Center"></Image>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Mid Tank:</Run> <Run FontStyle="Italic" Text="{Binding MidTankType.Name}"></Run></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0 3 0 3">
- <Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/tank.png" Width="12" VerticalAlignment="Center"></Image>
- <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Mid Tank:</Run> <Run FontStyle="Italic" Text="{Binding MidTankTypes.Name}"></Run></TextBlock>
+ <Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/cartridge.png" Width="12" VerticalAlignment="Center"></Image>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Cartridge:</Run> <Run FontStyle="Italic" Text="{Binding CartridgeType.Name}"></Run></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0 3 0 3">
<Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/liquid.png" Width="12" VerticalAlignment="Center"></Image>
- <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Liquid:</Run> <Run FontStyle="Italic" Text="{Binding LiquidTypes.Name}"></Run></TextBlock>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Liquid:</Run> <Run FontStyle="Italic" Text="{Binding LiquidType.Name}"></Run></TextBlock>
+ </StackPanel>
+ <StackPanel Orientation="Horizontal" Margin="0 3 0 3">
+ <Image RenderOptions.BitmapScalingMode="Fant" Source="../Images/formula.png" Width="12" VerticalAlignment="Center"></Image>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center"><Run FontWeight="Bold">Formula:</Run> <Run FontStyle="Italic" Text="{Binding IdsPackFormula.Name}"></Run></TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
@@ -431,7 +441,7 @@
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition/>
- <RowDefinition Height="70"/>
+ <RowDefinition Height="60"/>
</Grid.RowDefinitions>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<Grid>
@@ -447,7 +457,14 @@
<TextBox Text="{Binding Machine.Name,UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBlock Margin="0 15 0 0" FontSize="10" Foreground="Gray">Machine Version</TextBlock>
- <ComboBox ItemsSource="{Binding Adapter.MachineVersions}" SelectedItem="{Binding Machine.MachineVersions}" DisplayMemberPath="Name"></ComboBox>
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="1*"></ColumnDefinition>
+ <ColumnDefinition Width="80"></ColumnDefinition>
+ </Grid.ColumnDefinitions>
+ <ComboBox ItemsSource="{Binding Adapter.MachineVersions}" SelectedItem="{Binding Machine.MachineVersion}" DisplayMemberPath="Name"></ComboBox>
+ <Button Grid.Column="1" Command="{Binding SetVersionConfigurationCommand}" Height="25" Margin="10 2 2 2" ToolTip="Sets the current configuration to the selected machine version default configuration">SET</Button>
+ </Grid>
<TextBlock Margin="0 15 0 0" FontSize="10" Foreground="Gray">Organization</TextBlock>
<ComboBox ItemsSource="{Binding Adapter.Organizations}" SelectedItem="{Binding Machine.Organization}" DisplayMemberPath="Name"></ComboBox>
@@ -502,7 +519,7 @@
<materialDesign:Card Margin="5,10,5,0" Background="{DynamicResource MaterialDesignBackground}">
<StackPanel>
<Expander HorizontalAlignment="Stretch" Header="Dispensers">
- <ListBox ItemsSource="{Binding Adapter.DispensersViewSource}" HorizontalContentAlignment="Stretch">
+ <ListBox ItemsSource="{Binding Adapter.DispenserTypesViewSource}" HorizontalContentAlignment="Stretch">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
@@ -516,8 +533,7 @@
<StackPanel Orientation="Horizontal" Margin="2 8">
<Image IsHitTestVisible="False" Width="24" Height="24" Source="../Images/injection.png" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant"></Image>
<StackPanel Margin="5 0 0 0" IsHitTestVisible="False">
- <TextBlock IsHitTestVisible="False" FontSize="10" Foreground="DimGray"><Run Text="{Binding DispenserTypes.Name}"></Run></TextBlock>
- <TextBlock IsHitTestVisible="False" FontSize="10" Foreground="DimGray" Margin="0 2 0 0"><Run Text="{Binding SerialNumber}"></Run></TextBlock>
+ <TextBlock IsHitTestVisible="False" FontSize="10" Foreground="DimGray"><Run Text="{Binding Name}"></Run></TextBlock>
</StackPanel>
</StackPanel>
@@ -612,6 +628,32 @@
</ListBox>
</Expander>
<Border Height="1" HorizontalAlignment="Stretch" Background="{DynamicResource MaterialDesignDivider}" SnapsToDevicePixels="True" />
+ <Expander HorizontalAlignment="Stretch" Header="Formulas">
+ <ListBox ItemsSource="{Binding Adapter.IdsPackFormulasViewSource}" HorizontalContentAlignment="Stretch">
+ <ListBox.ItemContainerStyle>
+ <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
+ <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
+ <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
+ <Setter Property="Padding" Value="1"></Setter>
+ </Style>
+ </ListBox.ItemContainerStyle>
+ <ListBox.ItemTemplate>
+ <DataTemplate>
+ <Grid Background="Transparent" IsHitTestVisible="True" dragAndDrop:DragAndDropService.DraggableBorderBrush="{StaticResource AccentColorBrush}" dragAndDrop:DragAndDropService.Draggable="True" dragAndDrop:DragAndDropService.DraggingSurface="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}">
+ <StackPanel Orientation="Horizontal" Margin="2 8">
+ <Image IsHitTestVisible="False" Width="24" Height="24" Source="../Images/formula.png" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <StackPanel Margin="5 0 0 0" IsHitTestVisible="False">
+ <TextBlock IsHitTestVisible="False" FontSize="10" Foreground="DimGray"><Run Text="{Binding Name}"></Run></TextBlock>
+ </StackPanel>
+ </StackPanel>
+
+ <Rectangle Margin="0 10 0 0" VerticalAlignment="Bottom" Stroke="Gainsboro" StrokeThickness="1"></Rectangle>
+ </Grid>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+ </Expander>
+ <Border Height="1" HorizontalAlignment="Stretch" Background="{DynamicResource MaterialDesignDivider}" SnapsToDevicePixels="True" />
<Expander HorizontalAlignment="Stretch" Header="Touch Panels">
<ListBox ItemsSource="{Binding Adapter.ApplicationDisplayPanelVersionsViewSource}" HorizontalContentAlignment="Stretch">
<ListBox.ItemContainerStyle>
@@ -807,12 +849,24 @@
</ScrollViewer>
<Grid Grid.Row="1" Margin="10">
- <Button Height="50" Command="{Binding SaveCommand}" Margin="0 0 15 0">
- <StackPanel Orientation="Horizontal">
- <materialDesign:PackIcon Width="24" Height="24" VerticalAlignment="Center" Kind="ContentSaveSettings"></materialDesign:PackIcon>
- <TextBlock FontSize="18" Margin="10 0 0 0" VerticalAlignment="Center">SAVE</TextBlock>
- </StackPanel>
- </Button>
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="61*"/>
+ <ColumnDefinition Width="84*"/>
+ </Grid.ColumnDefinitions>
+ <Button Height="Auto" Command="{Binding SaveCommand}" Margin="0 0 5 0">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Width="20" Height="20" VerticalAlignment="Center" Kind="ContentSaveSettings"></materialDesign:PackIcon>
+ <TextBlock FontSize="14" Margin="10 0 0 0" VerticalAlignment="Center">SAVE</TextBlock>
+ </StackPanel>
+ </Button>
+ <Button ToolTip="Set this configuration as a default machine configuration" Height="Auto" Background="#FF5C5C" BorderBrush="#FF5C5C" Command="{Binding SetAsDefaultCommand}" Margin="0 0 15 0" Grid.Column="1">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Width="20" Height="20" VerticalAlignment="Center" Kind="Verified"></materialDesign:PackIcon>
+ <TextBlock FontSize="14" Margin="10 0 0 0" VerticalAlignment="Center">SET DEFAULT</TextBlock>
+ </StackPanel>
+ </Button>
+ </Grid>
</Grid>
</Grid>
</Grid>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs
index 44ce75c12..528bb3457 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs
@@ -14,7 +14,7 @@ using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.DragAndDrop;
using Tango.MachineStudio.MachineDesigner.ViewModels;
@@ -62,7 +62,7 @@ namespace Tango.MachineStudio.MachineDesigner.Views
{
SetHighlightRegion(hardwareGrid);
}
- else if (e.DataContext is ApplicationVersion || e.DataContext is ApplicationOsVersion || e.DataContext is ApplicationDisplayPanelVersion)
+ else if (e.DataContext is ApplicationVersion || e.DataContext is ApplicationOsVersion || e.DataContext is ApplicationDisplayPanelVersion || e.DataContext is ApplicationFirmwareVersion)
{
SetHighlightRegion(gridTablet);
}
@@ -70,7 +70,7 @@ namespace Tango.MachineStudio.MachineDesigner.Views
{
SetHighlightRegion(gridEmbedded);
}
- else if (e.DataContext is Dispenser || e.DataContext is Cartridge || e.DataContext is LiquidType || e.DataContext is MidTankType)
+ else if (e.DataContext is DispenserType || e.DataContext is CartridgeType || e.DataContext is LiquidType || e.DataContext is MidTankType || e.DataContext is IdsPackFormula)
{
SetHighlightRegion(gridIds);
}
@@ -86,9 +86,9 @@ namespace Tango.MachineStudio.MachineDesigner.Views
private void OnDropOnIdsPack(object sender, DropEventArgs e)
{
- if (e.Draggable.DataContext is Dispenser)
+ if (e.Draggable.DataContext is DispenserType)
{
- _vm.DropDispenser(e.Draggable.DataContext as Dispenser, e.Droppable.DataContext as IdsPack);
+ _vm.DropDispenserType(e.Draggable.DataContext as DispenserType, e.Droppable.DataContext as IdsPack);
}
else if (e.Draggable.DataContext is LiquidType)
{
@@ -102,6 +102,10 @@ namespace Tango.MachineStudio.MachineDesigner.Views
{
_vm.DropMidTankType(e.Draggable.DataContext as MidTankType, e.Droppable.DataContext as IdsPack);
}
+ else if (e.Draggable.DataContext is IdsPackFormula)
+ {
+ _vm.DropIdsFormula(e.Draggable.DataContext as IdsPackFormula, e.Droppable.DataContext as IdsPack);
+ }
else if (e.Draggable.DataContext is IdsPack)
{
_vm.DropIdsPack(e.Draggable.DataContext as IdsPack, e.Droppable.DataContext as IdsPack);
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubManager.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubManager.cs
index 8e0eafa3a..1808e2a53 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubManager.cs
@@ -20,7 +20,7 @@ namespace Tango.MachineStudio.Stubs
/// </summary>
public class StubManager
{
- private ITransportAdapter _adapter; //Holds the USB transport adapter.
+ public ITransportAdapter Adapter { get; private set; }
/// <summary>
/// Occurs when the stub has failed to execute.
@@ -48,7 +48,7 @@ namespace Tango.MachineStudio.Stubs
/// <param name="adapter">The adapter.</param>
public StubManager(ITransportAdapter adapter)
{
- _adapter = adapter;
+ Adapter = adapter;
}
/// <summary>
@@ -121,13 +121,13 @@ namespace Tango.MachineStudio.Stubs
Task.Factory.StartNew(() =>
{
- _adapter.Write(requestData);
+ Adapter.Write(requestData);
DateTime startTime = DateTime.Now;
MessageContainer responseContainer = null;
- _adapter.DataAvailable += (sender, data) =>
+ Adapter.DataAvailable += (sender, data) =>
{
responseContainer = MessageFactory.ParseContainer(data);
};
@@ -144,7 +144,7 @@ namespace Tango.MachineStudio.Stubs
}
}
- IMessage message = MessageFactory.ParseMessageFromContainer(responseContainer);
+ IMessage message = MessageFactory.ExtractMessageFromContainer(responseContainer);
OnCompleted(JsonConvert.SerializeObject(message, Formatting.Indented));
done = true;
});
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubsModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubsModule.cs
index 2c4b6c76e..817c68b49 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubsModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/StubsModule.cs
@@ -5,35 +5,50 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Stubs.Views;
using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.Stubs
{
- public class StubsModule : IStudioModule
+ /// <summary>
+ /// Represents a stubs execution Machine Studio module capable of executing stubs against the current connected machine using a C# script engine.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public class StubsModule : StudioModuleBase
{
- public string Name => "Stubs";
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Stubs";
- public string Description => "Execute machine tests using an interactive C# scripting editor";
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Execute machine tests using an interactive C# scripting editor";
- public BitmapSource Image => ResourceHelper.GetImageFromResources("Images/stubs.jpg");
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/stubs.jpg");
- public FrameworkElement MainView => new MainView();
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MainView();
- public Permissions Permission => Permissions.RunSynchronizationModule;
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunSynchronizationModule;
- public bool IsInitialized => true;
-
- public void Dispose()
- {
- //throw new NotImplementedException();
- }
-
- public void Initialize()
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
{
- //throw new NotImplementedException();
+
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Tango.MachineStudio.Stubs.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Tango.MachineStudio.Stubs.csproj
index 436a8b3ff..c9670d1be 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Tango.MachineStudio.Stubs.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Tango.MachineStudio.Stubs.csproj
@@ -135,10 +135,6 @@
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
<Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
<Name>Tango.Integration</Name>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModels/MainViewVM.cs
index 48297c418..6797b15e6 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModels/MainViewVM.cs
@@ -21,10 +21,10 @@ using Tango.Transport.Adapters;
namespace Tango.MachineStudio.Stubs.ViewModels
{
/// <summary>
- /// Represents the script execution utility main view model.
+ /// Represents the script execution module main view model.
/// </summary>
/// <seealso cref="Tango.SharedUI.ViewModel" />
- public class MainViewVM : ViewModel
+ public class MainViewVM : ViewModel , IShutdownListener
{
private UsbTransportAdapter _adapter; //Holds the USB transport adapter.
private StubManager _stubManager;
@@ -41,7 +41,19 @@ namespace Tango.MachineStudio.Stubs.ViewModels
public bool UseConnectedMachine
{
get { return _useConnectedMachine; }
- set { _useConnectedMachine = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
+ set
+ {
+ _useConnectedMachine = value;
+
+ if (_useConnectedMachine && !ApplicationManager.IsMachineConnected)
+ {
+ _notification.ShowError("No connected machine found.");
+ _useConnectedMachine = false;
+ }
+
+ RaisePropertyChangedAuto();
+ InvalidateRelayCommands();
+ }
}
/// <summary>
@@ -251,13 +263,13 @@ namespace Tango.MachineStudio.Stubs.ViewModels
"COM9",
};
- SelectedPort = SettingsManager.Default.StubsUI.SelectedPort != null ? SettingsManager.Default.StubsUI.SelectedPort : Ports.First();
+ SelectedPort = SettingsManager.Default.MachineStudio.StubsModule.SelectedPort != null ? SettingsManager.Default.MachineStudio.StubsModule.SelectedPort : Ports.First();
Status = "Ready";
- if (SettingsManager.Default.StubsUI.LastTabs.Count > 0)
+ if (SettingsManager.Default.MachineStudio.StubsModule.LastTabs.Count > 0)
{
- foreach (var file in SettingsManager.Default.StubsUI.LastTabs)
+ foreach (var file in SettingsManager.Default.MachineStudio.StubsModule.LastTabs)
{
if (File.Exists(file))
{
@@ -269,8 +281,6 @@ namespace Tango.MachineStudio.Stubs.ViewModels
{
CreateNewTab();
}
-
- Application.Current.Exit += Current_Exit;
}
#endregion
@@ -513,11 +523,14 @@ namespace Tango.MachineStudio.Stubs.ViewModels
Status = "Completed";
}
- private void Current_Exit(object sender, ExitEventArgs e)
+ /// <summary>
+ /// Called when [shutdown request].
+ /// </summary>
+ /// <returns></returns>
+ public void OnShuttingDown()
{
SettingsManager.Default.MachineStudio.StubsModule.SelectedPort = SelectedPort;
SettingsManager.Default.MachineStudio.StubsModule.LastTabs = CodeTabs.Select(x => x.File).ToList();
- SettingsManager.SaveDefaultSettings();
}
#endregion
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml
index 7f6039110..f1254db47 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml
@@ -199,7 +199,42 @@
<Grid>
<TabControl x:Name="tabControl" Margin="5" ItemsSource="{Binding CodeTabs}" SelectedItem="{Binding SelectedCodeTab}">
-
+ <TabControl.Resources>
+ <Style BasedOn="{StaticResource MetroTabItem}" TargetType="{x:Type TabItem}">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}" Value="True">
+ <Setter Property="Background" Value="#007ACC"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="12"></Setter>
+ <Setter Property="HeaderTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Border>
+ <StackPanel Orientation="Horizontal">
+ <mahapps:ProgressRing Width="5" Height="5" Margin="0 0 5 0" Foreground="White" Visibility="{Binding IsRunning,Converter={StaticResource BooleanToVisibilityConverter}}"></mahapps:ProgressRing>
+ <TextBlock Text="{Binding Title}" ToolTip="{Binding File}" Foreground="Gainsboro" VerticalAlignment="Center"></TextBlock>
+ <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.CloseTabCommand}" CommandParameter="{Binding}" Margin="5 0 0 0" Cursor="Hand" Width="24" Height="24" VerticalAlignment="Center" Style="{DynamicResource MetroCircleButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0">
+ <StackPanel Orientation="Horizontal">
+ <fa:ImageAwesome Width="10" Height="10" Icon="Close" Foreground="Gainsboro"></fa:ImageAwesome>
+ </StackPanel>
+ </Button>
+ </StackPanel>
+ </Border>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Grid Background="#181818">
+ <controls:ScriptEditorControl Text="{Binding Code,Mode=TwoWay}" InsertSnippetCommand="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.InsertSnippetCommand,Mode=TwoWay}" SaveCommand="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.SaveCommand}" HighlightTypes="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.HighlightTypes}" RunCommand="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RunCommand}" StopCommand="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.StopCommand}" />
+ </Grid>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </TabControl.Resources>
</TabControl>
<Grid HorizontalAlignment="Right" Margin="0 45 40 0" VerticalAlignment="Top" Visibility="{Binding IsRunning,Converter={StaticResource BooleanToVisibilityConverter}}">
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml.cs
index 5eee980de..16de196e1 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/Views/MainView.xaml.cs
@@ -32,7 +32,7 @@ namespace Tango.MachineStudio.Stubs.Views
private void MainView_Loaded(object sender, RoutedEventArgs e)
{
- ServiceLocator.Current.GetInstance<MainViewVM>().CodeTabs.RemoveAt(0);
+ //ServiceLocator.Current.GetInstance<MainViewVM>().CodeTabs.RemoveAt(0);
}
//Auto scroll to bottom of response log each time it is changed.
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/AutoComplete/MachinesProvider.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/AutoComplete/MachinesProvider.cs
index 887cb842d..e9d205bed 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/AutoComplete/MachinesProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/AutoComplete/MachinesProvider.cs
@@ -5,12 +5,21 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.AutoComplete.Editors;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
namespace Tango.MachineStudio.Synchronization.AutoComplete
{
+ /// <summary>
+ /// Represents an auto-complete machines suggestions provider.
+ /// </summary>
+ /// <seealso cref="Tango.AutoComplete.Editors.ISuggestionProvider" />
public class MachinesProvider : ISuggestionProvider
{
+ /// <summary>
+ /// Gets the suggestions.
+ /// </summary>
+ /// <param name="filter">The filter.</param>
+ /// <returns></returns>
public IEnumerable GetSuggestions(string filter)
{
return ObservablesEntitiesAdapter.Instance.Machines.Where(x => x.SerialNumber.StartsWith(filter, StringComparison.CurrentCultureIgnoreCase)).ToList();
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs
index d4212475c..4e846e963 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs
@@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Synchronization.Navigation
{
+ /// <summary>
+ /// Represents the available views to navigate to within the synchronization module.
+ /// </summary>
public enum NavigationView
{
MenuView,
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/SyncNavigationManager.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/SyncNavigationManager.cs
index 847fa2456..8c06418e6 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/SyncNavigationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/SyncNavigationManager.cs
@@ -7,8 +7,15 @@ using Tango.MachineStudio.Synchronization.Views;
namespace Tango.MachineStudio.Synchronization.Navigation
{
+ /// <summary>
+ /// Represents the synchronization module views navigation manager.
+ /// </summary>
public class SyncNavigationManager
{
+ /// <summary>
+ /// Navigate to the specified view.
+ /// </summary>
+ /// <param name="view">The view.</param>
public void NavigateTo(NavigationView view)
{
MainView.Instance.TransitionControl.AutoNavigate(view.ToString());
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/SynchronizationModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/SynchronizationModule.cs
index 039b9faf6..5292c6048 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/SynchronizationModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/SynchronizationModule.cs
@@ -5,42 +5,50 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Synchronization.Views;
using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.Synchronization
{
- public class SynchronizationModule : IStudioModule
+ /// <summary>
+ /// Represents a Machine Studio module capable of comparing and synchronizing machines data against Twine remote database.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public class SynchronizationModule : StudioModuleBase
{
- private bool _isInitialized;
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Synchronization";
- public string Name => "Synchronization";
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Perform local to local or remote to local database synchronization.";
- public string Description => "Perform local to local or remote to local database synchronization.";
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/synchronization.jpg");
- public BitmapSource Image => ResourceHelper.GetImageFromResources("Images/synchronization.jpg");
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MainView();
- public FrameworkElement MainView => new MainView();
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunSynchronizationModule;
- public bool IsInitialized => _isInitialized;
-
- public Permissions Permission => Permissions.RunSynchronizationModule;
-
- public void Dispose()
- {
- //Dispose...
- }
-
- public void Initialize()
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
{
- if (!_isInitialized)
- {
- //Initialize..
-
- _isInitialized = true;
- }
+
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj
index 3c03f1e48..2a95dc082 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Tango.MachineStudio.Synchronization.csproj
@@ -193,10 +193,6 @@
<Project>{0e0eef3e-8f4e-4f23-9d19-479fd8d76c12}</Project>
<Name>Tango.DAL.Local</Name>
</ProjectReference>
- <ProjectReference Include="..\..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
<Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
<Name>Tango.DAL.Remote</Name>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs
index 3f8772f0e..070beefa6 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/DirectSynchronizationViewVM.cs
@@ -1,4 +1,5 @@
using Google.Protobuf;
+using Microsoft.Practices.ServiceLocation;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -10,7 +11,7 @@ using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Core.Helpers;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.Integration.Services;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Common.StudioApplication;
@@ -23,6 +24,10 @@ using Tango.Synchronization.Remote;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
+ /// <summary>
+ /// Represents the 'Direct Synchronization' view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class DirectSynchronizationViewVM : ViewModel
{
private SyncNavigationManager _navigation;
@@ -31,9 +36,16 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
private LocalDBComparer _comparer;
private INotificationProvider _notification;
private String _comparedSerialNumber;
+ private MainViewVM _mainView;
- public IStudioApplicationManager ApplicationManager { get; set; }
+ #region Constructors
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DirectSynchronizationViewVM"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="navigation">The navigation.</param>
+ /// <param name="notification">The notification.</param>
public DirectSynchronizationViewVM(IStudioApplicationManager applicationManager, SyncNavigationManager navigation, INotificationProvider notification)
{
ApplicationManager = applicationManager;
@@ -49,6 +61,8 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
CommitAllCommand = new RelayCommand(Synchronize, (x) => Differences.Count > 0 && !IsWorking && SelectedMachine != null);
}
+ #endregion
+
#region Commands
/// <summary>
@@ -90,6 +104,8 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
#region Properties
+ public IStudioApplicationManager ApplicationManager { get; set; }
+
private bool _isWorking;
/// <summary>
/// Gets or sets a value indicating whether this instance is working.
@@ -146,11 +162,29 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
#endregion
+ #region Event Handlers
+
+ private void Comparer_Progress(object sender, string e)
+ {
+ if (_mainView == null)
+ {
+ _mainView = ServiceLocator.Current.GetInstance<MainViewVM>();
+ _mainView.Log = String.Empty;
+ }
+
+ _mainView.Log += ("[" + DateTime.Now.ToTimeString() + "] " + e + Environment.NewLine);
+ }
+
+ #endregion
+
#region Private Methods
+ /// <summary>
+ /// Compares the selected machine against the remote database.
+ /// </summary>
private void Compare()
{
- if (SelectedMachine.SerialNumber != ApplicationManager.ConnectedMachine.SerialNumber)
+ if (SelectedMachine.SerialNumber != ApplicationManager.ConnectedMachine.As<ExternalBridgeTcpClient>().SerialNumber)
{
if (!_notification.ShowQuestion("The selected machine serial number does not match the connected machine. Are you sure you want to continue?"))
{
@@ -195,6 +229,7 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
using (_notification.PushTaskItem("Comparing database..."))
{
_comparer = new LocalDBComparer(new SQLiteDataBase(_masterDBFile), new SQLiteDataBase(_slaveDBFile));
+ _comparer.Progress += Comparer_Progress;
var diffs = _comparer.Compare();
Differences = new ObservableCollection<Diff>(diffs);
@@ -236,6 +271,10 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+
+ /// <summary>
+ /// Synchronizes the selected machine with the remote database.
+ /// </summary>
private void Synchronize()
{
if (IsClearMachine)
@@ -313,11 +352,19 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Displays an error message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowError(String message)
{
InvokeUINow(() => _notification.ShowError(message));
}
+ /// <summary>
+ /// Displays an information message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowInfo(String message)
{
InvokeUINow(() => _notification.ShowInfo(message));
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/LocalSynchronizationViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/LocalSynchronizationViewVM.cs
index 9c805cca4..2621f622a 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/LocalSynchronizationViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/LocalSynchronizationViewVM.cs
@@ -1,4 +1,5 @@
-using Microsoft.Win32;
+using Microsoft.Practices.ServiceLocation;
+using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -19,6 +20,10 @@ using Tango.Synchronization.Local;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
+ /// <summary>
+ /// Represents the 'Local Synchronization' view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class LocalSynchronizationViewVM : ViewModel
{
private SyncNavigationManager _navigation;
@@ -27,6 +32,7 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
private LocalDBComparer _comparer;
private INotificationProvider _notification;
private bool _isWorking;
+ private MainViewVM _mainView;
#region Constructors
@@ -166,8 +172,26 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
#endregion
+ #region Event Handlers
+
+ private void Comparer_Progress(object sender, string e)
+ {
+ if (_mainView == null)
+ {
+ _mainView = ServiceLocator.Current.GetInstance<MainViewVM>();
+ _mainView.Log = String.Empty;
+ }
+
+ _mainView.Log += ("[" + DateTime.Now.ToTimeString() + "] " + e + Environment.NewLine);
+ }
+
+ #endregion
+
#region Private Methods
+ /// <summary>
+ /// Cleans the slave database.
+ /// </summary>
private async void CleanSlave()
{
if (_notification.ShowQuestion("Are you sure you want to erase all data on slave database?"))
@@ -205,9 +229,13 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
}
}
+ /// <summary>
+ /// Compares the master and slave database files.
+ /// </summary>
private void Compare()
{
_comparer = new LocalDBComparer(new SQLiteDataBase(MasterDBFile), new SQLiteDataBase(SlaveDBFile));
+ _comparer.Progress += Comparer_Progress;
Task.Factory.StartNew(() =>
{
@@ -248,6 +276,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Commits the selected difference.
+ /// </summary>
private void Commit()
{
Task.Factory.StartNew(() =>
@@ -277,6 +308,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Commits all the differences.
+ /// </summary>
private void CommitAll()
{
Task.Factory.StartNew(() =>
@@ -314,6 +348,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Browse for slave database file.
+ /// </summary>
private void BrowseSlaveDB()
{
String file = BrowseForFilePath();
@@ -325,6 +362,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
}
}
+ /// <summary>
+ /// Browse for master database file.
+ /// </summary>
private void BrowseMasterDB()
{
String file = BrowseForFilePath();
@@ -336,6 +376,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
}
}
+ /// <summary>
+ /// Browse for database file.
+ /// </summary>
private String BrowseForFilePath()
{
OpenFileDialog dlg = new OpenFileDialog();
@@ -348,11 +391,19 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
return null;
}
+ /// <summary>
+ /// Displays an error message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowError(String message)
{
InvokeUINow(() => _notification.ShowError(message));
}
+ /// <summary>
+ /// Displays an information message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowInfo(String message)
{
InvokeUINow(() => _notification.ShowInfo(message));
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MainViewVM.cs
index c392aee1a..987b9ac4d 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MainViewVM.cs
@@ -8,17 +8,18 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
+ /// <summary>
+ /// Represents the synchronization module main view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class MainViewVM : ViewModel
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
public MainViewVM()
{
- MainViewLogger logger = new MainViewLogger();
- logger.NewLog += (output) =>
- {
- Log += output + Environment.NewLine;
- };
-
- LogManager.RegisterLogger(logger);
+ Log = "Synchronization module started...";
}
private String _log;
@@ -30,32 +31,5 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
get { return _log; }
set { _log = value; RaisePropertyChanged(nameof(Log)); }
}
-
- #region Custom Logger
-
- public class MainViewLogger : ILogger
- {
- public bool Enabled { get; set; }
- public bool Immediate { get; set; }
- public event Action<String> NewLog;
-
- public MainViewLogger()
- {
- Enabled = true;
- Immediate = true;
- }
-
- public void OnError(LogItemBase output)
- {
- NewLog?.Invoke(output.TimeStamp.ToTimeString() + ": " + output.GetMessage());
- }
-
- public void OnTrace(LogItemBase output)
- {
- NewLog?.Invoke(output.TimeStamp.ToTimeString() + ": " + output.GetMessage());
- }
- }
-
- #endregion
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MenuViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MenuViewVM.cs
index 0fe510f36..efc6ec900 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MenuViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/MenuViewVM.cs
@@ -9,10 +9,18 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
+ /// <summary>
+ /// Represents the synchronization module main menu view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class MenuViewVM : ViewModel
{
private SyncNavigationManager _navigation;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MenuViewVM"/> class.
+ /// </summary>
+ /// <param name="navigation">The navigation.</param>
public MenuViewVM(SyncNavigationManager navigation)
{
_navigation = navigation;
@@ -22,10 +30,19 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
StartDirectRemoteSyncCommand = new RelayCommand(() => { _navigation.NavigateTo(NavigationView.DirectSynchronizationView); });
}
+ /// <summary>
+ /// Gets or sets the start local synchronize command.
+ /// </summary>
public RelayCommand StartLocalSyncCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the start remote synchronize command.
+ /// </summary>
public RelayCommand StartRemoteSyncCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the start direct remote synchronize command.
+ /// </summary>
public RelayCommand StartDirectRemoteSyncCommand { get; set; }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/RemoteSynchronizationViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/RemoteSynchronizationViewVM.cs
index e14b0ffb9..0f427643f 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/RemoteSynchronizationViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/ViewModels/RemoteSynchronizationViewVM.cs
@@ -10,7 +10,7 @@ using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.DAL.Local.DB;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.DAL.Remote.DB;
using Tango.Logging;
using Tango.MachineStudio.Common.Notifications;
@@ -21,9 +21,15 @@ using Tango.SharedUI;
using Tango.Synchronization;
using Tango.Synchronization.Local;
using Tango.Synchronization.Remote;
+using Microsoft.Practices.ServiceLocation;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
+ /// <summary>
+ /// Represents the 'Semi Remote Synchronization' view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ /// <seealso cref="Tango.MachineStudio.Common.StudioApplication.IShutdownRequestBlocker" />
public class RemoteSynchronizationViewVM : ViewModel, IShutdownRequestBlocker
{
private SyncNavigationManager _navigation;
@@ -33,6 +39,7 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
private RemoteDBComparer _comparer;
private RemoteDB _remoteDB;
private LocalDB _localDB;
+ private MainViewVM _mainView;
#region Constructors
@@ -104,6 +111,21 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
#endregion
+ #region Event Handlers
+
+ private void Comparer_Progress(object sender, string e)
+ {
+ if (_mainView == null)
+ {
+ _mainView = ServiceLocator.Current.GetInstance<MainViewVM>();
+ _mainView.Log = String.Empty;
+ }
+
+ _mainView.Log += ("[" + DateTime.Now.ToTimeString() + "] " + e + Environment.NewLine);
+ }
+
+ #endregion
+
#region Properties
private ObservableCollection<Diff> _differences;
@@ -158,6 +180,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
#region Private Methods
+ /// <summary>
+ /// Cleans the slave database file.
+ /// </summary>
private async void CleanSlave()
{
if (_notification.ShowQuestion("Are you sure you want to erase all data on slave database?"))
@@ -195,6 +220,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
}
}
+ /// <summary>
+ /// Compares the remote database with the selected database file.
+ /// </summary>
private void Compare()
{
Task.Factory.StartNew(() =>
@@ -211,6 +239,7 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
_remoteDB = RemoteDB.CreateDefault();
_localDB = new LocalDB(SlaveDBFile);
_comparer = new RemoteDBComparer(_remoteDB, _localDB, SelectedMachine.SerialNumber);
+ _comparer.Progress += Comparer_Progress;
_isWorking = true;
InvalidateRelayCommands();
Thread.Sleep(1500);
@@ -243,6 +272,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Commits the selected difference.
+ /// </summary>
private void Commit()
{
Task.Factory.StartNew(() =>
@@ -274,6 +306,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Commits all the differences.
+ /// </summary>
private void CommitAll()
{
Task.Factory.StartNew(() =>
@@ -325,6 +360,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
});
}
+ /// <summary>
+ /// Browse for slave database file.
+ /// </summary>
private void BrowseSlaveDB()
{
String file = BrowseForFilePath();
@@ -336,6 +374,9 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
}
}
+ /// <summary>
+ /// Browse for database file.
+ /// </summary>
private String BrowseForFilePath()
{
OpenFileDialog dlg = new OpenFileDialog();
@@ -348,16 +389,28 @@ namespace Tango.MachineStudio.Synchronization.ViewModels
return null;
}
+ /// <summary>
+ /// Displays an error message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowError(String message)
{
InvokeUINow(() => _notification.ShowError(message));
}
+ /// <summary>
+ /// Displays an information message.
+ /// </summary>
+ /// <param name="message">The message.</param>
private void ShowInfo(String message)
{
InvokeUINow(() => _notification.ShowInfo(message));
}
+ /// <summary>
+ /// Called when the application is shutting down.
+ /// </summary>
+ /// <returns></returns>
public Task<bool> OnShutdownRequest()
{
if (_comparer != null)
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MenuView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MenuView.xaml
index 67501743b..b7f37b022 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MenuView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MenuView.xaml
@@ -10,74 +10,76 @@
d:DesignHeight="720" d:DesignWidth="1280" DataContext="{x:Static global:ViewModelLocator.MenuViewVM}">
<Grid>
<Grid>
- <UniformGrid Columns="3">
- <Grid VerticalAlignment="Center">
- <StackPanel>
- <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
- <TextBlock TextAlignment="Center" FontSize="25">Local Synchronization</TextBlock>
- <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Synchronize two SQLite local database files.</TextBlock>
- </StackPanel>
- <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
- <Grid Width="450">
- <StackPanel>
- <StackPanel Orientation="Horizontal">
- <Image Source="../Images/sqlite.png" Width="160"></Image>
- <Image Source="../Images/arrow_right.png" Width="100" RenderTransformOrigin="0.5,0.5"></Image>
- <Image Source="../Images/sqlite.png" Width="130"></Image>
+ <Viewbox MaxWidth="1600">
+ <UniformGrid Columns="3">
+ <Grid VerticalAlignment="Center">
+ <StackPanel>
+ <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
+ <TextBlock TextAlignment="Center" FontSize="25">Local Synchronization</TextBlock>
+ <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Synchronize two SQLite local database files.</TextBlock>
+ </StackPanel>
+ <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
+ <Grid Width="450">
+ <StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/sqlite.png" Width="160"></Image>
+ <Image Source="../Images/arrow_right.png" Width="100" RenderTransformOrigin="0.5,0.5"></Image>
+ <Image Source="../Images/sqlite.png" Width="130"></Image>
+ </StackPanel>
+
+ <Button Command="{Binding StartLocalSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
</StackPanel>
+ </Grid>
+ </Viewbox>
+ </StackPanel>
+ </Grid>
- <Button Command="{Binding StartLocalSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
- </StackPanel>
- </Grid>
- </Viewbox>
- </StackPanel>
- </Grid>
+ <Grid VerticalAlignment="Center">
+ <StackPanel>
+ <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
+ <TextBlock TextAlignment="Center" FontSize="25">Direct Remote Synchronization</TextBlock>
+ <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Connect and synchronized a Tango machine over the network.</TextBlock>
+ </StackPanel>
+ <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
+ <Grid Width="450">
+ <StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/remote-db.png" Width="200"></Image>
+ <Image Source="../Images/arrow_right.png" Width="100"></Image>
+ <Image Source="../Images/machine-trans.png" Width="120"></Image>
+ </StackPanel>
- <Grid VerticalAlignment="Center">
- <StackPanel>
- <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
- <TextBlock TextAlignment="Center" FontSize="25">Direct Remote Synchronization</TextBlock>
- <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Connect and synchronized a Tango machine over the network.</TextBlock>
- </StackPanel>
- <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
- <Grid Width="450">
- <StackPanel>
- <StackPanel Orientation="Horizontal">
- <Image Source="../Images/remote-db.png" Width="200"></Image>
- <Image Source="../Images/arrow_right.png" Width="100"></Image>
- <Image Source="../Images/machine-trans.png" Width="120"></Image>
+ <Button Command="{Binding StartDirectRemoteSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
</StackPanel>
+ </Grid>
+ </Viewbox>
+ </StackPanel>
+ </Grid>
- <Button Command="{Binding StartDirectRemoteSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
- </StackPanel>
- </Grid>
- </Viewbox>
- </StackPanel>
- </Grid>
+ <Grid VerticalAlignment="Center">
+ <StackPanel>
+ <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
+ <TextBlock TextAlignment="Center" FontSize="25">Semi Remote Synchronization</TextBlock>
+ <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Synchronize local SQLite database file with the remote Twine database.</TextBlock>
+ </StackPanel>
+ <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
+ <Grid Width="450">
+ <StackPanel>
+ <StackPanel Orientation="Horizontal">
+ <Image Source="../Images/remote-db.png" Width="200"></Image>
+ <Image Source="../Images/arrow_right.png" Width="100"></Image>
+ <Image Source="../Images/sqlite.png" Width="120"></Image>
+ </StackPanel>
- <Grid VerticalAlignment="Center">
- <StackPanel>
- <StackPanel HorizontalAlignment="Center" Margin="0 0 0 30">
- <TextBlock TextAlignment="Center" FontSize="25">Semi Remote Synchronization</TextBlock>
- <TextBlock TextAlignment="Center" FontSize="14" Foreground="#303030">Synchronize local SQLite database file with the remote Twine database.</TextBlock>
- </StackPanel>
- <Viewbox RenderOptions.BitmapScalingMode="Fant" Width="400">
- <Grid Width="450">
- <StackPanel>
- <StackPanel Orientation="Horizontal">
- <Image Source="../Images/remote-db.png" Width="200"></Image>
- <Image Source="../Images/arrow_right.png" Width="100"></Image>
- <Image Source="../Images/sqlite.png" Width="120"></Image>
+ <Button Command="{Binding StartRemoteSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
</StackPanel>
+ </Grid>
+ </Viewbox>
+ </StackPanel>
+ </Grid>
- <Button Command="{Binding StartRemoteSyncCommand}" Height="80" Margin="0 20 0 0" HorizontalAlignment="Center" Padding="10" FontSize="20" Width="200">START</Button>
- </StackPanel>
- </Grid>
- </Viewbox>
- </StackPanel>
- </Grid>
-
- </UniformGrid>
+ </UniformGrid>
+ </Viewbox>
</Grid>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToMultiChannleMonitorsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToMultiChannleMonitorsConverter.cs
new file mode 100644
index 000000000..46a526f56
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToMultiChannleMonitorsConverter.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ public class MonitorsToMultiChannleMonitorsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ ObservableCollection<TechMonitor> monitors = value as ObservableCollection<TechMonitor>;
+
+ if (monitors != null)
+ {
+ return monitors.Where(x => x.MultiChannel).ToObservableCollection();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToSingleChannleMonitorsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToSingleChannleMonitorsConverter.cs
new file mode 100644
index 000000000..b5f9cffef
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/MonitorsToSingleChannleMonitorsConverter.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ public class MonitorsToSingleChannleMonitorsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ ObservableCollection<TechMonitor> monitors = value as ObservableCollection<TechMonitor>;
+
+ if (monitors != null)
+ {
+ return monitors.Where(x => !x.MultiChannel).ToObservableCollection();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/SecondsToGraphPointsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/SecondsToGraphPointsConverter.cs
new file mode 100644
index 000000000..9bd0e16ad
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/SecondsToGraphPointsConverter.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ /// <summary>
+ /// Converts number of seconds to graph FIFO capacity.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
+ public class SecondsToGraphPointsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ double arrLength = double.Parse(parameter.ToString());
+ return Helpers.GraphsHelper.GetMaxPoints(arrLength);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ return value;
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalInsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalInsConverter.cs
new file mode 100644
index 000000000..4b587743d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalInsConverter.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+using Tango.Integration.Observables.Enumerations;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ public class TechIosToDigitalInsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ ObservableCollection<TechIo> ios = value as ObservableCollection<TechIo>;
+
+ if (ios != null)
+ {
+ return ios.Where(x => x.Type == IOType.DigitalInput.ToInt32()).ToObservableCollection();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalOutsConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalOutsConverter.cs
new file mode 100644
index 000000000..734c4bebf
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TechIosToDigitalOutsConverter.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using Tango.Integration.Observables;
+using Tango.Integration.Observables.Enumerations;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ public class TechIosToDigitalOutsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ ObservableCollection<TechIo> ios = value as ObservableCollection<TechIo>;
+
+ if (ios != null)
+ {
+ return ios.Where(x => x.Type == IOType.DigitalOutput.ToInt32()).ToObservableCollection();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TransitionLinkConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TransitionLinkConverter.cs
new file mode 100644
index 000000000..d67f3a259
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Converters/TransitionLinkConverter.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+
+namespace Tango.MachineStudio.Technician.Converters
+{
+ /// <summary>
+ /// Binding converter for converting TransitionControl child Tag to text style.
+ /// </summary>
+ /// <remarks>
+ /// This converter is used by the patient page tabs, changing the selected tab text style to bold/normal.
+ /// </remarks>
+ public class TransitionLinkConverter : IValueConverter
+ {
+ /// <summary>
+ /// Converts a ContentControl to font style.
+ /// </summary>
+ /// <param name="value">Content control.</param>
+ /// <param name="targetType"></param>
+ /// <param name="parameter"></param>
+ /// <param name="culture"></param>
+ /// <returns>Font style.</returns>
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ ContentControl control = value as ContentControl;
+
+ if (control != null && control.Tag != null && control.Tag.ToString().ToLower() == parameter.ToString().ToLower())
+ {
+ return FontWeights.Bold;
+ }
+ else
+ {
+ return FontWeights.Normal;
+ }
+ }
+
+ /// <summary>
+ /// Not Implemented.
+ /// </summary>
+ /// <param name="value"></param>
+ /// <param name="targetType"></param>
+ /// <param name="parameter"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ return value;
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml
new file mode 100644
index 000000000..29eab7042
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml
@@ -0,0 +1,92 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.DigitalInElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:DigitalInItem, IsDesignTimeCreatable=False}" Height="83.778" Width="72.703">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="221*"/>
+ <RowDefinition Height="Auto"/>
+ </Grid.RowDefinitions>
+
+ <Border BorderBrush="Gray" BorderThickness="1" CornerRadius="5" Padding="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+ <Grid>
+ <Viewbox Margin="5">
+ <visuals:Led Width="100" Height="100" IsChecked="{Binding Value}" IsHitTestVisible="False" />
+ </Viewbox>
+ </Grid>
+ </Border>
+
+ <Border VerticalAlignment="Bottom" Grid.Row="1" Margin="0 0 0 0">
+ <TextBlock TextWrapping="Wrap" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center" Text="{Binding TechIo.Description}"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml.cs
new file mode 100644
index 000000000..e884e70b9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalInElementEditor.xaml.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class DigitalInElementEditor : ElementEditor
+ {
+ public DigitalInElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ public DigitalInElementEditor(DigitalInItem digitalInItem)
+ : this()
+ {
+ DigitalInItem = digitalInItem;
+ DataContext = DigitalInItem;
+ }
+
+ public DigitalInElementEditor(DigitalInItem digitalInItem, Rect bounds)
+ : this(digitalInItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private DigitalInItem _digitalInItem;
+
+ public DigitalInItem DigitalInItem
+ {
+ get { return _digitalInItem; }
+ set { _digitalInItem = value; RaisePropertyChanged(nameof(DigitalInItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = DigitalInItem.Clone() as DigitalInItem;
+ DigitalInElementEditor cloned = new DigitalInElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return DigitalInItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml
new file mode 100644
index 000000000..dcf78ca69
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml
@@ -0,0 +1,103 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.DigitalOutElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="88.852" d:DesignWidth="142.323" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:DigitalOutItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="221*"/>
+ <RowDefinition Height="Auto"/>
+ </Grid.RowDefinitions>
+
+ <Border BorderBrush="Gray" BorderThickness="1" CornerRadius="5" Padding="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="55*"/>
+ <ColumnDefinition Width="55*"/>
+ </Grid.ColumnDefinitions>
+
+ <Viewbox Margin="5">
+ <visuals:Led Width="100" Height="100" IsChecked="{Binding EffectiveValue}" IsHitTestVisible="False" />
+ </Viewbox>
+ <visuals:AnalogSwitch Cursor="Hand" RenderTransformOrigin="0.5,0.5" Grid.Column="1" IsChecked="{Binding Value,Mode=TwoWay}">
+ <!--<visuals:AnalogSwitch.LayoutTransform>
+ <RotateTransform Angle="90" />
+ </visuals:AnalogSwitch.LayoutTransform>-->
+ </visuals:AnalogSwitch>
+ </Grid>
+ </Border>
+
+ <Border VerticalAlignment="Bottom" Grid.Row="1" Margin="0 0 0 0">
+ <TextBlock TextWrapping="Wrap" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center" Text="{Binding TechIo.Description}"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml.cs
new file mode 100644
index 000000000..6428ccf1d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DigitalOutElementEditor.xaml.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class DigitalOutElementEditor : ElementEditor
+ {
+ public DigitalOutElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ public DigitalOutElementEditor(DigitalOutItem digitalOutItem)
+ : this()
+ {
+ DigitalOutItem = digitalOutItem;
+ DataContext = DigitalOutItem;
+ }
+
+ public DigitalOutElementEditor(DigitalOutItem digitalOutItem, Rect bounds)
+ : this(digitalOutItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private DigitalOutItem _digitalOutItem;
+
+ public DigitalOutItem DigitalOutItem
+ {
+ get { return _digitalOutItem; }
+ set { _digitalOutItem = value; RaisePropertyChanged(nameof(DigitalOutItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = DigitalOutItem.Clone() as DigitalOutItem;
+ DigitalOutElementEditor cloned = new DigitalOutElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return DigitalOutItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml
new file mode 100644
index 000000000..f1ead0cad
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml
@@ -0,0 +1,288 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.DispenserElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="164.393" d:DesignWidth="224.65" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:DispenserItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+
+ <Grid x:Key="gridHoming">
+ <DockPanel>
+ <Button Click="OnHomingStopped" DockPanel.Dock="Right" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" VerticalAlignment="Center" Margin="0 0 5 0" ToolTip="Stop Homing">
+ <materialDesign:PackIcon Kind="Stop" Foreground="#FF5F5F" HorizontalAlignment="Center" VerticalAlignment="Center" Width="32" Height="32" />
+ </Button>
+ <ProgressBar Foreground="DimGray" BorderBrush="DimGray" Maximum="{Binding HomingMaximumProgress}" Value="{Binding HomingProgress}" VerticalAlignment="Center" Height="10" Margin="5 0 5 0" Background="Transparent"></ProgressBar>
+ </DockPanel>
+ </Grid>
+
+ <Grid x:Key="gridDefault">
+ <Viewbox Stretch="Fill">
+ <materialDesign:PackIcon Kind="Home" Margin="25 0" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+
+ <Button Click="OnHomingStarted" Style="{StaticResource emptyButton}" Cursor="Hand" Background="Transparent" BorderThickness="0"></Button>
+ </Grid>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+ <Grid Margin="5" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="100*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid.RowDefinitions>
+ <RowDefinition Height="100*" />
+ <RowDefinition Height="30*" />
+ </Grid.RowDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="63*"/>
+ <ColumnDefinition Width="88*"/>
+ </Grid.ColumnDefinitions>
+ <Image Source="../Images/dispenser-line.png" Grid.ColumnSpan="2" Stretch="Fill"></Image>
+
+ <Path RenderTransformOrigin="0.5,0.5" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" StrokeThickness="1" Stroke="#202020" Stretch="Uniform" Data="M728.4 312.2l-198.1-63.4c-0.5-5.9-1.6-11.6-3.4-17c8.4-2.8 17-5.9 25.7-9.2c78.8-29.7 124.3-63 135-98.8 c7.2-23.8-0.5-47.5-22.6-70.3c-17.5-18-56.2-44.9-57.8-46c-6.2-4.3-14.7-2.8-19.1 3.3L465.5 180.8c-3.2-0.4-6.4-0.6-9.6-0.6 c-2.2 0-4.5 0.1-6.7 0.3c-0.5-62.6-8.3-142.4-41.1-178.6c-12.7-14.1-28.3-21.2-46.1-21.2c0 0 0 0 0 0c-12.3 0-25.6 3.5-39.7 10.4 c-17.4 8.6-43.8 27.5-55.6 36.2c-3.5 2.6-5.7 4.2-6.1 4.5c-3.7 2.8-5.6 7.2-5.4 11.6c0.1 2.6 1 5.3 2.7 7.5l128.9 175.8 c-1.4 3.5-2.6 7.1-3.4 10.8c-42.1-13.7-94.9-27.4-138.4-27.4c-34.2 0-59.1 8.6-73.8 25.7c-13 15-17.7 35.8-14 61.7 c3.6 24.8 19.1 69.3 19.7 71.2c2 5.7 7.3 9.3 13 9.3c1.4 0 2.9-0.2 4.3-0.7L404 308.3c2.3 2.3 4.8 4.4 7.4 6.3 c-7.3 10-14.8 20.7-22.3 32c-46.3 70.4-63.5 124-51.1 159.3c8.2 23.5 28.3 38.2 59.6 43.6c16.2 2.8 41.8 3.4 60.4 3.4 c8.1 0 13.5-0.1 13.5-0.1c7.5-0.2 13.5-6.3 13.5-13.9L484 323.8c4.1-1.7 8.1-3.7 11.8-6.1c6.1 8.3 12.6 16.9 19.5 25.6 c52.2 65.4 97.5 98.6 134.8 98.6c17.6 0 42.4-7.5 61.3-43.3c11.7-22.2 25.4-67.3 25.9-69.2C739.5 322.2 735.5 314.5 728.4 312.2z M455.9 293c-21.1 0-38.3-17.1-38.3-38.3s17.1-38.3 38.3-38.3c21.1 0 38.3 17.1 38.3 38.3C494.2 275.9 477 293 455.9 293z">
+ <Path.Fill>
+ <LinearGradientBrush>
+ <GradientStop Color="Black"/>
+ <GradientStop Color="{Binding Color}" Offset="0.8"/>
+ </LinearGradientBrush>
+ </Path.Fill>
+ <Path.RenderTransform>
+ <RotateTransform x:Name="propRotate" Angle="0" />
+ </Path.RenderTransform>
+ </Path>
+ <!--<Image RenderTransformOrigin="0.5,0.5" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Source="../Images/prop.png" RenderOptions.BitmapScalingMode="Fant">
+ <Image.RenderTransform>
+ <RotateTransform x:Name="propRotate" Angle="0" />
+ </Image.RenderTransform>
+ </Image>-->
+ </Grid>
+ </Border>
+ </Grid>
+
+ <Grid>
+ <Border BorderBrush="Gray" Cursor="Hand" BorderThickness="1 1 0 1" Margin="0 10" CornerRadius="5 0 0 5" PreviewMouseDown="OnBackwardPressed" PreviewMouseUp="OnBackwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronLeft" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="2">
+ <Border BorderBrush="Gray" Cursor="Hand" BorderThickness="0 1 1 1" Margin="0 10" CornerRadius="0 10 10 0" PreviewMouseDown="OnForwardPressed" PreviewMouseUp="OnForwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="0" />
+ <GradientStop Color="#FFEEEEEE" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronRight" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="1" Grid.Row="1">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="115*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderBrush="Gray" BorderThickness="1 0 1 1" CornerRadius="0 0 20 20">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
+ <GradientStop Color="#979797" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Grid>
+ <ContentControl>
+ <ContentControl.Style>
+ <Style TargetType="ContentControl">
+ <Setter Property="Content" Value="{StaticResource gridDefault}">
+
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsHoming}" Value="True">
+ <Setter Property="Content" Value="{StaticResource gridHoming}">
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ContentControl.Style>
+
+ </ContentControl>
+ </Grid>
+ </Border>
+ </Grid>
+ </Grid>
+
+
+ </Grid>
+
+ <!--Content-->
+ <Grid>
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding TechDispenser.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml.cs
new file mode 100644
index 000000000..ef6e4c47c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/DispenserElementEditor.xaml.cs
@@ -0,0 +1,181 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class DispenserElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public DispenserElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public DispenserElementEditor(DispenserItem dispenserItem)
+ : this()
+ {
+ DispenserItem = dispenserItem;
+ DataContext = DispenserItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public DispenserElementEditor(DispenserItem monitorItem, Rect bounds)
+ : this(monitorItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private DispenserItem _monitorItem;
+
+ public DispenserItem DispenserItem
+ {
+ get { return _monitorItem; }
+ set
+ {
+ _monitorItem = value; RaisePropertyChanged(nameof(DispenserItem));
+
+ if (_monitorItem != null)
+ {
+ _monitorItem.HomingCompleted -= _monitorItem_HomingCompleted;
+ _monitorItem.HomingCompleted += _monitorItem_HomingCompleted;
+ }
+ }
+ }
+
+ private void _monitorItem_HomingCompleted(object sender, EventArgs e)
+ {
+ StopAnimation();
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = DispenserItem.Clone() as DispenserItem;
+ DispenserElementEditor cloned = new DispenserElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return DispenserItem; }
+ }
+
+ private void OnForwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.ForwardPressed);
+ AnimateRight();
+ }
+
+ private void OnForwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.ForwardReleased);
+ StopAnimation();
+ }
+
+ private void OnBackwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.BackwardPressed);
+ AnimateLeft();
+ }
+
+ private void OnBackwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.BackwardReleased);
+ StopAnimation();
+ }
+
+ private void OnHomingStarted(object sender, RoutedEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.HomingStarted);
+ AnimateLeft();
+ }
+
+ private void OnHomingStopped(object sender, RoutedEventArgs e)
+ {
+ DispenserItem.RaiseAction(MotorActionType.HomingStopped);
+ StopAnimation();
+ }
+
+ private void AnimateRight()
+ {
+ DoubleAnimation ani = new DoubleAnimation();
+ ani.Duration = TimeSpan.FromSeconds(1);
+ ani.RepeatBehavior = RepeatBehavior.Forever;
+ ani.FillBehavior = FillBehavior.HoldEnd;
+ ani.To = 360;
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, ani);
+ }
+
+ private void AnimateLeft()
+ {
+ DoubleAnimation ani = new DoubleAnimation();
+ ani.Duration = TimeSpan.FromSeconds(1);
+ ani.RepeatBehavior = RepeatBehavior.Forever;
+ ani.FillBehavior = FillBehavior.HoldEnd;
+ ani.To = -360;
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, ani);
+ }
+
+ public void StopAnimation()
+ {
+ this.Dispatcher.Invoke(() =>
+ {
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, null);
+ });
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml
new file mode 100644
index 000000000..98ace7816
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml
@@ -0,0 +1,88 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.MeterElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="250" d:DesignWidth="80" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:MeterItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="221*"/>
+ <RowDefinition Height="Auto"/>
+ </Grid.RowDefinitions>
+
+ <visuals:VUMeter Width="Auto" Height="Auto" LedBackground="#383838" TicksCount="{Binding TicksCount}" TicksPlacement="{Binding TickPlacement}" LedCount="{Binding LedCount}" Orientation="Vertical" Margin="0 0 0 10" ShowTicksLabels="True" ShowTicksLines="True" EmulateOuterLight="True" SunkenLeds="True" Value="{Binding Value}" TicksMinimum="{Binding TechMonitor.Min}" TicksMaximum="{Binding TechMonitor.Max}" Minimum="{Binding TechMonitor.Min}" Maximum="{Binding TechMonitor.Max}">
+ <visuals:VUMeter.Foreground>
+ <SolidColorBrush Color="{Binding Color}" />
+ </visuals:VUMeter.Foreground>
+ </visuals:VUMeter>
+
+ <Border VerticalAlignment="Bottom" Grid.Row="1" Margin="0 0 0 0">
+ <TextBlock TextWrapping="Wrap" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MeterItem.TechMonitor.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml.cs
new file mode 100644
index 000000000..deaab4bed
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MeterElementEditor.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class MeterElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public MeterElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public MeterElementEditor(MeterItem meterItem)
+ : this()
+ {
+ MeterItem = meterItem;
+ DataContext = MeterItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public MeterElementEditor(MeterItem monitorItem, Rect bounds)
+ : this(monitorItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private MeterItem _monitorItem;
+
+ public MeterItem MeterItem
+ {
+ get { return _monitorItem; }
+ set { _monitorItem = value; RaisePropertyChanged(nameof(MeterItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = MeterItem.Clone() as MeterItem;
+ MeterElementEditor cloned = new MeterElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return MeterItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml
new file mode 100644
index 000000000..8f66adeeb
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml
@@ -0,0 +1,96 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.MonitorElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="250" d:DesignWidth="300" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:MonitorItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Viewbox Stretch="Fill">
+ <StackPanel>
+ <Grid Grid.Column="1" Grid.Row="1" Width="200" Height="120">
+ <Border BorderThickness="0" BorderBrush="{StaticResource AccentColorBrush}">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/tft-screen.png" Opacity="1" />
+ </Border.Background>
+
+ <Grid>
+ <TextBlock FontFamily="../Fonts/#digital-7" TextAlignment="Center" VerticalAlignment="Center" FontSize="90" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MonitorItem.Value,FallbackValue='0000'}">
+ <TextBlock.Foreground>
+ <SolidColorBrush Color="{Binding Color}"></SolidColorBrush>
+ </TextBlock.Foreground>
+ </TextBlock>
+ </Grid>
+ </Border>
+ </Grid>
+ </StackPanel>
+ </Viewbox>
+
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MonitorItem.TechMonitor.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml.cs
new file mode 100644
index 000000000..d4df8e5cd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MonitorElementEditor.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class MonitorElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public MonitorElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public MonitorElementEditor(MonitorItem monitorItem)
+ : this()
+ {
+ MonitorItem = monitorItem;
+ DataContext = MonitorItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public MonitorElementEditor(MonitorItem monitorItem, Rect bounds)
+ : this(monitorItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private MonitorItem _monitorItem;
+
+ public MonitorItem MonitorItem
+ {
+ get { return _monitorItem; }
+ set { _monitorItem = value; RaisePropertyChanged(nameof(MonitorItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = MonitorItem.Clone() as MonitorItem;
+ MonitorElementEditor cloned = new MonitorElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return MonitorItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml
new file mode 100644
index 000000000..fb0466177
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml
@@ -0,0 +1,279 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.MotorElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="164.393" d:DesignWidth="224.65" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:MotorItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+
+ <Grid x:Key="gridHoming">
+ <DockPanel>
+ <Button Click="OnHomingStopped" DockPanel.Dock="Right" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" VerticalAlignment="Center" Margin="0 0 5 0" ToolTip="Stop Homing">
+ <materialDesign:PackIcon Kind="Stop" Foreground="#FF5F5F" HorizontalAlignment="Center" VerticalAlignment="Center" Width="32" Height="32" />
+ </Button>
+ <ProgressBar Foreground="DimGray" BorderBrush="DimGray" Maximum="{Binding HomingMaximumProgress}" BorderThickness="1" Value="{Binding HomingProgress}" VerticalAlignment="Center" Height="10" Margin="5 0 5 0" Background="Transparent">
+
+ </ProgressBar>
+ </DockPanel>
+ </Grid>
+
+ <Grid x:Key="gridDefault">
+ <Viewbox Stretch="Fill">
+ <materialDesign:PackIcon Kind="Home" Margin="25 0" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+
+ <Button Click="OnHomingStarted" Style="{StaticResource emptyButton}" Background="Transparent" BorderThickness="0"></Button>
+ </Grid>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+ <Grid Margin="5" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="100*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid.RowDefinitions>
+ <RowDefinition Height="100*" />
+ <RowDefinition Height="30*" />
+ </Grid.RowDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+
+ <Grid>
+ <Path RenderTransformOrigin="0.5,0.5" StrokeThickness="1" Stroke="#202020" Stretch="Uniform" Margin="15" Data="M500.633 211.454l-58.729-14.443c-3.53-11.133-8.071-21.929-13.55-32.256c8.818-14.678 27.349-45.571 27.349-45.571 c3.545-5.903 2.607-13.462-2.256-18.325l-42.422-42.422c-4.863-4.878-12.407-5.815-18.325-2.256L347.055 83.53 c-10.269-5.435-21.006-9.932-32.065-13.433l-14.443-58.729C298.876 4.688 292.885 0 286 0h-60 c-6.885 0-12.891 4.688-14.546 11.367c0 0-10.005 40.99-14.429 58.715c-11.792 3.735-23.188 8.584-34.043 14.502l-47.329-28.403 c-5.918-3.516-13.447-2.607-18.325 2.256l-42.422 42.422c-4.863 4.863-5.801 12.422-2.256 18.325l29.268 48.882 c-4.717 9.302-8.672 18.984-11.821 28.901l-58.729 14.487C4.688 213.124 0 219.115 0 226v60c0 6.885 4.688 12.891 11.367 14.546 l58.744 14.443c3.56 11.294 8.188 22.266 13.799 32.798l-26.191 43.652c-3.545 5.903-2.607 13.462 2.256 18.325l42.422 42.422 c4.849 4.849 12.407 5.771 18.325 2.256c0 0 29.37-17.607 43.755-26.221c10.415 5.552 21.313 10.137 32.549 13.696l14.429 58.715 C213.109 507.313 219.115 512 226 512h60c6.885 0 12.876-4.688 14.546-11.367l14.429-58.715 c11.558-3.662 22.69-8.394 33.281-14.136c14.78 8.862 44.443 26.66 44.443 26.66c5.903 3.53 13.462 2.622 18.325-2.256 l42.422-42.422c4.863-4.863 5.801-12.422 2.256-18.325l-26.968-44.927c5.317-10.093 9.727-20.654 13.169-31.523l58.729-14.443 C507.313 298.876 512 292.885 512 286v-60C512 219.115 507.313 213.124 500.633 211.454z M256 361c-57.891 0-105-47.109-105-105 s47.109-105 105-105s105 47.109 105 105S313.891 361 256 361z">
+ <Path.Fill>
+ <LinearGradientBrush>
+ <GradientStop Color="Black"/>
+ <GradientStop Color="{Binding Color}" Offset="0.8"/>
+ </LinearGradientBrush>
+ </Path.Fill>
+ <Path.RenderTransform>
+ <RotateTransform x:Name="propRotate" Angle="0" />
+ </Path.RenderTransform>
+ </Path>
+ </Grid>
+ </Border>
+ </Grid>
+
+ <Grid>
+ <Border BorderBrush="Gray" BorderThickness="1 1 0 1" Margin="0 10" CornerRadius="5 0 0 5" PreviewMouseDown="OnBackwardPressed" PreviewMouseUp="OnBackwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronLeft" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="2">
+ <Border BorderBrush="Gray" BorderThickness="0 1 1 1" Margin="0 10" CornerRadius="0 10 10 0" PreviewMouseDown="OnForwardPressed" PreviewMouseUp="OnForwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="0" />
+ <GradientStop Color="#FFEEEEEE" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronRight" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="1" Grid.Row="1" Visibility="{Binding TechMotor.SupportsHoming,Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="115*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderBrush="Gray" BorderThickness="1 0 1 1" CornerRadius="0 0 20 20">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
+ <GradientStop Color="#979797" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Grid>
+ <ContentControl>
+ <ContentControl.Style>
+ <Style TargetType="ContentControl">
+ <Setter Property="Content" Value="{StaticResource gridDefault}">
+
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsHoming}" Value="True">
+ <Setter Property="Content" Value="{StaticResource gridHoming}">
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ContentControl.Style>
+
+ </ContentControl>
+ </Grid>
+ </Border>
+ </Grid>
+ </Grid>
+
+
+ </Grid>
+
+ <!--Content-->
+ <Grid>
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding TechMotor.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml.cs
new file mode 100644
index 000000000..6371cb83a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorElementEditor.xaml.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class MotorElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public MotorElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public MotorElementEditor(MotorItem motorItem)
+ : this()
+ {
+ MotorItem = motorItem;
+ DataContext = MotorItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public MotorElementEditor(MotorItem monitorItem, Rect bounds)
+ : this(monitorItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private MotorItem _monitorItem;
+
+ public MotorItem MotorItem
+ {
+ get { return _monitorItem; }
+ set
+ {
+ _monitorItem = value; RaisePropertyChanged(nameof(MotorItem));
+
+ if (_monitorItem != null)
+ {
+ _monitorItem.HomingCompleted -= _monitorItem_HomingCompleted;
+ _monitorItem.HomingCompleted += _monitorItem_HomingCompleted;
+ }
+ }
+ }
+
+ private void _monitorItem_HomingCompleted(object sender, EventArgs e)
+ {
+ StopAnimation();
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = MotorItem.Clone() as MotorItem;
+ MotorElementEditor cloned = new MotorElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return MotorItem; }
+ }
+
+ private void OnForwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.ForwardPressed);
+ AnimateRight();
+ }
+
+ private void OnForwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.ForwardReleased);
+ StopAnimation();
+ }
+
+ private void OnBackwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.BackwardPressed);
+ AnimateLeft();
+ }
+
+ private void OnBackwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.BackwardReleased);
+ StopAnimation();
+ }
+
+ private void OnHomingStarted(object sender, RoutedEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.HomingStarted);
+ AnimateLeft();
+ }
+
+ private void OnHomingStopped(object sender, RoutedEventArgs e)
+ {
+ MotorItem.RaiseAction(MotorActionType.HomingStopped);
+ StopAnimation();
+ }
+
+ private void AnimateRight()
+ {
+ DoubleAnimation ani = new DoubleAnimation();
+ ani.Duration = TimeSpan.FromSeconds(1);
+ ani.RepeatBehavior = RepeatBehavior.Forever;
+ ani.FillBehavior = FillBehavior.HoldEnd;
+ ani.To = 360;
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, ani);
+ }
+
+ private void AnimateLeft()
+ {
+ DoubleAnimation ani = new DoubleAnimation();
+ ani.Duration = TimeSpan.FromSeconds(1);
+ ani.RepeatBehavior = RepeatBehavior.Forever;
+ ani.FillBehavior = FillBehavior.HoldEnd;
+ ani.To = -360;
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, ani);
+ }
+
+ public void StopAnimation()
+ {
+ this.Dispatcher.Invoke(() =>
+ {
+ propRotate.BeginAnimation(RotateTransform.AngleProperty, null);
+ });
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml
new file mode 100644
index 000000000..64ed5bb43
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml
@@ -0,0 +1,270 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.MotorGroupElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:gif="http://wpfanimatedgif.codeplex.com"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="164.393" d:DesignWidth="224.65" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:MotorGroupItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+
+ <Grid x:Key="gridHoming">
+ <DockPanel>
+ <Button Click="OnHomingStopped" DockPanel.Dock="Right" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" VerticalAlignment="Center" Margin="0 0 5 0" ToolTip="Stop Homing">
+ <materialDesign:PackIcon Kind="Stop" Foreground="#FF5F5F" HorizontalAlignment="Center" VerticalAlignment="Center" Width="32" Height="32" />
+ </Button>
+ <ProgressBar Foreground="DimGray" BorderBrush="DimGray" Maximum="{Binding HomingMaximumProgress}" BorderThickness="1" Value="{Binding HomingProgress}" VerticalAlignment="Center" Height="10" Margin="5 0 5 0" Background="Transparent">
+
+ </ProgressBar>
+ </DockPanel>
+ </Grid>
+
+ <Grid x:Key="gridDefault">
+ <Viewbox Stretch="Fill">
+ <materialDesign:PackIcon Kind="Home" Margin="25 0" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+
+ <Button Click="OnHomingStarted" Style="{StaticResource emptyButton}" Background="Transparent" BorderThickness="0"></Button>
+ </Grid>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+ <Grid Margin="5" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="100*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid.RowDefinitions>
+ <RowDefinition Height="100*" />
+ <RowDefinition Height="30*" />
+ </Grid.RowDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+
+ <Grid>
+ <Image x:Name="image" Margin="5" gif:ImageBehavior.AnimatedSource="../Images/motor-group.gif" RenderOptions.BitmapScalingMode="Fant" gif:ImageBehavior.AutoStart="False" gif:ImageBehavior.AnimateInDesignMode="True" gif:ImageBehavior.RepeatBehavior="Forever"></Image>
+ </Grid>
+ </Border>
+ </Grid>
+
+ <Grid>
+ <Border BorderBrush="Gray" BorderThickness="1 1 0 1" Margin="0 10" CornerRadius="5 0 0 5" PreviewMouseDown="OnBackwardPressed" PreviewMouseUp="OnBackwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronLeft" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="2">
+ <Border BorderBrush="Gray" BorderThickness="0 1 1 1" Margin="0 10" CornerRadius="0 10 10 0" PreviewMouseDown="OnForwardPressed" PreviewMouseUp="OnForwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="0" />
+ <GradientStop Color="#FFEEEEEE" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-10 20">
+ <materialDesign:PackIcon Kind="ChevronRight" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="1" Grid.Row="1">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="115*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderBrush="Gray" BorderThickness="1 0 1 1" CornerRadius="0 0 20 20">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
+ <GradientStop Color="#979797" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Grid>
+ <ContentControl>
+ <ContentControl.Style>
+ <Style TargetType="ContentControl">
+ <Setter Property="Content" Value="{StaticResource gridDefault}">
+
+ </Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsHoming}" Value="True">
+ <Setter Property="Content" Value="{StaticResource gridHoming}">
+ </Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </ContentControl.Style>
+
+ </ContentControl>
+ </Grid>
+ </Border>
+ </Grid>
+ </Grid>
+
+
+ </Grid>
+
+ <!--Content-->
+ <Grid>
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding GroupName}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml.cs
new file mode 100644
index 000000000..4e29296b0
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MotorGroupElementEditor.xaml.cs
@@ -0,0 +1,177 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+using Tango.SharedUI.Components;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class MotorGroupElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public MotorGroupElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public MotorGroupElementEditor(MotorGroupItem motorGroupItem)
+ : this()
+ {
+ MotorGroupItem = motorGroupItem;
+ DataContext = MotorGroupItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public MotorGroupElementEditor(MotorGroupItem monitorItem, Rect bounds)
+ : this(monitorItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private MotorGroupItem _monitorItem;
+
+ public MotorGroupItem MotorGroupItem
+ {
+ get { return _monitorItem; }
+ set
+ {
+ _monitorItem = value; RaisePropertyChanged(nameof(MotorGroupItem));
+
+ if (_monitorItem != null)
+ {
+ _monitorItem.HomingCompleted -= _monitorItem_HomingCompleted;
+ _monitorItem.HomingCompleted += _monitorItem_HomingCompleted;
+ }
+ }
+ }
+
+ private void _monitorItem_HomingCompleted(object sender, EventArgs e)
+ {
+ StopAnimation();
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = MotorGroupItem.Clone() as MotorGroupItem;
+ MotorGroupElementEditor cloned = new MotorGroupElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return MotorGroupItem; }
+ }
+
+ private void OnForwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.ForwardPressed);
+ AnimateRight();
+ }
+
+ private void OnForwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.ForwardReleased);
+ StopAnimation();
+ }
+
+ private void OnBackwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.BackwardPressed);
+ AnimateLeft();
+ }
+
+ private void OnBackwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.BackwardReleased);
+ StopAnimation();
+ }
+
+ private void OnHomingStarted(object sender, RoutedEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.HomingStarted);
+ AnimateLeft();
+ }
+
+ private void OnHomingStopped(object sender, RoutedEventArgs e)
+ {
+ MotorGroupItem.RaiseAction(MotorActionType.HomingStopped);
+ StopAnimation();
+ }
+
+ private void AnimateRight()
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Play();
+ }
+
+ private void AnimateLeft()
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Play();
+ }
+
+ public void StopAnimation()
+ {
+ this.Dispatcher.Invoke(() =>
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Pause();
+ });
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml
new file mode 100644
index 000000000..51bb3ff9c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml
@@ -0,0 +1,81 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.MultiGraphElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.Common.Controls;assembly=Tango.MachineStudio.Common"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="150" d:DesignWidth="400" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:MultiGraphItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid>
+ <!--<Viewbox Stretch="Fill">-->
+ <controls:RealTimeGraphMultiControl x:Name="InnerGraph" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}" x:FieldModifier="public" EnableToolBar="False" SensorName="{Binding TechMonitor.Description}" SensorUnits="{Binding TechMonitor.Units}" Minimum="{Binding TechMonitor.Min}" Maximum="{Binding TechMonitor.Max}" />
+ <!--</Viewbox>-->
+
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MonitorItem.TechMonitor.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml.cs
new file mode 100644
index 000000000..88b25bddb
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/MultiGraphElementEditor.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class MultiGraphElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ public MultiGraphElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public MultiGraphElementEditor(MultiGraphItem graphItem)
+ : this()
+ {
+ GraphItem = graphItem;
+ DataContext = GraphItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public MultiGraphElementEditor(MultiGraphItem graphItem, Rect bounds)
+ : this(graphItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private MultiGraphItem _monitorItem;
+
+ public MultiGraphItem GraphItem
+ {
+ get { return _monitorItem; }
+ set { _monitorItem = value; RaisePropertyChanged(nameof(GraphItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = GraphItem.Clone() as MultiGraphItem;
+ MultiGraphElementEditor cloned = new MultiGraphElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return GraphItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml
new file mode 100644
index 000000000..a0dd0f697
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml
@@ -0,0 +1,81 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.SingleGraphElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:controls="clr-namespace:Tango.MachineStudio.Common.Controls;assembly=Tango.MachineStudio.Common"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="150" d:DesignWidth="400" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:SingleGraphItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+
+ <!--Content-->
+ <Grid>
+ <!--<Viewbox Stretch="Fill">-->
+ <controls:RealTimeGraphControl x:Name="InnerGraph" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}" x:FieldModifier="public" EnableToolBar="False" SensorName="{Binding TechMonitor.Description}" Color="{Binding Color,Mode=TwoWay}" SensorUnits="{Binding TechMonitor.Units}" Minimum="{Binding TechMonitor.Min}" Maximum="{Binding TechMonitor.Max}" />
+ <!--</Viewbox>-->
+
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=MonitorItem.TechMonitor.Description}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml.cs
new file mode 100644
index 000000000..b0efd1a02
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/SingleGraphElementEditor.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class SingleGraphElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ public SingleGraphElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public SingleGraphElementEditor(SingleGraphItem graphItem)
+ : this()
+ {
+ GraphItem = graphItem;
+ DataContext = GraphItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="GraphElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public SingleGraphElementEditor(SingleGraphItem graphItem, Rect bounds)
+ : this(graphItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private SingleGraphItem _monitorItem;
+
+ public SingleGraphItem GraphItem
+ {
+ get { return _monitorItem; }
+ set { _monitorItem = value; RaisePropertyChanged(nameof(GraphItem)); }
+ }
+
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = GraphItem.Clone() as SingleGraphItem;
+ SingleGraphElementEditor cloned = new SingleGraphElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return GraphItem; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml
new file mode 100644
index 000000000..3bac433ad
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml
@@ -0,0 +1,199 @@
+<local:ElementEditor x:Class="Tango.MachineStudio.Technician.Editors.ThreadMotionElementEditor"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:sharedConverters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:converters="clr-namespace:Tango.Editors.Converters;assembly=Tango.Editors"
+ xmlns:gif="http://wpfanimatedgif.codeplex.com"
+ xmlns:visuals="clr-namespace:Tango.Visuals;assembly=Tango.Visuals"
+ xmlns:local="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ mc:Ignorable="d"
+ d:DesignHeight="117.877" d:DesignWidth="219.334" Background="Transparent" ClipToBounds="False" BorderThickness="0" MinWidth="1" MinHeight="1" RenderTransformOrigin="0.5,0.5" d:DataContext="{d:DesignInstance Type=items:ThreadMotionItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"></converters:BoolToVisibilityConverter>
+ <sharedConverters:BooleanInverseConverter x:Key="BooleanInverseConverter" />
+
+ <!--Theme-->
+ <SolidColorBrush x:Key="BorderBrush" Color="Transparent"></SolidColorBrush>
+ <SolidColorBrush x:Key="CornersBrush" Color="Red"></SolidColorBrush>
+
+ <Grid x:Key="gridHoming">
+ <DockPanel>
+ <Button Click="OnHomingStopped" DockPanel.Dock="Right" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" VerticalAlignment="Center" Margin="0 0 5 0" ToolTip="Stop Homing">
+ <materialDesign:PackIcon Kind="Stop" Foreground="#FF5F5F" HorizontalAlignment="Center" VerticalAlignment="Center" Width="32" Height="32" />
+ </Button>
+ <ProgressBar Foreground="DimGray" BorderBrush="DimGray" Maximum="{Binding HomingMaximumProgress}" BorderThickness="1" Value="{Binding HomingProgress}" VerticalAlignment="Center" Height="10" Margin="5 0 5 0" Background="Transparent">
+
+ </ProgressBar>
+ </DockPanel>
+ </Grid>
+
+ <Grid x:Key="gridDefault">
+ <Viewbox Stretch="Fill">
+ <materialDesign:PackIcon Kind="Home" Margin="25 0" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+
+ <Button Click="OnHomingStarted" Style="{StaticResource emptyButton}" Background="Transparent" BorderThickness="0"></Button>
+ </Grid>
+ </UserControl.Resources>
+
+ <UserControl.RenderTransform>
+ <RotateTransform Angle="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=Angle}"></RotateTransform>
+ </UserControl.RenderTransform>
+
+ <Grid>
+
+ <Grid Margin="5" IsHitTestVisible="{Binding RelativeSource={RelativeSource AncestorType=local:ElementsEditor},Path=IsEditable,Converter={StaticResource BooleanInverseConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="20*"/>
+ <ColumnDefinition Width="100*"/>
+ <ColumnDefinition Width="20*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Grid.Column="1">
+ <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="5">
+ <Border.Background>
+ <ImageBrush ImageSource="../Images/black-screen.jpg" Opacity="0.1" />
+ </Border.Background>
+
+ <Grid>
+ <Image x:Name="image" Margin="5" gif:ImageBehavior.AnimatedSource="../Images/cogs-small.gif" RenderOptions.BitmapScalingMode="Fant" gif:ImageBehavior.AutoStart="False" gif:ImageBehavior.AnimateInDesignMode="True" gif:ImageBehavior.RepeatBehavior="Forever"></Image>
+ </Grid>
+ </Border>
+ </Grid>
+
+ <Grid>
+ <Border BorderBrush="Gray" BorderThickness="1 1 0 1" Margin="0 10" CornerRadius="5 0 0 5" PreviewMouseDown="OnBackwardPressed" PreviewMouseUp="OnBackwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="1" />
+ <GradientStop Color="#FFEEEEEE" Offset="0"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-5 20">
+ <materialDesign:PackIcon Kind="ChevronDoubleLeft" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+
+ <Grid Grid.Column="2">
+ <Border BorderBrush="Gray" BorderThickness="0 1 1 1" Margin="0 10" CornerRadius="0 10 10 0" PreviewMouseDown="OnForwardPressed" PreviewMouseUp="OnForwardReleased">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="1,0">
+ <GradientStop Color="#AAAAAA" Offset="0" />
+ <GradientStop Color="#FFEEEEEE" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Style.Triggers>
+ <EventTrigger RoutedEvent="PreviewMouseDown">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFCECECE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ <EventTrigger RoutedEvent="PreviewMouseUp">
+ <EventTrigger.Actions>
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color" To="#FFEEEEEE" Duration="00:00:0.1" />
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger.Actions>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+
+ <Viewbox Stretch="Fill" Margin="-5 20">
+ <materialDesign:PackIcon Kind="ChevronDoubleRight" HorizontalAlignment="Center" VerticalAlignment="Center" Width="24" Height="24" Foreground="#202020" />
+ </Viewbox>
+ </Border>
+ </Grid>
+ </Grid>
+
+ <!--Content-->
+ <Grid>
+ <Border Margin="0 0 0 -23" VerticalAlignment="Bottom">
+ <TextBlock Text="{Binding TechName}" FontSize="14" Foreground="DimGray" HorizontalAlignment="Center"></TextBlock>
+ </Border>
+ </Grid>
+ <!--Content-->
+
+
+ <Border BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=BorderBrush,TargetNullValue={StaticResource BorderBrush},FallbackValue={StaticResource BorderBrush}}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=(local:ElementsEditor.IsSelected),Converter={StaticResource BoolToVisibilityConverter}}">
+ <Grid>
+ <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=InnerContent}"></ContentPresenter>
+
+ <Thumb Opacity="0" DragDelta="MoveDrag" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Left" Cursor="SizeWE" Opacity="0" DragDelta="DragLeft" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb HorizontalAlignment="Right" Cursor="SizeWE" Opacity="0" DragDelta="DragRight" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Top" Cursor="SizeNS" Opacity="0" DragDelta="DragTop" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+ <Thumb VerticalAlignment="Bottom" Cursor="SizeNS" Opacity="0" DragDelta="DragBottom" DragStarted="DragStarted" DragCompleted="OnDragEnded"></Thumb>
+
+ <Grid ClipToBounds="False" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0 -20 0 0" Width="10" Height="10">
+ <Ellipse Stroke="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" StrokeThickness="2"></Ellipse>
+ <Rectangle HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0 10 0 -8" StrokeThickness="1" Stroke="Red"></Rectangle>
+ <Thumb Opacity="0" DragDelta="DragAngle" DragStarted="DragStarted" Cursor="Arrow" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-8 -8 0 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 2 0 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopLeft" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 -8 -8 0">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 2 2 0"></Border>
+ <Thumb Opacity="0" DragDelta="DragTopRight" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 -8 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="0 0 2 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomRight" DragStarted="DragStarted" Cursor="SizeNWSE" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+
+ <Grid Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="-8 0 0 -8">
+ <Border BorderBrush="{Binding RelativeSource={RelativeSource AncestorType=local:ElementEditor},Path=CornersBrush,TargetNullValue={StaticResource CornersBrush},FallbackValue={StaticResource CornersBrush}}" BorderThickness="2 0 0 2"></Border>
+ <Thumb Opacity="0" DragDelta="DragBottomLeft" DragStarted="DragStarted" Cursor="SizeNESW" DragCompleted="OnDragEnded"></Thumb>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</local:ElementEditor>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml.cs
new file mode 100644
index 000000000..a3101409d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Editors/ThreadMotionElementEditor.xaml.cs
@@ -0,0 +1,164 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.Editors
+{
+ [ContentProperty("InnerContent")]
+ public partial class ThreadMotionElementEditor : ElementEditor
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ public ThreadMotionElementEditor()
+ : base()
+ {
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ public ThreadMotionElementEditor(ThreadMotionItem motorItem)
+ : this()
+ {
+ ThreadMotionItem = motorItem;
+ DataContext = ThreadMotionItem;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorElementEditor"/> class.
+ /// </summary>
+ /// <param name="frameworkElement">The framework element.</param>
+ /// <param name="bounds">The bounds.</param>
+ public ThreadMotionElementEditor(ThreadMotionItem threadMotionItem, Rect bounds)
+ : this(threadMotionItem)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ private ThreadMotionItem _threadMotionItem;
+
+ public ThreadMotionItem ThreadMotionItem
+ {
+ get { return _threadMotionItem; }
+ set
+ {
+ _threadMotionItem = value; RaisePropertyChanged(nameof(ThreadMotionItem));
+ }
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override IElementEditor Clone()
+ {
+ try
+ {
+ var clonedItem = ThreadMotionItem.Clone() as ThreadMotionItem;
+ ThreadMotionElementEditor cloned = new ThreadMotionElementEditor(clonedItem);
+ cloned.Top = Top;
+ cloned.Left = Left;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ return cloned;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException("Could not clone this editor. You may have to create a custom editor and implement a custom Clone method.", ex);
+ }
+ }
+
+ /// <summary>
+ /// Gets the hosted element.
+ /// </summary>
+ [ParameterIgnore]
+ public override Object HostedElement
+ {
+ get { return ThreadMotionItem; }
+ }
+
+ private void OnForwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.ForwardPressed);
+ AnimateRight();
+ }
+
+ private void OnForwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.ForwardReleased);
+ StopAnimation();
+ }
+
+ private void OnBackwardPressed(object sender, MouseButtonEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.BackwardPressed);
+ AnimateLeft();
+ }
+
+ private void OnBackwardReleased(object sender, MouseButtonEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.BackwardReleased);
+ StopAnimation();
+ }
+
+ private void OnHomingStarted(object sender, RoutedEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.HomingStarted);
+ AnimateLeft();
+ }
+
+ private void OnHomingStopped(object sender, RoutedEventArgs e)
+ {
+ ThreadMotionItem.RaiseAction(MotorActionType.HomingStopped);
+ StopAnimation();
+ }
+
+ private void AnimateRight()
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Play();
+ }
+
+ private void AnimateLeft()
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Play();
+ }
+
+ public void StopAnimation()
+ {
+ this.Dispatcher.Invoke(() =>
+ {
+ WpfAnimatedGif.ImageBehavior.GetAnimationController(image).Pause();
+ });
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Fonts/digital-7.ttf b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Fonts/digital-7.ttf
new file mode 100644
index 000000000..5dbe6f908
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Fonts/digital-7.ttf
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Helpers/GraphsHelper.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Helpers/GraphsHelper.cs
new file mode 100644
index 000000000..78466ace8
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Helpers/GraphsHelper.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Settings;
+
+namespace Tango.MachineStudio.Technician.Helpers
+{
+ /// <summary>
+ /// Contains RealTimeGraphEx helper methods.
+ /// </summary>
+ public static class GraphsHelper
+ {
+ /// <summary>
+ /// Gets the maximum points graph points by correlating between seconds duration from settings and expected graph points per frame.
+ /// </summary>
+ /// <param name="pointsPerFrame">Length of graph points per frame.</param>
+ /// <returns></returns>
+ public static int GetMaxPoints(double pointsPerFrame)
+ {
+ try
+ {
+ double seconds = SettingsManager.Default.MachineStudio.TechnicianModule.GraphsDuration;
+ double pullRate = SettingsManager.Default.MachineStudio.TechnicianModule.GraphsPullingInterval;
+ return (int)(((pullRate * pointsPerFrame * 10 * seconds) * (10 / pullRate)) * 0.65);
+ }
+ catch (Exception)
+ {
+ return 300;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/analog.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/analog.png
new file mode 100644
index 000000000..2651a64b0
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/analog.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/binary.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/binary.png
new file mode 100644
index 000000000..24b399f96
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/binary.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/black-screen.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/black-screen.jpg
new file mode 100644
index 000000000..7ed5c3eb2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/black-screen.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/box.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/box.png
new file mode 100644
index 000000000..105de7979
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/box.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/cogs-small.gif b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/cogs-small.gif
new file mode 100644
index 000000000..605948166
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/cogs-small.gif
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/digital-in.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/digital-in.png
new file mode 100644
index 000000000..3b5ebac18
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/digital-in.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-big.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-big.png
new file mode 100644
index 000000000..284b1da0e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-big.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-line.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-line.png
new file mode 100644
index 000000000..9e2e344c0
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/dispenser-line.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/engine.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/engine.png
new file mode 100644
index 000000000..731ddc4f6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/engine.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/graph.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/graph.png
new file mode 100644
index 000000000..0aca05e00
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/graph.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.gif b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.gif
new file mode 100644
index 000000000..682a20da7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.gif
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.png
new file mode 100644
index 000000000..0dca92823
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/motor-group.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/multi-graph.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/multi-graph.png
new file mode 100644
index 000000000..096d75cc4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/multi-graph.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/prop.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/prop.png
new file mode 100644
index 000000000..268c1e557
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/prop.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/seamless-grid.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/seamless-grid.jpg
new file mode 100644
index 000000000..59bb9c370
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/seamless-grid.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/single-graph.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/single-graph.png
new file mode 100644
index 000000000..f72f56a87
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/single-graph.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/technician.jpg b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/technician.jpg
new file mode 100644
index 000000000..9888244c4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/technician.jpg
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/tft-screen.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/tft-screen.png
new file mode 100644
index 000000000..d170c7f0f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/tft-screen.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation.gif b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation.gif
new file mode 100644
index 000000000..7999d639c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation.gif
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation2.gif b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation2.gif
new file mode 100644
index 000000000..8b60a6b09
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread-animation2.gif
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread.png
new file mode 100644
index 000000000..aa5a46140
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/thread.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/volume.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/volume.png
new file mode 100644
index 000000000..4f48f7528
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/volume.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/white-box.png b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/white-box.png
new file mode 100644
index 000000000..aee42d95a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Images/white-box.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationManager.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationManager.cs
new file mode 100644
index 000000000..ddfb84920
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationManager.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.MachineStudio.Technician.Views;
+
+namespace Tango.MachineStudio.Technician.Navigation
+{
+ /// <summary>
+ /// Represents the technician module navigation manager.
+ /// </summary>
+ public class TechNavigationManager
+ {
+ /// <summary>
+ /// Navigates to the specified view.
+ /// </summary>
+ /// <param name="view">The view.</param>
+ public void NavigateTo(TechNavigationView view)
+ {
+ MainView.Instance.TransitionControl.AutoNavigate(view.ToString());
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationView.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationView.cs
new file mode 100644
index 000000000..b4a85f92a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Navigation/TechNavigationView.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Technician.Navigation
+{
+ /// <summary>
+ /// Represents the available technician module views.
+ /// </summary>
+ public enum TechNavigationView
+ {
+ Overview,
+ Motors,
+ Sensors,
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Project/MachineTechViewProject.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Project/MachineTechViewProject.cs
new file mode 100644
index 000000000..700e04f7d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Project/MachineTechViewProject.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.MachineStudio.Technician.TechItems;
+using Tango.Serialization;
+
+namespace Tango.MachineStudio.Technician.Project
+{
+ public class MachineTechViewProject
+ {
+ public List<TechItem> Items { get; set; }
+
+ public MachineTechViewProject()
+ {
+ Items = new List<TechItem>();
+ }
+
+ public void Save(String fileName)
+ {
+ XmlDataSerializer serializer = new XmlDataSerializer();
+ serializer.SerializeToFile(this, fileName);
+ }
+
+ public static MachineTechViewProject Load(String fileName)
+ {
+ XmlDataSerializer serializer = new XmlDataSerializer();
+ return serializer.DeserializeFromFile<MachineTechViewProject>(fileName);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..73b9c68fc
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/AssemblyInfo.cs
@@ -0,0 +1,18 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+[assembly: AssemblyTitle("Tango - Machine Studio Technician Module")]
+
+[assembly: ComVisible(false)]
+
+[assembly:ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.Designer.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..def861501
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// 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.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.MachineStudio.Technician.Properties {
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // 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.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if ((resourceMan == null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.MachineStudio.Technician.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.resx b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.resx
new file mode 100644
index 000000000..af7dbebba
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.Designer.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..a6c737bfc
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// 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.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.MachineStudio.Technician.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.settings b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.settings
new file mode 100644
index 000000000..033d7a5e9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml
new file mode 100644
index 000000000..1121fe9e1
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml
@@ -0,0 +1,33 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.DigitalInTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:DigitalOutItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:TechIosToDigitalInsConverter x:Key="TechIosToDigitalInsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="INPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Pin</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechIos,Converter={StaticResource TechIosToDigitalInsConverter}}" SelectedItem="{Binding TechIo,Mode=TwoWay}" DisplayMemberPath="Description" />
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml.cs
new file mode 100644
index 000000000..9862a95b9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalInTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class DigitalInTemplate : UserControl
+ {
+ public DigitalInTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml
new file mode 100644
index 000000000..dafceefcb
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml
@@ -0,0 +1,33 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.DigitalOutTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:DigitalOutItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:TechIosToDigitalOutsConverter x:Key="TechIosToDigitalOutsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="OUTPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Pin</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechIos,Converter={StaticResource TechIosToDigitalOutsConverter}}" SelectedItem="{Binding TechIo,Mode=TwoWay}" DisplayMemberPath="Description" />
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml.cs
new file mode 100644
index 000000000..58a3fcb8f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DigitalOutTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class DigitalOutTemplate : UserControl
+ {
+ public DigitalOutTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml
new file mode 100644
index 000000000..a732e2924
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml
@@ -0,0 +1,44 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.DispenserTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:DispenserItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="DISPENSER">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Motor</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechDispensers}" SelectedItem="{Binding TechDispenser,Mode=TwoWay}" DisplayMemberPath="Description" />
+
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Speed</Run> <Run Text="{Binding Speed,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding Speed,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+
+ <GroupBox Header="COLOR" Margin="0 10 0 0">
+ <StackPanel>
+ <Viewbox Margin="0 5 0 0">
+ <colorPicker:ColorCanvas SelectedColor="{Binding Color,Mode=TwoWay}" Background="Transparent" />
+ </Viewbox>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml.cs
new file mode 100644
index 000000000..dd3a21b07
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/DispenserTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class DispenserTemplate : UserControl
+ {
+ public DispenserTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml
new file mode 100644
index 000000000..d56925bbd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml
@@ -0,0 +1,64 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.MeterTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:System="clr-namespace:System;assembly=mscorlib"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:MeterItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <ObjectDataProvider x:Key="tickPlacement" MethodName="GetValues"
+ ObjectType="{x:Type System:Enum}">
+ <ObjectDataProvider.MethodParameters>
+ <x:Type TypeName="TickPlacement"/>
+ </ObjectDataProvider.MethodParameters>
+ </ObjectDataProvider>
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="INPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Input</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechMonitors,Converter={StaticResource MonitorsToSingleChannleMonitorsConverter}}" SelectedItem="{Binding TechMonitor,Mode=TwoWay}" DisplayMemberPath="Description" />
+
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Update Interval</Run> <Run Text="{Binding UpdateInterval,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding UpdateInterval,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+ <GroupBox Header="STYLE" Margin="0 10 0 0">
+ <StackPanel>
+ <TextBlock FontSize="10"><Run>Led Count:</Run> <Run Text="{Binding LedCount}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="8" Maximum="100" Value="{Binding LedCount}"></Slider>
+
+ <TextBlock Margin="0 20 0 0" FontSize="10"><Run>Ticks Count:</Run> <Run Text="{Binding TicksCount}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="2" Maximum="100" Value="{Binding TicksCount}"></Slider>
+
+ <TextBlock Margin="0 20 0 0" FontSize="10" Text="Ticks Placement"></TextBlock>
+ <ComboBox ItemsSource="{Binding Source={StaticResource tickPlacement}}" SelectedItem="{Binding TickPlacement}" />
+ </StackPanel>
+ </GroupBox>
+
+ <GroupBox Header="COLOR" Margin="0 10 0 0">
+ <StackPanel>
+ <Viewbox Margin="0 5 0 0">
+ <colorPicker:ColorCanvas SelectedColor="{Binding Color,Mode=TwoWay}" Background="Transparent" />
+ </Viewbox>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml.cs
new file mode 100644
index 000000000..11de9f85e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MeterTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class MeterTemplate : UserControl
+ {
+ public MeterTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml
new file mode 100644
index 000000000..3b84abee2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml
@@ -0,0 +1,43 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.MonitorTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:MonitorItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="INPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Input</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechMonitors,Converter={StaticResource MonitorsToSingleChannleMonitorsConverter}}" SelectedItem="{Binding TechMonitor,Mode=TwoWay}" DisplayMemberPath="Description" />
+
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Update Interval</Run> <Run Text="{Binding UpdateInterval,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding UpdateInterval,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+ <GroupBox Header="COLOR" Margin="0 10 0 0">
+ <StackPanel>
+ <Viewbox Margin="0 5 0 0">
+ <colorPicker:ColorCanvas SelectedColor="{Binding Color,Mode=TwoWay}" Background="Transparent" />
+ </Viewbox>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml.cs
new file mode 100644
index 000000000..8b5396ffc
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MonitorTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class MonitorTemplate : UserControl
+ {
+ public MonitorTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml
new file mode 100644
index 000000000..4210d12a6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml
@@ -0,0 +1,54 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.MotorGroupTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:MotorGroupItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="GROUP NAME">
+ <TextBox Text="{Binding GroupName,UpdateSourceTrigger=PropertyChanged}"></TextBox>
+ </GroupBox>
+ <GroupBox Header="MOTORS" Margin="0 10 0 0">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Motors</TextBlock>
+ <Grid>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding SelectedMotors}">
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <CheckBox IsChecked="{Binding IsSelected,Mode=TwoWay}" VerticalAlignment="Center"></CheckBox>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Text="{Binding Data.Description}"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ <TextBlock IsHitTestVisible="False" VerticalAlignment="Center" Margin="5 0 0 0">
+ <Run Text="{Binding SelectedMotors.SynchedSource.Count,Mode=OneWay}"></Run>
+ <Run>Motors</Run>
+ </TextBlock>
+ </Grid>
+
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Speed</Run> <Run Text="{Binding Speed,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding Speed,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml.cs
new file mode 100644
index 000000000..8d2c3df8a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorGroupTemplate.xaml.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.TechItems;
+using Tango.SharedUI.Components;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class MotorGroupTemplate : UserControl
+ {
+ public MotorGroupTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml
new file mode 100644
index 000000000..0d92230ad
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml
@@ -0,0 +1,44 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.MotorTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:MotorItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="MOTOR">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Motor</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechMotors}" SelectedItem="{Binding TechMotor,Mode=TwoWay}" DisplayMemberPath="Description" />
+
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Speed</Run> <Run Text="{Binding Speed,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding Speed,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+
+ <GroupBox Header="COLOR" Margin="0 10 0 0">
+ <StackPanel>
+ <Viewbox Margin="0 5 0 0">
+ <colorPicker:ColorCanvas SelectedColor="{Binding Color,Mode=TwoWay}" Background="Transparent" />
+ </Viewbox>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml.cs
new file mode 100644
index 000000000..3ac58ce5d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MotorTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class MotorTemplate : UserControl
+ {
+ public MotorTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml
new file mode 100644
index 000000000..8602b4a1d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml
@@ -0,0 +1,33 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.MultiGraphTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:SingleGraphItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToMultiChannleMonitorsConverter x:Key="MonitorsToMultiChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="INPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Input</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechMonitors,Converter={StaticResource MonitorsToMultiChannleMonitorsConverter}}" SelectedItem="{Binding TechMonitor,Mode=TwoWay}" DisplayMemberPath="Description" />
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml.cs
new file mode 100644
index 000000000..ae5cf4f89
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/MultiGraphTemplate.xaml.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for SingleGraphTemplate.xaml
+ /// </summary>
+ public partial class MultiGraphTemplate : UserControl
+ {
+ public MultiGraphTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml
new file mode 100644
index 000000000..4546c0a75
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml
@@ -0,0 +1,41 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.SingleGraphTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="400" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:SingleGraphItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="INPUT">
+ <StackPanel>
+ <TextBlock FontSize="10">Selected Input</TextBlock>
+ <ComboBox Margin="0 5 0 0" ItemsSource="{Binding Adapter.TechMonitors,Converter={StaticResource MonitorsToSingleChannleMonitorsConverter}}" SelectedItem="{Binding TechMonitor,Mode=TwoWay}" DisplayMemberPath="Description" />
+ </StackPanel>
+ </GroupBox>
+
+ <GroupBox Margin="0 10 0 0" Header="COLOR">
+ <StackPanel>
+ <Viewbox Margin="0 5 0 0">
+ <colorPicker:ColorCanvas SelectedColor="{Binding Color,Mode=TwoWay}" Background="Transparent" />
+ </Viewbox>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml.cs
new file mode 100644
index 000000000..4ccb703b4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/SingleGraphTemplate.xaml.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.MachineStudio.Technician.TechItems;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for SingleGraphTemplate.xaml
+ /// </summary>
+ public partial class SingleGraphTemplate : UserControl
+ {
+ public SingleGraphTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml
new file mode 100644
index 000000000..771f48fe7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml
@@ -0,0 +1,33 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.PropertiesTemplates.ThreadMotionTemplate"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ mc:Ignorable="d"
+ d:DesignHeight="500" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=items:ThreadMotionItem, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:MonitorsToSingleChannleMonitorsConverter x:Key="MonitorsToSingleChannleMonitorsConverter" />
+
+ <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
+ <Setter Property="mahapps:ControlsHelper.HeaderFontSize" Value="14" />
+ <Setter Property="Margin" Value="2" />
+ </Style>
+ </UserControl.Resources>
+
+ <Grid>
+ <StackPanel>
+ <GroupBox Header="THREAD MOTION">
+ <StackPanel>
+ <TextBlock FontSize="10" Margin="0 20 0 0"><Run>Speed</Run> <Run Text="{Binding Speed,StringFormat={}{0:N0} ms,FallbackValue=0}"></Run></TextBlock>
+ <Slider Margin="0 5 0 0" Minimum="1" Maximum="1000" Value="{Binding Speed,Mode=TwoWay}"></Slider>
+ </StackPanel>
+ </GroupBox>
+ </StackPanel>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml.cs
new file mode 100644
index 000000000..a46bdbbbf
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/PropertiesTemplates/ThreadMotionTemplate.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.PropertiesTemplates
+{
+ /// <summary>
+ /// Interaction logic for MonitorTemplate.xaml
+ /// </summary>
+ public partial class ThreadMotionTemplate : UserControl
+ {
+ public ThreadMotionTemplate()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Resources/GraphEx.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Resources/GraphEx.xaml
new file mode 100644
index 000000000..85cccc2dd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Resources/GraphEx.xaml
@@ -0,0 +1,126 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Resources">
+
+ <FontFamily x:Key="FontName">Segoe UI</FontFamily>
+ <FontFamily x:Key="NotesFont">Lucida Console</FontFamily>
+
+ <sys:Double x:Key="ExtraExtraLargeFontSize">28</sys:Double>
+ <sys:Double x:Key="ExtraLargeFontSize">26</sys:Double>
+ <sys:Double x:Key="LargeFontSize">20</sys:Double>
+ <sys:Double x:Key="MediumFontSize">16</sys:Double>
+ <sys:Double x:Key="SmallFontSize">14</sys:Double>
+ <sys:Double x:Key="MiniFontSize">12</sys:Double>
+ <sys:Double x:Key="TinyFontSize">9</sys:Double>
+
+ <!--Colors-->
+ <Color x:Key="borderColor">Silver</Color>
+ <Color x:Key="graphGridLinesColor">#FFE9E9E9</Color>
+ <Color x:Key="graphsMarkerColor">Gray</Color>
+ <Color x:Key="materialColor">#03A9F4</Color>
+
+
+ <!--Brushes-->
+ <SolidColorBrush x:Key="borderBrush" Color="{StaticResource borderColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="BlackBrush" Color="#545454"></SolidColorBrush>
+
+ <SolidColorBrush x:Key="graphGridLinesLightBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesDarkBrush" Color="#FF2E2E2E"></SolidColorBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundLight">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundDark">
+ <GradientStop Color="Black"/>
+ <GradientStop Color="#FF333333" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackground">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLabelBackground" Opacity="0.7">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFD9D9D9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLegendBackground" Opacity="0.7">
+ <GradientStop Color="#FFE9E9E9"/>
+ <GradientStop Color="#FFBDBDBD" Offset="1"/>
+ </LinearGradientBrush>
+
+ <SolidColorBrush Color="#FFF1F1F1" x:Key="topBarBackgroundBrush"></SolidColorBrush>
+
+ <!--Navigation Link Button-->
+ <Style x:Key="LinkButton" TargetType="Button">
+ <Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <TextBlock FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}">
+ <ContentPresenter /></TextBlock>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Foreground" Value="{StaticResource BlackBrush}" />
+ <Style.Triggers>
+ <Trigger Property="IsEnabled" Value="False">
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ </Trigger>
+ <Trigger Property="IsMouseOver" Value="true">
+ <Setter Property="Foreground" Value="{StaticResource AccentColorBrush}" />
+ </Trigger>
+ <EventTrigger RoutedEvent="TouchUp">
+ <BeginStoryboard>
+ <Storyboard>
+ <ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0" To="{StaticResource BlackColor}"></ColorAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </EventTrigger>
+ </Style.Triggers>
+ </Style>
+ <!--Navigation Link Button-->
+
+
+ <!--Graph Label-->
+ <Style x:Key="graphLabel" TargetType="Label">
+ <Style.Setters>
+ <Setter Property="IsHitTestVisible" Value="False"></Setter>
+ <Setter Property="Margin" Value="-1 -1 0 0"></Setter>
+ <Setter Property="HorizontalAlignment" Value="Left"></Setter>
+ <Setter Property="VerticalAlignment" Value="Top"></Setter>
+ <Setter Property="Padding" Value="0"></Setter>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Border Width="Auto" Padding="0 0 20 0" Height="25" BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1" CornerRadius="0 0 30 0" Background="{StaticResource graphLabelBackground}" >
+ <TextBlock Margin="5 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="{StaticResource TinyFontSize}" Text="{Binding}"></TextBlock>
+ </Border>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ <!--Graph Label-->
+
+
+ <!--Graph Ticks Template-->
+ <DataTemplate x:Key="graphTicksTemplate">
+ <Ellipse Width="3" Height="3" Margin="0 0 0 0" Fill="{StaticResource AccentColorBrush}"></Ellipse>
+ </DataTemplate>
+ <!--Graph Ticks Template-->
+
+ <DataTemplate x:Key="graphTooltipTemplate">
+ <Border CornerRadius="5" BorderThickness="1" BorderBrush="White" Padding="8" MinWidth="50" Margin="20 0 20 0">
+ <Border.Background>
+ <SolidColorBrush Color="Black" Opacity="0.5"></SolidColorBrush>
+ </Border.Background>
+ <TextBlock Foreground="White" FontSize="10" HorizontalAlignment="Center" TextAlignment="Center" Text="{Binding StringFormat='0.000'}"></TextBlock>
+ </Border>
+ </DataTemplate>
+</ResourceDictionary> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Tango.MachineStudio.Technician.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Tango.MachineStudio.Technician.csproj
new file mode 100644
index 000000000..08c1980f4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Tango.MachineStudio.Technician.csproj
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{5D39C1E1-3ECD-4634-BD1B-2BCF71C54A15}</ProjectGuid>
+ <OutputType>library</OutputType>
+ <RootNamespace>Tango.MachineStudio.Technician</RootNamespace>
+ <AssemblyName>Tango.MachineStudio.Technician</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>..\..\..\Build\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="FontAwesome.WPF, Version=4.7.0.37774, Culture=neutral, PublicKeyToken=0758b07a11a4f466, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\FontAwesome.WPF.4.7.0.9\lib\net40\FontAwesome.WPF.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
+ </Reference>
+ <Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
+ </Reference>
+ <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath>
+ </Reference>
+ <Reference Include="MahApps.Metro, Version=1.5.0.23, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignColors, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignColors.1.1.2\lib\net45\MaterialDesignColors.dll</HintPath>
+ </Reference>
+ <Reference Include="MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Reactive.Core, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Interfaces, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Interfaces.3.1.1\lib\net45\System.Reactive.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Linq, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Linq.3.1.1\lib\net46\System.Reactive.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.PlatformServices, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.PlatformServices.3.1.1\lib\net46\System.Reactive.PlatformServices.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Windows.Threading, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Windows" />
+ <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ <Reference Include="WpfAnimatedGif, Version=1.4.14.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\..\..\packages\WpfAnimatedGif.1.4.14\lib\net\WpfAnimatedGif.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Converters\MonitorsToMultiChannleMonitorsConverter.cs" />
+ <Compile Include="Converters\MonitorsToSingleChannleMonitorsConverter.cs" />
+ <Compile Include="Converters\SecondsToGraphPointsConverter.cs" />
+ <Compile Include="Converters\TechIosToDigitalInsConverter.cs" />
+ <Compile Include="Converters\TechIosToDigitalOutsConverter.cs" />
+ <Compile Include="Converters\TransitionLinkConverter.cs" />
+ <Compile Include="Editors\DigitalInElementEditor.xaml.cs">
+ <DependentUpon>DigitalInElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\DispenserElementEditor.xaml.cs">
+ <DependentUpon>DispenserElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\DigitalOutElementEditor.xaml.cs">
+ <DependentUpon>DigitalOutElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\MotorGroupElementEditor.xaml.cs">
+ <DependentUpon>MotorGroupElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\ThreadMotionElementEditor.xaml.cs">
+ <DependentUpon>ThreadMotionElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\MotorElementEditor.xaml.cs">
+ <DependentUpon>MotorElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\MeterElementEditor.xaml.cs">
+ <DependentUpon>MeterElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\MultiGraphElementEditor.xaml.cs">
+ <DependentUpon>MultiGraphElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\SingleGraphElementEditor.xaml.cs">
+ <DependentUpon>SingleGraphElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Editors\MonitorElementEditor.xaml.cs">
+ <DependentUpon>MonitorElementEditor.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Helpers\GraphsHelper.cs" />
+ <Compile Include="Project\MachineTechViewProject.cs" />
+ <Compile Include="PropertiesTemplates\DigitalInTemplate.xaml.cs">
+ <DependentUpon>DigitalInTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\DigitalOutTemplate.xaml.cs">
+ <DependentUpon>DigitalOutTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\MeterTemplate.xaml.cs">
+ <DependentUpon>MeterTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\DispenserTemplate.xaml.cs">
+ <DependentUpon>DispenserTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\MotorGroupTemplate.xaml.cs">
+ <DependentUpon>MotorGroupTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\ThreadMotionTemplate.xaml.cs">
+ <DependentUpon>ThreadMotionTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\MotorTemplate.xaml.cs">
+ <DependentUpon>MotorTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\MonitorTemplate.xaml.cs">
+ <DependentUpon>MonitorTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\MultiGraphTemplate.xaml.cs">
+ <DependentUpon>MultiGraphTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="PropertiesTemplates\SingleGraphTemplate.xaml.cs">
+ <DependentUpon>SingleGraphTemplate.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="TechItems\DigitalInItem.cs" />
+ <Compile Include="TechItems\DigitalOutItem.cs" />
+ <Compile Include="TechItems\MeterItem.cs" />
+ <Compile Include="TechItems\MotorActionType.cs" />
+ <Compile Include="TechItems\DispenserItem.cs" />
+ <Compile Include="TechItems\MotorItem.cs" />
+ <Compile Include="TechItems\MultiGraphItem.cs" />
+ <Compile Include="TechItems\MotorGroupItem.cs" />
+ <Compile Include="TechItems\SingleGraphItem.cs" />
+ <Compile Include="TechItems\MonitorItem.cs" />
+ <Compile Include="TechItems\TechItem.cs" />
+ <Compile Include="Navigation\TechNavigationView.cs" />
+ <Compile Include="Navigation\TechNavigationManager.cs" />
+ <Compile Include="TechItems\TechItemAttribute.cs" />
+ <Compile Include="TechItems\ThreadMotionItem.cs" />
+ <Compile Include="TechnicianModule.cs" />
+ <Compile Include="ViewModelLocator.cs" />
+ <Compile Include="ViewModels\MachineTechViewVM.cs" />
+ <Compile Include="ViewModels\MainViewVM.cs" />
+ <Compile Include="ViewModels\SensorsViewVM.cs" />
+ <Compile Include="Views\MachineTechView.xaml.cs">
+ <DependentUpon>MachineTechView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\MotorsView.xaml.cs">
+ <DependentUpon>MotorsView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\OverviewView.xaml.cs">
+ <DependentUpon>OverviewView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\SensorsView.xaml.cs">
+ <DependentUpon>SensorsView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Views\MainView.xaml.cs">
+ <DependentUpon>MainView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="..\..\..\Versioning\GlobalVersionInfo.cs">
+ <Link>GlobalVersionInfo.cs</Link>
+ </Compile>
+ <Page Include="Editors\DigitalInElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\DispenserElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\DigitalOutElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\MotorGroupElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\ThreadMotionElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\MotorElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\MeterElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\MultiGraphElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\SingleGraphElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Editors\MonitorElementEditor.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\DigitalInTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\DigitalOutTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\MeterTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\DispenserTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\MotorGroupTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\ThreadMotionTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\MotorTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\MonitorTemplate.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="PropertiesTemplates\MultiGraphTemplate.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="PropertiesTemplates\SingleGraphTemplate.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Resources\GraphEx.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\MachineTechView.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Views\MotorsView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\OverviewView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\SensorsView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Views\MainView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="app.config" />
+ <Resource Include="Fonts\digital-7.ttf" />
+ <None Include="packages.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\SideChains\RealTimeGraphEx\RealTimeGraphEx.csproj">
+ <Project>{b9ae25d6-be35-492f-9079-21a7f3e6f7cc}</Project>
+ <Name>RealTimeGraphEx</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.ColorPicker\Tango.ColorPicker.csproj">
+ <Project>{a2f5af44-29ff-45d6-9d25-ecda5cce88b5}</Project>
+ <Name>Tango.ColorPicker</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj">
+ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
+ <Name>Tango.Core</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Editors\Tango.Editors.csproj">
+ <Project>{de2f2b86-025b-4f26-83a4-38bd48224ed5}</Project>
+ <Name>Tango.Editors</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj">
+ <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
+ <Name>Tango.Integration</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj">
+ <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project>
+ <Name>Tango.Logging</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.PMR\Tango.PMR.csproj">
+ <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project>
+ <Name>Tango.PMR</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Serialization\Tango.Serialization.csproj">
+ <Project>{22f87980-e990-4686-be81-be63d562c4d5}</Project>
+ <Name>Tango.Serialization</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Settings\Tango.Settings.csproj">
+ <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project>
+ <Name>Tango.Settings</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj">
+ <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
+ <Name>Tango.SharedUI</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Transport\Tango.Transport.csproj">
+ <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
+ <Name>Tango.Transport</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\Tango.Visuals\Tango.Visuals.csproj">
+ <Project>{cf7c0ff4-9440-42cf-83b8-c060772792d4}</Project>
+ <Name>Tango.Visuals</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.MachineStudio.Common\Tango.MachineStudio.Common.csproj">
+ <Project>{cb0b0aa2-bb24-4bca-a720-45e397684e12}</Project>
+ <Name>Tango.MachineStudio.Common</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\technician.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\black-screen.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\analog.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\graph.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\single-graph.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\white-box.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\seamless-grid.jpg" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\box.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\multi-graph.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\prop.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\engine.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\dispenser-line.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\dispenser-big.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\volume.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\binary.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\tft-screen.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\thread.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\thread-animation.gif" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\thread-animation2.gif" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\cogs-small.gif" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\motor-group.gif" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\motor-group.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\digital-in.png" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalInItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalInItem.cs
new file mode 100644
index 000000000..7f1548254
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalInItem.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a digital input pin item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(0)]
+ public class DigitalInItem : TechItem
+ {
+ private TechIo _techIo;
+ /// <summary>
+ /// Gets or sets the DB tech item.
+ /// </summary>
+ [XmlIgnore]
+ public TechIo TechIo
+ {
+ get { return _techIo; }
+ set { _techIo = value; RaisePropertyChangedAuto(); TechName = _techIo != null ? _techIo.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private bool _value;
+ /// <summary>
+ /// Gets or sets whether the input is on.
+ /// </summary>
+ [XmlIgnore]
+ public bool Value
+ {
+ get { return _value; }
+ set { _value = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DigitalInItem"/> class.
+ /// </summary>
+ public DigitalInItem() : base()
+ {
+ Name = "Digital In";
+ Description = "Digital Input Pin LED";
+ Image = ResourceHelper.GetImageFromResources("Images/digital-in.png");
+ Color = Colors.White;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DigitalInItem"/> class.
+ /// </summary>
+ /// <param name="techIo">The db tech.</param>
+ public DigitalInItem(TechIo techIo) : this()
+ {
+ TechIo = techIo;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ DigitalInItem cloned = base.Clone() as DigitalInItem;
+ cloned.TechIo = TechIo;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalOutItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalOutItem.cs
new file mode 100644
index 000000000..2a0625c53
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DigitalOutItem.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a digital output pin item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(1)]
+ public class DigitalOutItem : TechItem
+ {
+ /// <summary>
+ /// Occurs when the user has changed the current value.
+ /// </summary>
+ public event EventHandler<bool> ValueChanged;
+
+ private TechIo _techIo;
+ /// <summary>
+ /// Gets or sets the db tech item.
+ /// </summary>
+ [XmlIgnore]
+ public TechIo TechIo
+ {
+ get { return _techIo; }
+ set { _techIo = value; RaisePropertyChangedAuto(); TechName = _techIo != null ? _techIo.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private bool _value;
+ /// <summary>
+ /// Gets or sets a value indicating whether this <see cref="DigitalOutItem"/> is on.
+ /// </summary>
+ [XmlIgnore]
+ public bool Value
+ {
+ get { return _value; }
+ set { _value = value; RaisePropertyChangedAuto(); ValueChanged?.Invoke(this, value); }
+ }
+
+ private bool _effectiveValue;
+ /// <summary>
+ /// Gets or sets the effective value received from the embedded device.
+ /// </summary>
+ [XmlIgnore]
+ public bool EffectiveValue
+ {
+ get { return _effectiveValue; }
+ set
+ {
+ if (_effectiveValue != value)
+ {
+ _effectiveValue = value;
+ RaisePropertyChangedAuto();
+ _value = value;
+ RaisePropertyChanged(nameof(Value));
+ }
+ }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DigitalOutItem"/> class.
+ /// </summary>
+ public DigitalOutItem() : base()
+ {
+ Name = "Digital Out";
+ Description = "Digital Output Pin Controller";
+ Image = ResourceHelper.GetImageFromResources("Images/binary.png");
+ Color = Colors.White;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DigitalOutItem"/> class.
+ /// </summary>
+ /// <param name="techIo">The db tech item.</param>
+ public DigitalOutItem(TechIo techIo) : this()
+ {
+ TechIo = techIo;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ DigitalOutItem cloned = base.Clone() as DigitalOutItem;
+ cloned.TechIo = TechIo;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DispenserItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DispenserItem.cs
new file mode 100644
index 000000000..e2ab9931d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/DispenserItem.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Core.Commands;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a dispenser controller item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(8)]
+ public class DispenserItem : TechItem
+ {
+ /// <summary>
+ /// Occurs when the user has pressed one of the action controllers.
+ /// </summary>
+ public event EventHandler<MotorActionType> ActionExecuted;
+
+ /// <summary>
+ /// Occurs when dispenser homing has completed.
+ /// </summary>
+ public event EventHandler HomingCompleted;
+
+ private TechDispenser _techDispenser;
+ /// <summary>
+ /// Gets or sets the db tech dispenser.
+ /// </summary>
+ [XmlIgnore]
+ public TechDispenser TechDispenser
+ {
+ get { return _techDispenser; }
+ set { _techDispenser = value; RaisePropertyChangedAuto(); TechName = _techDispenser != null ? _techDispenser.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private bool _isHoming;
+ /// <summary>
+ /// Gets or sets a value indicating whether the dispenser is currently homing.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHoming
+ {
+ get { return _isHoming; }
+ set
+ {
+ _isHoming = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private bool _isHomingCompleted;
+ /// <summary>
+ /// Gets or sets a value indicating whether the dispenser homing has completed.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHomingCompleted
+ {
+ get { return _isHomingCompleted; }
+ set
+ {
+ _isHomingCompleted = value;
+ RaisePropertyChangedAuto();
+
+ if (value)
+ {
+ HomingCompleted?.Invoke(this, new EventArgs());
+ }
+ }
+ }
+
+ private double _homingProgress;
+ /// <summary>
+ /// Gets or sets the dispenser current homing progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingProgress
+ {
+ get { return _homingProgress; }
+ set
+ {
+ _homingProgress = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private double _homingMaximumProgress;
+ /// <summary>
+ /// Gets or sets the homing maximum progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingMaximumProgress
+ {
+ get { return _homingMaximumProgress; }
+ set { _homingMaximumProgress = value; RaisePropertyChangedAuto(); }
+ }
+
+ private double _speed;
+ /// <summary>
+ /// Gets or sets the dispenser motor speed.
+ /// </summary>
+ public double Speed
+ {
+ get { return _speed; }
+ set { _speed = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DispenserItem"/> class.
+ /// </summary>
+ public DispenserItem() : base()
+ {
+ Name = "Dispenser";
+ Description = "Dispenser Controller";
+ Image = ResourceHelper.GetImageFromResources("Images/dispenser-big.png");
+ Color = Colors.White;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DispenserItem"/> class.
+ /// </summary>
+ /// <param name="techDispenser">The tech dispenser.</param>
+ public DispenserItem(TechDispenser techDispenser) : this()
+ {
+ TechDispenser = techDispenser;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ DispenserItem cloned = base.Clone() as DispenserItem;
+ cloned.TechDispenser = TechDispenser;
+ return cloned;
+ }
+
+ /// <summary>
+ /// Raises the <see cref="ActionExecuted"/> event with the specified action.
+ /// </summary>
+ /// <param name="action">The action.</param>
+ public void RaiseAction(MotorActionType action)
+ {
+ ActionExecuted?.Invoke(this, action);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MeterItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MeterItem.cs
new file mode 100644
index 000000000..ce90859b2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MeterItem.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls.Primitives;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents an analog style VU meter item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(3)]
+ public class MeterItem : TechItem
+ {
+ private TechMonitor _techMonitor;
+ /// <summary>
+ /// Gets or sets the db tech monitor.
+ /// </summary>
+ [XmlIgnore]
+ public TechMonitor TechMonitor
+ {
+ get { return _techMonitor; }
+ set { _techMonitor = value; RaisePropertyChangedAuto(); TechName = _techMonitor != null ? _techMonitor.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private double _value;
+ /// <summary>
+ /// Gets or sets the current value.
+ /// </summary>
+ [XmlIgnore]
+ public double Value
+ {
+ get { return _value; }
+ set { _value = value; RaisePropertyChanged(nameof(Value)); LastUpdateTime = DateTime.Now; }
+ }
+
+ private int _updateInterval;
+ /// <summary>
+ /// Gets or sets the minimum update interval.
+ /// </summary>
+ public int UpdateInterval
+ {
+ get { return _updateInterval; }
+ set { _updateInterval = value; RaisePropertyChangedAuto(); }
+ }
+
+ private int _ledCount;
+ /// <summary>
+ /// Gets or sets the amount of LED's.
+ /// </summary>
+ public int LedCount
+ {
+ get { return _ledCount; }
+ set { _ledCount = value; RaisePropertyChangedAuto(); }
+ }
+
+ private int _ticksCount;
+ /// <summary>
+ /// Gets or sets the amount of meter ticks.
+ /// </summary>
+ public int TicksCount
+ {
+ get { return _ticksCount; }
+ set { _ticksCount = value; RaisePropertyChangedAuto(); }
+ }
+
+ private TickPlacement _tickPlacement;
+ /// <summary>
+ /// Gets or sets the ticks placement.
+ /// </summary>
+ public TickPlacement TickPlacement
+ {
+ get { return _tickPlacement; }
+ set { _tickPlacement = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the last update time.
+ /// </summary>
+ [XmlIgnore]
+ public DateTime LastUpdateTime { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MeterItem"/> class.
+ /// </summary>
+ public MeterItem() : base()
+ {
+ Name = "VU Monitor";
+ Description = "VU Meter monitor";
+ Image = ResourceHelper.GetImageFromResources("Images/volume.png");
+ LastUpdateTime = DateTime.Now;
+ UpdateInterval = 10;
+ LedCount = 14;
+ TicksCount = 14;
+ TickPlacement = TickPlacement.BottomRight;
+ Color = Colors.DimGray;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MeterItem"/> class.
+ /// </summary>
+ /// <param name="techMonitor">The db tech monitor.</param>
+ public MeterItem(TechMonitor techMonitor) : this()
+ {
+ TechMonitor = techMonitor;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ MeterItem cloned = base.Clone() as MeterItem;
+ cloned.TechMonitor = TechMonitor;
+ cloned.UpdateInterval = UpdateInterval;
+ cloned.LedCount = LedCount;
+ cloned.TicksCount = TicksCount;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MonitorItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MonitorItem.cs
new file mode 100644
index 000000000..984cd5f78
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MonitorItem.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents an analog style integer monitor item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(2)]
+ public class MonitorItem : TechItem
+ {
+ private TechMonitor _techMonitor;
+ /// <summary>
+ /// Gets or sets the db tech monitor.
+ /// </summary>
+ [XmlIgnore]
+ public TechMonitor TechMonitor
+ {
+ get { return _techMonitor; }
+ set { _techMonitor = value; RaisePropertyChangedAuto(); TechName = _techMonitor != null ? _techMonitor.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private double _value;
+ /// <summary>
+ /// Gets or sets the current value.
+ /// </summary>
+ [XmlIgnore]
+ public double Value
+ {
+ get { return _value; }
+ set { _value = value; RaisePropertyChanged(nameof(Value)); LastUpdateTime = DateTime.Now; }
+ }
+
+ private int _updateInterval;
+ /// <summary>
+ /// Gets or sets the update interval.
+ /// </summary>
+ public int UpdateInterval
+ {
+ get { return _updateInterval; }
+ set { _updateInterval = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the last update time.
+ /// </summary>
+ [XmlIgnore]
+ public DateTime LastUpdateTime { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorItem"/> class.
+ /// </summary>
+ public MonitorItem() : base()
+ {
+ Name = "Monitor";
+ Color = Colors.White;
+ Description = "Simple analogue monitor";
+ Image = ResourceHelper.GetImageFromResources("Images/analog.png");
+ LastUpdateTime = DateTime.Now;
+ UpdateInterval = 10;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MonitorItem"/> class.
+ /// </summary>
+ /// <param name="techMonitor">The db tech monitor.</param>
+ public MonitorItem(TechMonitor techMonitor) : this()
+ {
+ TechMonitor = techMonitor;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ MonitorItem cloned = base.Clone() as MonitorItem;
+ cloned.TechMonitor = TechMonitor;
+ cloned.UpdateInterval = UpdateInterval;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorActionType.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorActionType.cs
new file mode 100644
index 000000000..57dabbbb2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorActionType.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents motor action types.
+ /// </summary>
+ public enum MotorActionType
+ {
+ ForwardPressed,
+ ForwardReleased,
+ BackwardPressed,
+ BackwardReleased,
+ HomingStarted,
+ HomingStopped,
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorGroupItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorGroupItem.cs
new file mode 100644
index 000000000..143ce9c66
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorGroupItem.cs
@@ -0,0 +1,197 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Components;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a motors group item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(7)]
+ public class MotorGroupItem : TechItem
+ {
+ /// <summary>
+ /// Occurs when the user has pressed/released on of the item actions.
+ /// </summary>
+ public event EventHandler<MotorActionType> ActionExecuted;
+
+ /// <summary>
+ /// Occurs when motor homing has completed.
+ /// </summary>
+ public event EventHandler HomingCompleted;
+
+ private SelectedObjectCollection<TechMotor> _selectedMotors;
+ /// <summary>
+ /// Gets or sets the selected db tech motors.
+ /// </summary>
+ [XmlIgnore]
+ public SelectedObjectCollection<TechMotor> SelectedMotors
+ {
+ get { return _selectedMotors; }
+ set { _selectedMotors = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<TechMotor> _techMotors;
+ /// <summary>
+ /// Gets or sets the available db tech motors.
+ /// </summary>
+ [XmlIgnore]
+ public ObservableCollection<TechMotor> TechMotors
+ {
+ get { return _techMotors; }
+ set { _techMotors = value; RaisePropertyChangedAuto(); SetSelectedMotors(); }
+ }
+
+ /// <summary>
+ /// Sets the selected motors.
+ /// </summary>
+ private void SetSelectedMotors()
+ {
+ if (TechMotors != null)
+ {
+ SelectedMotors = new SelectedObjectCollection<TechMotor>(ObservablesEntitiesAdapter.Instance.TechMotors.ToObservableCollection(), TechMotors);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the selected tech items motors guids.
+ /// </summary>
+ public List<String> ItemsGuids { get; set; }
+
+ private String _groupName;
+ /// <summary>
+ /// Gets or sets the name of the group.
+ /// </summary>
+ public String GroupName
+ {
+ get { return _groupName; }
+ set { _groupName = value; RaisePropertyChangedAuto(); TechName = value; }
+ }
+
+ private bool _isHoming;
+ /// <summary>
+ /// Gets or sets a value indicating whether this motor group is currently homing.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHoming
+ {
+ get { return _isHoming; }
+ set
+ {
+ _isHoming = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private bool _isHomingCompleted;
+ /// <summary>
+ /// Gets or sets a value indicating whether this group homing has completed.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHomingCompleted
+ {
+ get { return _isHomingCompleted; }
+ set
+ {
+ _isHomingCompleted = value;
+ RaisePropertyChangedAuto();
+
+ if (value)
+ {
+ HomingCompleted?.Invoke(this, new EventArgs());
+ }
+ }
+ }
+
+ private double _homingProgress;
+ /// <summary>
+ /// Gets or sets the current homing progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingProgress
+ {
+ get { return _homingProgress; }
+ set
+ {
+ _homingProgress = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private double _homingMaximumProgress;
+ /// <summary>
+ /// Gets or sets the homing maximum progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingMaximumProgress
+ {
+ get { return _homingMaximumProgress; }
+ set { _homingMaximumProgress = value; RaisePropertyChangedAuto(); }
+ }
+
+ private double _speed;
+ /// <summary>
+ /// Gets or sets the motors speed.
+ /// </summary>
+ public double Speed
+ {
+ get { return _speed; }
+ set { _speed = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MotorGroupItem"/> class.
+ /// </summary>
+ public MotorGroupItem() : base()
+ {
+ ItemsGuids = new List<string>();
+ TechMotors = new ObservableCollection<TechMotor>();
+ Name = "Motor Group";
+ Description = "Motor Group Controller";
+ Image = ResourceHelper.GetImageFromResources("Images/motor-group.png");
+ Color = Colors.White;
+ GroupName = "Motor Group";
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MotorGroupItem"/> class.
+ /// </summary>
+ /// <param name="dummyConstructor">does not matter.</param>
+ public MotorGroupItem(object dummyConstructor) : this()
+ {
+
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ MotorGroupItem cloned = base.Clone() as MotorGroupItem;
+ cloned.TechMotors = new ObservableCollection<TechMotor>(TechMotors);
+ cloned.Speed = Speed;
+ cloned.ItemsGuids = ItemsGuids;
+ cloned.TechMotors = cloned.TechMotors.ToObservableCollection();
+ return cloned;
+ }
+
+ /// <summary>
+ /// Raises the <see cref="ActionExecuted"/> event with the specified action.
+ /// </summary>
+ /// <param name="action">The action.</param>
+ public void RaiseAction(MotorActionType action)
+ {
+ ActionExecuted?.Invoke(this, action);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorItem.cs
new file mode 100644
index 000000000..2af7e6490
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MotorItem.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.Core.Commands;
+using Tango.Integration.Observables;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a motor controller item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(6)]
+ public class MotorItem : TechItem
+ {
+ /// <summary>
+ /// Occurs when the user has pressed/released on of the item actions.
+ /// </summary>
+ public event EventHandler<MotorActionType> ActionExecuted;
+
+ /// <summary>
+ /// Occurs when motor homing has completed.
+ /// </summary>
+ public event EventHandler HomingCompleted;
+
+ private TechMotor _techMotor;
+ /// <summary>
+ /// Gets or sets the db tech motor.
+ /// </summary>
+ [XmlIgnore]
+ public TechMotor TechMotor
+ {
+ get { return _techMotor; }
+ set { _techMotor = value; RaisePropertyChangedAuto(); TechName = _techMotor != null ? _techMotor.Description : null; ItemGuid = value != null ? value.Guid : null; }
+ }
+
+ private bool _isHoming;
+ /// <summary>
+ /// Gets or sets a value indicating whether the motor is currently homing.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHoming
+ {
+ get { return _isHoming; }
+ set
+ {
+ _isHoming = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private bool _isHomingCompleted;
+ /// <summary>
+ /// Gets or sets a value indicating whether the motor homing has completed.
+ /// </summary>
+ [XmlIgnore]
+ public bool IsHomingCompleted
+ {
+ get { return _isHomingCompleted; }
+ set
+ {
+ _isHomingCompleted = value;
+ RaisePropertyChangedAuto();
+
+ if (value)
+ {
+ HomingCompleted?.Invoke(this, new EventArgs());
+ }
+ }
+ }
+
+ private double _homingProgress;
+ /// <summary>
+ /// Gets or sets the current homing progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingProgress
+ {
+ get { return _homingProgress; }
+ set
+ {
+ _homingProgress = value;
+ RaisePropertyChangedAuto();
+ }
+ }
+
+ private double _homingMaximumProgress;
+ /// <summary>
+ /// Gets or sets the homing maximum progress.
+ /// </summary>
+ [XmlIgnore]
+ public double HomingMaximumProgress
+ {
+ get { return _homingMaximumProgress; }
+ set { _homingMaximumProgress = value; RaisePropertyChangedAuto(); }
+ }
+
+ private double _speed;
+ /// <summary>
+ /// Gets or sets the motor speed.
+ /// </summary>
+ public double Speed
+ {
+ get { return _speed; }
+ set { _speed = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MotorItem"/> class.
+ /// </summary>
+ public MotorItem() : base()
+ {
+ Name = "Motor";
+ Description = "Motor Controller";
+ Image = ResourceHelper.GetImageFromResources("Images/engine.png");
+ Color = Colors.White;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MotorItem"/> class.
+ /// </summary>
+ /// <param name="techMotor">The tech motor.</param>
+ public MotorItem(TechMotor techMotor) : this()
+ {
+ TechMotor = techMotor;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ MotorItem cloned = base.Clone() as MotorItem;
+ cloned.TechMotor = TechMotor;
+ cloned.Speed = Speed;
+ return cloned;
+ }
+
+ /// <summary>
+ /// Raises the <see cref="ActionExecuted"/> event with the specified action.
+ /// </summary>
+ /// <param name="action">The action.</param>
+ public void RaiseAction(MotorActionType action)
+ {
+ ActionExecuted?.Invoke(this, action);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MultiGraphItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MultiGraphItem.cs
new file mode 100644
index 000000000..f74a4b02c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/MultiGraphItem.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.Editors;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a multi channel real-time graph item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(5)]
+ public class MultiGraphItem : TechItem
+ {
+ private TechMonitor _techMonitor;
+ /// <summary>
+ /// Gets or sets the db tech monitor.
+ /// </summary>
+ [XmlIgnore]
+ public TechMonitor TechMonitor
+ {
+ get { return _techMonitor; }
+ set
+ {
+ TechMonitor old = _techMonitor;
+
+ _techMonitor = value;
+ RaisePropertyChangedAuto();
+
+ if (_techMonitor != old && Editor != null)
+ {
+ Editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(TechMonitor.PointsPerFrame);
+ Editor.InnerGraph.InvalidateGraph();
+ }
+
+ ItemGuid = value != null ? value.Guid : null;
+
+ TechName = _techMonitor != null ? _techMonitor.Description : null;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the item editor.
+ /// </summary>
+ [XmlIgnore]
+ public MultiGraphElementEditor Editor { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MultiGraphItem"/> class.
+ /// </summary>
+ public MultiGraphItem() : base()
+ {
+ Name = "Multi Channel Graph";
+ Description = "Multi channel real-time graph";
+ Image = ResourceHelper.GetImageFromResources("Images/multi-graph.png");
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MultiGraphItem"/> class.
+ /// </summary>
+ /// <param name="techMonitor">The db tech monitor.</param>
+ public MultiGraphItem(TechMonitor techMonitor) : this()
+ {
+ TechMonitor = techMonitor;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ MultiGraphItem cloned = base.Clone() as MultiGraphItem;
+ cloned.TechMonitor = TechMonitor;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/SingleGraphItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/SingleGraphItem.cs
new file mode 100644
index 000000000..9b19f0861
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/SingleGraphItem.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Technician.Editors;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a single channel real-time graph item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(4)]
+ public class SingleGraphItem : TechItem
+ {
+ private TechMonitor _techMonitor;
+ /// <summary>
+ /// Gets or sets the db tech monitor.
+ /// </summary>
+ [XmlIgnore]
+ public TechMonitor TechMonitor
+ {
+ get { return _techMonitor; }
+ set
+ {
+ TechMonitor old = _techMonitor;
+
+ _techMonitor = value;
+ RaisePropertyChangedAuto();
+
+ if (_techMonitor != old && Editor != null)
+ {
+ Editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(TechMonitor.PointsPerFrame);
+ Editor.InnerGraph.InvalidateGraph();
+ }
+
+ ItemGuid = value != null ? value.Guid : null;
+ TechName = _techMonitor != null ? _techMonitor.Description : null;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the item editor.
+ /// </summary>
+ [XmlIgnore]
+ public SingleGraphElementEditor Editor { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SingleGraphItem"/> class.
+ /// </summary>
+ public SingleGraphItem() : base()
+ {
+ Name = "Single Channel Graph";
+ Description = "Single channel real-time graph";
+ Image = ResourceHelper.GetImageFromResources("Images/single-graph.png");
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SingleGraphItem"/> class.
+ /// </summary>
+ /// <param name="techMonitor">The db tech monitor.</param>
+ public SingleGraphItem(TechMonitor techMonitor) : this()
+ {
+ TechMonitor = techMonitor;
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ SingleGraphItem cloned = base.Clone() as SingleGraphItem;
+ cloned.TechMonitor = TechMonitor;
+ return cloned;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItem.cs
new file mode 100644
index 000000000..254c141b6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItem.cs
@@ -0,0 +1,244 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Xml.Serialization;
+using Tango.Core;
+using Tango.Core.Helpers;
+using Tango.Integration.Observables;
+using System.Reflection;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a tech item base class.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ [XmlInclude(typeof(DispenserItem))]
+ [XmlInclude(typeof(DigitalOutItem))]
+ [XmlInclude(typeof(MeterItem))]
+ [XmlInclude(typeof(MonitorItem))]
+ [XmlInclude(typeof(MotorItem))]
+ [XmlInclude(typeof(MultiGraphItem))]
+ [XmlInclude(typeof(SingleGraphItem))]
+ [XmlInclude(typeof(ThreadMotionItem))]
+ [XmlInclude(typeof(MotorGroupItem))]
+ [XmlInclude(typeof(DigitalInItem))]
+ public abstract class TechItem : ExtendedObject
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="TechItem"/> class.
+ /// </summary>
+ public TechItem()
+ {
+ ID = Guid.NewGuid().ToString();
+ Name = "Untitled";
+ Adapter = ObservablesEntitiesAdapter.Instance;
+ _color = Colors.DodgerBlue;
+ }
+
+ private String _description;
+ /// <summary>
+ /// Gets or sets the description.
+ /// </summary>
+ [XmlIgnore]
+ public String Description
+ {
+ get { return _description; }
+ set { _description = value; RaisePropertyChangedAuto(); }
+ }
+
+ private BitmapSource _image;
+ /// <summary>
+ /// Gets or sets the image.
+ /// </summary>
+ [XmlIgnore]
+ public BitmapSource Image
+ {
+ get { return _image; }
+ set { _image = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the db adapter.
+ /// </summary>
+ [XmlIgnore]
+ public ObservablesEntitiesAdapter Adapter { get; set; }
+
+ private String _id;
+ /// <summary>
+ /// Unique Item ID.
+ /// </summary>
+ public String ID
+ {
+ get { return _id; }
+ set { _id = value; RaisePropertyChanged(nameof(ID)); }
+ }
+
+ private String _name;
+ /// <summary>
+ /// item Name.
+ /// </summary>
+ [XmlIgnore]
+ public String Name
+ {
+ get { return _name; }
+ set { _name = value; RaisePropertyChanged(nameof(Name)); }
+ }
+
+ private double _left;
+ /// <summary>
+ /// Item Left.
+ /// </summary>
+ public double Left
+ {
+ get { return _left; }
+ set { _left = value; RaisePropertyChanged(nameof(Left)); }
+ }
+
+ private double _top;
+ /// <summary>
+ /// Item Top.
+ /// </summary>
+ public double Top
+ {
+ get { return _top; }
+ set { _top = value; RaisePropertyChanged(nameof(Top)); }
+ }
+
+ private double _width;
+ /// <summary>
+ /// Item Width.
+ /// </summary>
+ public double Width
+ {
+ get { return _width; }
+ set { _width = value; RaisePropertyChanged(nameof(Width)); }
+ }
+
+ private double _height;
+ /// <summary>
+ /// Item Height.
+ /// </summary>
+ public double Height
+ {
+ get { return _height; }
+ set { _height = value; RaisePropertyChanged(nameof(Height)); }
+ }
+
+ private double _angle;
+ /// <summary>
+ /// Item Angle.
+ /// </summary>
+ public double Angle
+ {
+ get { return _angle; }
+ set { _angle = value; RaisePropertyChanged(nameof(Angle)); }
+ }
+
+
+ private String _techName;
+ /// <summary>
+ /// Gets or sets the tech item name.
+ /// </summary>
+ [XmlIgnore]
+ public String TechName
+ {
+ get { return _techName; }
+ set { _techName = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the db tech item guid.
+ /// </summary>
+ public String ItemGuid { get; set; }
+
+ private Color _color;
+ /// <summary>
+ /// Gets or sets the item color.
+ /// </summary>
+ [XmlIgnore]
+ public Color Color
+ {
+ get { return _color; }
+ set
+ {
+ _color = value;
+ RaisePropertyChangedAuto();
+ _colorNumber = ColorHelper.ColorToInteger(value);
+ }
+ }
+
+ private int _colorNumber;
+ /// <summary>
+ /// Gets or sets the color number (for XML serialization).
+ /// </summary>
+ public int ColorNumber
+ {
+ get { return _colorNumber; }
+ set
+ {
+ _colorNumber = value;
+ _color = ColorHelper.IntegerToColor(value);
+ RaisePropertyChanged(nameof(Color));
+ }
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public virtual TechItem Clone()
+ {
+ TechItem cloned = Activator.CreateInstance(this.GetType()) as TechItem;
+ cloned.Left = Left;
+ cloned.Top = Top;
+ cloned.Width = Width;
+ cloned.Height = Height;
+ cloned.Angle = Angle;
+ cloned.Color = Color;
+ return cloned;
+ }
+
+ /// <summary>
+ /// Gets the available tech items.
+ /// </summary>
+ /// <returns></returns>
+ public static List<TechItem> GetAvailableTechItems()
+ {
+ List<TechItem> items = new List<TechItem>();
+
+ foreach (var type in typeof(TechItem).Assembly.GetTypes().Where(x => typeof(TechItem).IsAssignableFrom(x) && !x.IsAbstract).OrderBy(x => x.GetCustomAttribute<TechItemAttribute>().Index))
+ {
+ items.Add(Activator.CreateInstance(type) as TechItem);
+ }
+
+ return items;
+ }
+
+ /// <summary>
+ /// Sets the bounds.
+ /// </summary>
+ /// <param name="bounds">The bounds.</param>
+ public void SetBounds(Rect bounds)
+ {
+ Left = bounds.Left;
+ Top = bounds.Top;
+ Width = bounds.Width;
+ Height = bounds.Height;
+ }
+
+ /// <summary>
+ /// Gets the bounds.
+ /// </summary>
+ /// <returns></returns>
+ public Rect GetBounds()
+ {
+ return new Rect(Left, Top, Width, Height);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItemAttribute.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItemAttribute.cs
new file mode 100644
index 000000000..fafd00954
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/TechItemAttribute.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a tech item attribute
+ /// </summary>
+ /// <seealso cref="System.Attribute" />
+ public class TechItemAttribute : Attribute
+ {
+ /// <summary>
+ /// Gets or sets the item index.
+ /// </summary>
+ public int Index { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="TechItemAttribute"/> class.
+ /// </summary>
+ /// <param name="index">The index.</param>
+ public TechItemAttribute(int index)
+ {
+ Index = index;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/ThreadMotionItem.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/ThreadMotionItem.cs
new file mode 100644
index 000000000..a5789377f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechItems/ThreadMotionItem.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using System.Xml.Serialization;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician.TechItems
+{
+ /// <summary>
+ /// Represents a thread motion controller item.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Technician.TechItems.TechItem" />
+ [TechItem(9)]
+ public class ThreadMotionItem : TechItem
+ {
+ /// <summary>
+ /// Occurs when the user has pressed/released on of the item actions.
+ /// </summary>
+ public event EventHandler<MotorActionType> ActionExecuted;
+
+ private double _speed;
+ /// <summary>
+ /// Gets or sets the motor speed.
+ /// </summary>
+ public double Speed
+ {
+ get { return _speed; }
+ set { _speed = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ThreadMotionItem"/> class.
+ /// </summary>
+ public ThreadMotionItem() : base()
+ {
+ Name = "Thread Motion";
+ Description = "Thread Motion Controller";
+ Image = ResourceHelper.GetImageFromResources("Images/thread.png");
+ TechName = Name;
+ Color = Colors.White;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ThreadMotionItem"/> class.
+ /// </summary>
+ /// <param name="dummyConstructor">Does not matter.</param>
+ public ThreadMotionItem(object dummyConstructor) : this()
+ {
+
+ }
+
+ /// <summary>
+ /// Clones this instance.
+ /// </summary>
+ /// <returns></returns>
+ public override TechItem Clone()
+ {
+ ThreadMotionItem cloned = base.Clone() as ThreadMotionItem;
+ cloned.Speed = Speed;
+ return cloned;
+ }
+
+ /// <summary>
+ /// Raises the <see cref="ActionExecuted"/> event with the specified action.
+ /// </summary>
+ /// <param name="action">The action.</param>
+ public void RaiseAction(MotorActionType action)
+ {
+ ActionExecuted?.Invoke(this, action);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianDbContext.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianDbContext.cs
new file mode 100644
index 000000000..a0314ab6b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianDbContext.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Technician
+{
+ public class TechnicianDbContext
+ {
+ private static ObservablesContext _context;
+
+ public static ObservablesContext Context
+ {
+ get
+ {
+ if (_context == null)
+ {
+ _context = ObservablesContext.CreateDefault();
+ }
+
+ return _context;
+ }
+ private set { _context = value; }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianModule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianModule.cs
new file mode 100644
index 000000000..e55fde0e5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/TechnicianModule.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using Tango.Integration.Observables;
+using Tango.MachineStudio.Common;
+using Tango.MachineStudio.Technician.Views;
+using Tango.SharedUI.Helpers;
+
+namespace Tango.MachineStudio.Technician
+{
+ /// <summary>
+ /// Represents a machine studio technician module.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public class TechnicianModule : StudioModuleBase
+ {
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public override string Name => "Technician";
+
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public override string Description => "Provides access to low level machine components by exposing diagnostics and profiling tools.";
+
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/technician.jpg");
+
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public override FrameworkElement MainView => new MachineTechView();
+
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public override Permissions Permission => Permissions.RunTechnicianModule;
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public override void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModelLocator.cs
new file mode 100644
index 000000000..077b30663
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModelLocator.cs
@@ -0,0 +1,55 @@
+using GalaSoft.MvvmLight;
+using GalaSoft.MvvmLight.Ioc;
+using Microsoft.Practices.ServiceLocation;
+using Tango.MachineStudio.Technician.Navigation;
+using Tango.MachineStudio.Technician.ViewModels;
+
+namespace Tango.MachineStudio.Technician
+{
+ /// <summary>
+ /// This class contains static references to all the view models in the
+ /// application and provides an entry point for the bindings.
+ /// </summary>
+ public static class ViewModelLocator
+ {
+ /// <summary>
+ /// Initializes a new instance of the ViewModelLocator class.
+ /// </summary>
+ static ViewModelLocator()
+ {
+ ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
+
+ SimpleIoc.Default.Register<MainViewVM>();
+ SimpleIoc.Default.Register<SensorsViewVM>();
+ SimpleIoc.Default.Register<MachineTechViewVM>();
+
+ SimpleIoc.Default.Unregister<TechNavigationManager>();
+
+ SimpleIoc.Default.Register<TechNavigationManager, TechNavigationManager>();
+ }
+
+ public static MainViewVM MainViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<MainViewVM>();
+ }
+ }
+
+ public static SensorsViewVM SensorsViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<SensorsViewVM>();
+ }
+ }
+
+ public static MachineTechViewVM MachineTechViewVM
+ {
+ get
+ {
+ return ServiceLocator.Current.GetInstance<MachineTechViewVM>();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
new file mode 100644
index 000000000..6ccc1caa0
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
@@ -0,0 +1,1124 @@
+using GalaSoft.MvvmLight.Ioc;
+using Google.Protobuf.Collections;
+using Microsoft.Win32;
+using RealTimeGraphEx.Controllers;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media;
+using Tango.Core.Helpers;
+using Tango.Editors;
+using Tango.Integration.Observables;
+using Tango.Integration.Observables.Enumerations;
+using Tango.Integration.Operators;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.MachineStudio.Technician.Editors;
+using Tango.MachineStudio.Technician.Project;
+using Tango.MachineStudio.Technician.TechItems;
+using Tango.PMR.Diagnostics;
+using Tango.Settings;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.Technician.ViewModels
+{
+ /// <summary>
+ /// Represents the MachineTechView View Model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ /// <seealso cref="Tango.MachineStudio.Common.StudioApplication.IShutdownListener" />
+ public class MachineTechViewVM : ViewModel, IShutdownListener
+ {
+ private List<PropertyInfo> _diagnoticsDataProperties;
+ private Dictionary<SingleGraphItem, GraphController> _singleControllers;
+ private Dictionary<MultiGraphItem, GraphMultiController> _multiControllers;
+ private static object _elementsLock = new object();
+ private String _lastTechProjectFile;
+ private INotificationProvider _notification;
+ private DateTime _lastDiagnosticsResponseUpdate;
+ private const int MIN_DIAGNOSTICS_UPDATE_MILI = 500;
+
+ #region Properties
+
+ private ObservableCollection<IElementEditor> _elements;
+ /// <summary>
+ /// Gets or sets the visual elements.
+ /// </summary>
+ public ObservableCollection<IElementEditor> Elements
+ {
+ get { return _elements; }
+ set { _elements = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservableCollection<TechItem> _availableTechItems;
+ /// <summary>
+ /// Gets or sets the available tech items.
+ /// </summary>
+ public ObservableCollection<TechItem> AvailableTechItems
+ {
+ get { return _availableTechItems; }
+ set { _availableTechItems = value; RaisePropertyChangedAuto(); }
+ }
+
+ private TechItem _selectedTechItem;
+ /// <summary>
+ /// Gets or sets the selected available tech item.
+ /// </summary>
+ public TechItem SelectedTechItem
+ {
+ get { return _selectedTechItem; }
+ set { _selectedTechItem = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the db adapter.
+ /// </summary>
+ public ObservablesEntitiesAdapter Adapter { get; set; }
+
+ /// <summary>
+ /// Gets or sets the application manager.
+ /// </summary>
+ public IStudioApplicationManager ApplicationManager { get; set; }
+
+ private IMachineOperator _machineOperator;
+ /// <summary>
+ /// Gets or sets the machine operator.
+ /// </summary>
+ public IMachineOperator MachineOperator
+ {
+ get { return _machineOperator; }
+ set { _machineOperator = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _disableRendering;
+ /// <summary>
+ /// Gets or sets a value indicating whether [disable rendering].
+ /// </summary>
+ public bool DisableRendering
+ {
+ get { return _disableRendering; }
+ set { _disableRendering = value; RaisePropertyChangedAuto(); OnDisableRenderingChanged(); }
+ }
+
+ private bool _hideMenu;
+ /// <summary>
+ /// Gets or sets a value indicating whether [hide menu].
+ /// </summary>
+ public bool HideMenu
+ {
+ get { return _hideMenu; }
+ set { _hideMenu = value; RaisePropertyChangedAuto(); }
+ }
+
+ private PushDiagnosticsResponse _currentDiagnosticsResponse;
+ /// <summary>
+ /// Gets or sets the current diagnostics response.
+ /// </summary>
+ public PushDiagnosticsResponse CurrentDiagnosticsResponse
+ {
+ get { return _currentDiagnosticsResponse; }
+ set { _currentDiagnosticsResponse = value; RaisePropertyChanged(nameof(CurrentDiagnosticsResponse)); }
+ }
+
+ private int _currentDiagnosticsResponseSize;
+ /// <summary>
+ /// Gets or sets the size of the current diagnostics response.
+ /// </summary>
+ /// <value>
+ /// The size of the current diagnostics response.
+ /// </value>
+ public int CurrentDiagnosticsResponseSize
+ {
+ get { return _currentDiagnosticsResponseSize; }
+ set { _currentDiagnosticsResponseSize = value; RaisePropertyChanged(nameof(CurrentDiagnosticsResponseSize)); }
+ }
+
+ #endregion
+
+ #region Commands
+
+ /// <summary>
+ /// Gets or sets the save as project command.
+ /// </summary>
+ public RelayCommand SaveAsProjectCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the save project command.
+ /// </summary>
+ public RelayCommand SaveProjectCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the open project command.
+ /// </summary>
+ public RelayCommand OpenProjectCommand { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineTechViewVM"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
+ [PreferredConstructor]
+ public MachineTechViewVM(IStudioApplicationManager applicationManager, INotificationProvider notificationProvider) : this(applicationManager, notificationProvider, true)
+ {
+
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineTechViewVM"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
+ /// <param name="loadLastProject">if set to <c>true</c> [load last project].</param>
+ public MachineTechViewVM(IStudioApplicationManager applicationManager, INotificationProvider notificationProvider, bool loadLastProject)
+ {
+ _notification = notificationProvider;
+ _singleControllers = new Dictionary<SingleGraphItem, GraphController>();
+ _multiControllers = new Dictionary<MultiGraphItem, GraphMultiController>();
+ AvailableTechItems = TechItem.GetAvailableTechItems().ToObservableCollection();
+ SelectedTechItem = AvailableTechItems.FirstOrDefault();
+ _diagnoticsDataProperties = typeof(PushDiagnosticsResponse).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
+ ApplicationManager = applicationManager;
+ ApplicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
+
+ Adapter = ObservablesEntitiesAdapter.Instance;
+ Elements = new ObservableCollection<IElementEditor>();
+
+ OpenProjectCommand = new RelayCommand(OpenProject);
+ SaveAsProjectCommand = new RelayCommand(SaveAsProject);
+ SaveProjectCommand = new RelayCommand(SaveProject);
+
+ _lastTechProjectFile = SettingsManager.Default.MachineStudio.TechnicianModule.LasTechProjectFile;
+
+ if (File.Exists(_lastTechProjectFile) && loadLastProject)
+ {
+ OpenProjectFile(_lastTechProjectFile);
+ }
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ /// <summary>
+ /// Applications the manager connected machine changed.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="machine">The machine.</param>
+ private void ApplicationManager_ConnectedMachineChanged(object sender, Integration.Services.IExternalBridgeClient machine)
+ {
+ MachineOperator = machine;
+
+ if (MachineOperator != null)
+ {
+ MachineOperator.DiagnosticsDataAvailable -= MachineOperator_DiagnosticsDataAvailable;
+ MachineOperator.DiagnosticsDataAvailable += MachineOperator_DiagnosticsDataAvailable;
+ }
+ }
+
+ /// <summary>
+ /// Machines the operator diagnostics data available.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="response">The response.</param>
+ private void MachineOperator_DiagnosticsDataAvailable(object sender, PushDiagnosticsResponse response)
+ {
+ PopulateDiagnosticsData(response);
+ }
+
+ #endregion
+
+ #region Populate Diagnostics Data
+
+ /// <summary>
+ /// Populates the diagnostics data to the proper elements.
+ /// </summary>
+ /// <param name="data">The data.</param>
+ private void PopulateDiagnosticsData(PushDiagnosticsResponse data)
+ {
+ if (DateTime.Now > _lastDiagnosticsResponseUpdate.AddMilliseconds(MIN_DIAGNOSTICS_UPDATE_MILI))
+ {
+ CurrentDiagnosticsResponse = data;
+ _lastDiagnosticsResponseUpdate = DateTime.Now;
+ CurrentDiagnosticsResponseSize = data.CalculateSize();
+ }
+
+ lock (_elementsLock)
+ {
+ var elements = Elements.ToList();
+
+ foreach (var item in elements.Select(x => x.HostedElement as TechItem))
+ {
+ if (item.GetType() == typeof(MonitorItem))
+ {
+ MonitorItem monitorItem = item as MonitorItem;
+
+ if (DateTime.Now > monitorItem.LastUpdateTime.AddMilliseconds(monitorItem.UpdateInterval))
+ {
+ var prop = _diagnoticsDataProperties.SingleOrDefault(x => x.Name == monitorItem.TechMonitor.Name);
+
+ if (prop != null)
+ {
+ monitorItem.Value = GetDataLastValue(monitorItem.TechMonitor, prop.GetValue(data));
+ }
+ }
+ }
+ else if (item.GetType() == typeof(MeterItem))
+ {
+ MeterItem meterItem = item as MeterItem;
+
+ if (DateTime.Now > meterItem.LastUpdateTime.AddMilliseconds(meterItem.UpdateInterval))
+ {
+ var prop = _diagnoticsDataProperties.SingleOrDefault(x => x.Name == meterItem.TechMonitor.Name);
+
+ if (prop != null)
+ {
+ meterItem.Value = GetDataLastValue(meterItem.TechMonitor, prop.GetValue(data));
+ }
+ }
+ }
+ else if (item.GetType() == typeof(SingleGraphItem))
+ {
+ SingleGraphItem graphItem = item as SingleGraphItem;
+
+ var prop = _diagnoticsDataProperties.SingleOrDefault(x => x.Name == graphItem.TechMonitor.Name);
+
+ if (prop != null)
+ {
+ GraphController controller = null;
+
+ if (_singleControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.PushData(GetDataArray(graphItem.TechMonitor, prop.GetValue(data)));
+ }
+ }
+ }
+ else if (item.GetType() == typeof(MultiGraphItem))
+ {
+ MultiGraphItem graphItem = item as MultiGraphItem;
+
+ var prop = _diagnoticsDataProperties.SingleOrDefault(x => x.Name == graphItem.TechMonitor.Name);
+
+ if (prop != null)
+ {
+ GraphMultiController controller = null;
+
+ if (_multiControllers.TryGetValue(graphItem, out controller))
+ {
+ controller.PushData(GetDataMatrix(graphItem.TechMonitor, prop.GetValue(data)));
+ }
+ }
+ }
+ else if (item.GetType() == typeof(DigitalOutItem))
+ {
+ DigitalOutItem digitalOutItem = item as DigitalOutItem;
+
+ var digitalPin = data.DigitalPins.SingleOrDefault(x => x.Port == digitalOutItem.TechIo.Port);
+
+ if (digitalPin != null)
+ {
+ digitalOutItem.EffectiveValue = digitalPin.Value;
+ }
+ }
+ else if (item.GetType() == typeof(DigitalInItem))
+ {
+ DigitalInItem digitalInItem = item as DigitalInItem;
+
+ var digitalPin = data.DigitalPins.SingleOrDefault(x => x.Port == digitalInItem.TechIo.Port);
+
+ if (digitalPin != null)
+ {
+ digitalInItem.Value = digitalPin.Value;
+ }
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Gets the last data point from a protobuf repeated field.
+ /// </summary>
+ /// <param name="monitor">The monitor.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ private double GetDataLastValue(TechMonitor monitor, object value)
+ {
+ if (!monitor.MultiChannel)
+ {
+ RepeatedField<double> arr = value as RepeatedField<double>;
+ return arr.LastOrDefault();
+ }
+ else
+ {
+ RepeatedField<DoubleArray> arr = value as RepeatedField<DoubleArray>;
+ return arr.Last().Data.Last();
+ }
+ }
+
+ /// <summary>
+ /// Gets the data array from a protobuf repeated field.
+ /// </summary>
+ /// <param name="monitor">The monitor.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ private List<double> GetDataArray(TechMonitor monitor, object value)
+ {
+ return (value as RepeatedField<double>).ToList();
+ }
+
+ /// <summary>
+ /// Gets the data matrix from a protobuf repeated field of <see cref="DoubleArray"/>.
+ /// </summary>
+ /// <param name="monitor">The monitor.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ private List<List<double>> GetDataMatrix(TechMonitor monitor, object value)
+ {
+ DoubleArray[] arrayOfDoubles = Enumerable.ToArray(value as IEnumerable<DoubleArray>);
+ return arrayOfDoubles.Select(x => x.Data.ToList()).ToList();
+ }
+
+ #endregion
+
+ #region Virtual Methods
+
+ /// <summary>
+ /// Called when the disable rendering has been changed
+ /// </summary>
+ protected virtual void OnDisableRenderingChanged()
+ {
+ foreach (var controller in _singleControllers)
+ {
+ controller.Value.ChangeRenderMode(!DisableRendering);
+ }
+
+ foreach (var controller in _multiControllers)
+ {
+ controller.Value.ChangeRenderMode(!DisableRendering);
+ }
+ }
+
+ #endregion
+
+ #region Add/Remove Element
+
+ /// <summary>
+ /// Creates a new tech element by the specified bounds and the current selected element.
+ /// </summary>
+ /// <param name="bounds">The bounds.</param>
+ public void CreateElement(Rect bounds)
+ {
+ CreateElement(SelectedTechItem, bounds);
+ }
+
+ /// <summary>
+ /// Creates a new tech element by the specified tech item instance and bounds.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="bounds">The bounds.</param>
+ private void CreateElement(TechItem item, Rect bounds)
+ {
+ if (item is MonitorItem)
+ {
+ CreateElement<MonitorElementEditor, MonitorItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault());
+ }
+ else if (item is MeterItem)
+ {
+ CreateElement<MeterElementEditor, MeterItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault());
+ }
+ else if (item is SingleGraphItem)
+ {
+ var editor = CreateElement<SingleGraphElementEditor, SingleGraphItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault());
+ InitSingleGraphitem(editor.GraphItem, editor);
+ }
+ else if (item is MultiGraphItem)
+ {
+ var editor = CreateElement<MultiGraphElementEditor, MultiGraphItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => x.MultiChannel).FirstOrDefault());
+ InitMultiGraphItem(editor.GraphItem, editor);
+ }
+ else if (item is MotorItem)
+ {
+ var editor = CreateElement<MotorElementEditor, MotorItem, TechMotor>(bounds, Adapter.TechMotors.FirstOrDefault());
+ InitMotorItem(editor.MotorItem);
+ }
+ else if (item is DispenserItem)
+ {
+ var editor = CreateElement<DispenserElementEditor, DispenserItem, TechDispenser>(bounds, Adapter.TechDispensers.FirstOrDefault());
+ InitDispenserItem(editor.DispenserItem);
+ }
+ else if (item is ThreadMotionItem)
+ {
+ var editor = CreateElement<ThreadMotionElementEditor, ThreadMotionItem, object>(bounds, null);
+ InitThreadMotionItem(editor.ThreadMotionItem);
+ }
+ else if (item is MotorGroupItem)
+ {
+ var editor = CreateElement<MotorGroupElementEditor, MotorGroupItem, object>(bounds, null);
+ InitMotorGroupItem(editor.MotorGroupItem);
+ }
+ else if (item is DigitalOutItem)
+ {
+ var editor = CreateElement<DigitalOutElementEditor, DigitalOutItem, TechIo>(bounds, Adapter.TechIos.Where(x => x.Type == IOType.DigitalOutput.ToInt32()).FirstOrDefault());
+ InitDigitalOutItem(editor.DigitalOutItem);
+ }
+ else if (item is DigitalInItem)
+ {
+ CreateElement<DigitalInElementEditor, DigitalInItem, TechIo>(bounds, Adapter.TechIos.Where(x => x.Type == IOType.DigitalInput.ToInt32()).FirstOrDefault());
+ }
+ }
+
+ /// <summary>
+ /// Creates a new element by the specified editor type, tech item type, bounds and tech item constructor value.
+ /// </summary>
+ /// <typeparam name="Editor">The type of the editor.</typeparam>
+ /// <typeparam name="Tech">The type of the tech.</typeparam>
+ /// <typeparam name="Value">The type of the value.</typeparam>
+ /// <param name="bounds">The bounds.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ private Editor CreateElement<Editor, Tech, Value>(Rect bounds, Value value) where Editor : IElementEditor where Tech : TechItem
+ {
+ TechItem item = Activator.CreateInstance(typeof(Tech), new object[] { value }) as TechItem;
+ IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { ((Tech)item), bounds }) as IElementEditor;
+ Elements.Add(editor);
+ return (Editor)editor;
+ }
+
+ /// <summary>
+ /// Creates a new element by the specified editor type and tech item instance.
+ /// </summary>
+ /// <typeparam name="Editor">The type of the editor.</typeparam>
+ /// <param name="item">The item.</param>
+ /// <returns></returns>
+ private Editor CreateElement<Editor>(TechItem item) where Editor : IElementEditor
+ {
+ IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { item, item.GetBounds() }) as IElementEditor;
+ Elements.Add(editor);
+ return (Editor)editor;
+ }
+
+ /// <summary>
+ /// Adds a new tech item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void AddTechItem(TechItem item)
+ {
+ if (item is MonitorItem)
+ {
+ (item as MonitorItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid);
+ CreateElement<MonitorElementEditor>(item);
+ }
+ else if (item is MeterItem)
+ {
+ (item as MeterItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid);
+ CreateElement<MeterElementEditor>(item);
+ }
+ else if (item is SingleGraphItem)
+ {
+ (item as SingleGraphItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid);
+ var editor = CreateElement<SingleGraphElementEditor>(item);
+ InitSingleGraphitem(editor.GraphItem, editor);
+ }
+ else if (item is MultiGraphItem)
+ {
+ (item as MultiGraphItem).TechMonitor = Adapter.TechMonitors.Where(x => x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid);
+ var editor = CreateElement<MultiGraphElementEditor>(item);
+ InitMultiGraphItem(editor.GraphItem, editor);
+ }
+ else if (item is MotorItem)
+ {
+ (item as MotorItem).TechMotor = Adapter.TechMotors.FirstOrDefault(x => x.Guid == item.ItemGuid);
+ var editor = CreateElement<MotorElementEditor>(item);
+ InitMotorItem(editor.MotorItem);
+ }
+ else if (item is DispenserItem)
+ {
+ (item as DispenserItem).TechDispenser = Adapter.TechDispensers.FirstOrDefault(x => x.Guid == item.ItemGuid);
+ var editor = CreateElement<DispenserElementEditor>(item);
+ InitDispenserItem(editor.DispenserItem);
+ }
+ else if (item is ThreadMotionItem)
+ {
+ var editor = CreateElement<ThreadMotionElementEditor>(item);
+ InitThreadMotionItem(editor.ThreadMotionItem);
+ }
+ else if (item is MotorGroupItem)
+ {
+ var editor = CreateElement<MotorGroupElementEditor>(item);
+ InitMotorGroupItem(editor.MotorGroupItem);
+ }
+ else if (item is DigitalOutItem)
+ {
+ (item as DigitalOutItem).TechIo = Adapter.TechIos.FirstOrDefault(x => x.Guid == item.ItemGuid);
+ var editor = CreateElement<DigitalOutElementEditor>(item);
+ InitDigitalOutItem(editor.DigitalOutItem);
+ }
+ else if (item is DigitalInItem)
+ {
+ (item as DigitalInItem).TechIo = Adapter.TechIos.FirstOrDefault(x => x.Guid == item.ItemGuid);
+ CreateElement<DigitalInElementEditor>(item);
+ }
+ }
+
+ /// <summary>
+ /// Called when elements have been removed
+ /// </summary>
+ /// <param name="elements">The elements.</param>
+ public void OnElementsRemoved(List<IElementEditor> elements)
+ {
+ //foreach (var element in elements)
+ //{
+ // if (element.HostedElement is SingleGraphItem)
+ // {
+ // _singleControllers.Remove(element.HostedElement as SingleGraphItem);
+ // (element.HostedElement as SingleGraphItem).Editor.InnerGraph.InnerGraph.Dispose();
+ // }
+ // else if (element.HostedElement is MultiGraphItem)
+ // {
+ // _multiControllers.Remove(element.HostedElement as MultiGraphItem);
+ // (element.HostedElement as MultiGraphItem).Editor.InnerGraph.InnerGraph.Dispose();
+ // }
+ //}
+ }
+
+ /// <summary>
+ /// Called when elements have been pasted
+ /// </summary>
+ /// <param name="elements">The elements.</param>
+ public void OnElementsPasted(List<IElementEditor> elements)
+ {
+ foreach (var element in elements)
+ {
+ if (element is SingleGraphElementEditor)
+ {
+ var graphItem = element.HostedElement as SingleGraphItem;
+ var editor = element as SingleGraphElementEditor;
+ graphItem.Editor = editor;
+ editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(graphItem.TechMonitor.PointsPerFrame);
+
+ GraphController controller = new GraphController();
+ editor.InnerGraph.Controller = controller;
+
+ _singleControllers.Add(graphItem, controller);
+ }
+ else if (element is MultiGraphElementEditor)
+ {
+ var graphItem = element.HostedElement as MultiGraphItem;
+ var editor = element as MultiGraphElementEditor;
+ editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(graphItem.TechMonitor.PointsPerFrame);
+ graphItem.Editor = editor;
+
+
+ GraphMultiController controller = new GraphMultiController();
+
+ for (int i = 0; i < graphItem.TechMonitor.ChannelCount; i++)
+ {
+ controller.AddSeries(new RealTimeGraphEx.DataSeries.DataYSeries()
+ {
+ UseFillAndStroke = true,
+ Name = graphItem.TechMonitor.Name.First() + (i + 1).ToString(),
+ Stroke = new SolidColorBrush(ColorHelper.GetRandomColor()),
+ });
+ }
+
+ editor.InnerGraph.Controller = controller;
+
+ _multiControllers.Add(graphItem, controller);
+ }
+ else if (element is MotorElementEditor)
+ {
+ var motorItem = element.HostedElement as MotorItem;
+ InitMotorItem(motorItem);
+ }
+ else if (element is DispenserElementEditor)
+ {
+ var dispenser = element.HostedElement as DispenserItem;
+ InitDispenserItem(dispenser);
+ }
+ else if (element is DigitalOutItem)
+ {
+ var ioItem = element.HostedElement as DigitalOutItem;
+ InitDigitalOutItem(ioItem);
+ }
+ else if (element is ThreadMotionItem)
+ {
+ var threadMotionItem = element.HostedElement as ThreadMotionItem;
+ InitThreadMotionItem(threadMotionItem);
+ }
+ else if (element is MotorGroupItem)
+ {
+ var motorGroupItem = element.HostedElement as MotorGroupItem;
+ InitMotorGroupItem(motorGroupItem);
+ }
+ }
+ }
+
+ #endregion
+
+ #region Init Tech Items
+
+ /// <summary>
+ /// Initializes the motor item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void InitMotorItem(MotorItem item)
+ {
+ item.ActionExecuted += async (x, action) =>
+ {
+ if (action == MotorActionType.ForwardPressed)
+ {
+ await MachineOperator.StartMotorJogging(new MotorJoggingRequest()
+ {
+ Code = item.TechMotor.Code,
+ Direction = MotorDirection.Forward,
+ });
+ }
+ else if (action == MotorActionType.ForwardReleased)
+ {
+ await MachineOperator.StopMotorJogging(new MotorAbortJoggingRequest()
+ {
+ Code = item.TechMotor.Code,
+ });
+ }
+ else if (action == MotorActionType.BackwardPressed)
+ {
+ await MachineOperator.StartMotorJogging(new MotorJoggingRequest()
+ {
+ Code = item.TechMotor.Code,
+ Direction = MotorDirection.Backward,
+ });
+ }
+ else if (action == MotorActionType.BackwardReleased)
+ {
+ await MachineOperator.StopMotorJogging(new MotorAbortJoggingRequest()
+ {
+ Code = item.TechMotor.Code,
+ });
+ }
+ else if (action == MotorActionType.HomingStarted)
+ {
+ item.HomingProgress = 0;
+ item.IsHoming = true;
+ item.IsHomingCompleted = false;
+
+ MachineOperator.StartMotorHoming(new MotorHomingRequest()
+ {
+ Code = item.TechMotor.Code
+ })
+ .Subscribe((response) =>
+ {
+
+ item.HomingMaximumProgress = response.Message.MaxProgress;
+ item.HomingProgress = response.Message.Progress;
+
+ }, () =>
+ {
+
+ item.IsHoming = false;
+ item.IsHomingCompleted = true;
+
+ });
+ }
+ else if (action == MotorActionType.HomingStopped)
+ {
+ await MachineOperator.StopMotorHoming(new MotorAbortHomingRequest()
+ {
+ Code = item.TechMotor.Code,
+ });
+
+ item.IsHoming = false;
+ }
+ };
+ }
+
+ /// <summary>
+ /// Initializes the dispenser item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void InitDispenserItem(DispenserItem item)
+ {
+ item.ActionExecuted += async (x, action) =>
+ {
+ if (action == MotorActionType.ForwardPressed)
+ {
+ await MachineOperator.StartDispenserJogging(new DispenserJoggingRequest()
+ {
+ Code = item.TechDispenser.Code,
+ Direction = MotorDirection.Forward,
+ });
+ }
+ else if (action == MotorActionType.ForwardReleased)
+ {
+ await MachineOperator.StopDispenserJogging(new DispenserAbortJoggingRequest()
+ {
+ Code = item.TechDispenser.Code,
+ });
+ }
+ else if (action == MotorActionType.BackwardPressed)
+ {
+ await MachineOperator.StartDispenserJogging(new DispenserJoggingRequest()
+ {
+ Code = item.TechDispenser.Code,
+ Direction = MotorDirection.Backward,
+ });
+ }
+ else if (action == MotorActionType.BackwardReleased)
+ {
+ await MachineOperator.StopDispenserJogging(new DispenserAbortJoggingRequest()
+ {
+ Code = item.TechDispenser.Code,
+ });
+ }
+ else if (action == MotorActionType.HomingStarted)
+ {
+ item.HomingProgress = 0;
+ item.IsHoming = true;
+ item.IsHomingCompleted = false;
+
+ MachineOperator.StartDispenserHoming(new DispenserHomingRequest()
+ {
+ Code = item.TechDispenser.Code
+ })
+ .Subscribe((response) =>
+ {
+
+ item.HomingMaximumProgress = response.Message.MaxProgress;
+ item.HomingProgress = response.Message.Progress;
+
+ }, () =>
+ {
+
+ item.IsHoming = false;
+ item.IsHomingCompleted = true;
+
+ });
+ }
+ else if (action == MotorActionType.HomingStopped)
+ {
+ await MachineOperator.StopDispenserHoming(new DispenserAbortHomingRequest()
+ {
+ Code = item.TechDispenser.Code,
+ });
+
+ item.IsHoming = false;
+ }
+ };
+ }
+
+ /// <summary>
+ /// Initializes the single graph item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="editor">The editor.</param>
+ private void InitSingleGraphitem(SingleGraphItem item, SingleGraphElementEditor editor)
+ {
+ editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(item.TechMonitor.PointsPerFrame);
+ item.Editor = editor;
+
+ GraphController controller = new GraphController();
+ editor.InnerGraph.Controller = controller;
+
+ _singleControllers.Add(item, controller);
+ }
+
+ /// <summary>
+ /// Initializes the multi graph item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="editor">The editor.</param>
+ private void InitMultiGraphItem(MultiGraphItem item, MultiGraphElementEditor editor)
+ {
+ editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(item.TechMonitor.PointsPerFrame);
+ item.Editor = editor;
+
+ GraphMultiController controller = new GraphMultiController();
+
+ for (int i = 0; i < item.TechMonitor.ChannelCount; i++)
+ {
+ controller.AddSeries(new RealTimeGraphEx.DataSeries.DataYSeries()
+ {
+ UseFillAndStroke = true,
+ Name = item.TechMonitor.Name.First() + (i + 1).ToString(),
+ Stroke = new SolidColorBrush(ColorHelper.GetRandomColor()),
+ });
+ }
+
+ editor.InnerGraph.Controller = controller;
+
+ _multiControllers.Add(item, controller);
+ }
+
+ /// <summary>
+ /// Initializes the thread motion item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void InitThreadMotionItem(ThreadMotionItem item)
+ {
+ item.ActionExecuted += async (x, action) =>
+ {
+ if (action == MotorActionType.ForwardPressed)
+ {
+ await MachineOperator.StartThreadJogging(new ThreadJoggingRequest()
+ {
+ Direction = MotorDirection.Forward,
+ });
+ }
+ else if (action == MotorActionType.BackwardPressed)
+ {
+ await MachineOperator.StartThreadJogging(new ThreadJoggingRequest()
+ {
+ Direction = MotorDirection.Backward,
+ });
+ }
+ else if (action == MotorActionType.ForwardReleased || action == MotorActionType.BackwardReleased)
+ {
+ await MachineOperator.StopThreadJogging(new ThreadAbortJoggingRequest());
+ }
+ };
+ }
+
+ /// <summary>
+ /// Initializes the motor group item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void InitMotorGroupItem(MotorGroupItem item)
+ {
+ item.ActionExecuted += async (x, action) =>
+ {
+ if (action == MotorActionType.ForwardPressed)
+ {
+ await Task.WhenAll(item.TechMotors.Select(motor => MachineOperator.StartMotorJogging(new MotorJoggingRequest()
+ {
+ Code = motor.Code,
+ Direction = MotorDirection.Forward,
+ })));
+ }
+ else if (action == MotorActionType.ForwardReleased)
+ {
+ await Task.WhenAll(item.TechMotors.Select(motor => MachineOperator.StopMotorJogging(new MotorAbortJoggingRequest()
+ {
+ Code = motor.Code,
+ })));
+ }
+ else if (action == MotorActionType.BackwardPressed)
+ {
+ await Task.WhenAll(item.TechMotors.Select(motor => MachineOperator.StartMotorJogging(new MotorJoggingRequest()
+ {
+ Code = motor.Code,
+ Direction = MotorDirection.Backward,
+ })));
+ }
+ else if (action == MotorActionType.BackwardReleased)
+ {
+ await Task.WhenAll(item.TechMotors.Select(motor => MachineOperator.StopMotorJogging(new MotorAbortJoggingRequest()
+ {
+ Code = motor.Code,
+ })));
+ }
+ //else if (action == MotorActionType.HomingStarted)
+ //{
+ // item.HomingProgress = 0;
+ // item.IsHoming = true;
+ // item.IsHomingCompleted = false;
+
+ // MachineOperator.StartMotorHoming(new MotorHomingRequest()
+ // {
+ // Code = item.TechMotor.Code
+ // })
+ // .Subscribe((response) =>
+ // {
+
+ // item.HomingMaximumProgress = response.Message.MaxProgress;
+ // item.HomingProgress = response.Message.Progress;
+
+ // }, () =>
+ // {
+
+ // item.IsHoming = false;
+ // item.IsHomingCompleted = true;
+
+ // });
+ //}
+ //else if (action == MotorActionType.HomingStopped)
+ //{
+ // await MachineOperator.StopMotorHoming(new MotorAbortHomingRequest()
+ // {
+ // Code = item.TechMotor.Code,
+ // });
+
+ // item.IsHoming = false;
+ //}
+ };
+ }
+
+ /// <summary>
+ /// Initializes the digital out item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void InitDigitalOutItem(DigitalOutItem item)
+ {
+ item.ValueChanged += async (x, value) =>
+ {
+ try
+ {
+ await MachineOperator.SetDigitalOut(new SetDigitalOutRequest() { Port = item.TechIo.Port, Value = value });
+ }
+ catch (Exception ex)
+ {
+ //TODO: Show Exception.
+ }
+ };
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Opens a file open dialog to select a project file.
+ /// </summary>
+ public void OpenProject()
+ {
+ OpenFileDialog dlg = new OpenFileDialog();
+ dlg.Title = "Select Technician Project File";
+ dlg.Filter = "Technician Project File|*.tpf";
+
+ if (dlg.ShowDialog().Value)
+ {
+ OpenProjectFile(dlg.FileName);
+ }
+ }
+
+ /// <summary>
+ /// Opens the specified project file path.
+ /// </summary>
+ /// <param name="fileName">File path.</param>
+ public void OpenProjectFile(String fileName)
+ {
+ LoadProject(MachineTechViewProject.Load(fileName));
+ _lastTechProjectFile = fileName;
+ }
+
+ /// <summary>
+ /// Loads the specified project.
+ /// </summary>
+ /// <param name="project">The project.</param>
+ public void LoadProject(MachineTechViewProject project)
+ {
+ using (_notification.PushTaskItem("Loading technician project file..."))
+ {
+ Elements.Clear();
+ _singleControllers.Clear();
+ _multiControllers.Clear();
+
+ foreach (var item in project.Items)
+ {
+ if (item is MotorGroupItem)
+ {
+ (item as MotorGroupItem).TechMotors = ObservablesEntitiesAdapter.Instance.TechMotors.Where(x => (item as MotorGroupItem).ItemsGuids.Contains(x.Guid)).ToObservableCollection();
+ }
+
+ AddTechItem(item);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Opens the file save dialog for selecting a project file target.
+ /// </summary>
+ private void SaveAsProject()
+ {
+ SaveFileDialog dlg = new SaveFileDialog();
+ dlg.Title = "Select Technician Project Location";
+ dlg.Filter = "Technician Project File|*.tpf";
+
+ if (dlg.ShowDialog().Value)
+ {
+ SaveProjectFile(dlg.FileName);
+ }
+ }
+
+ /// <summary>
+ /// Saves the current project to the specified file path.
+ /// </summary>
+ /// <param name="fileName">Name of the file.</param>
+ private void SaveProjectFile(String fileName)
+ {
+ using (_notification.PushTaskItem("Saving technician project file..."))
+ {
+ MachineTechViewProject project = GenerateProjectFile();
+ project.Save(fileName);
+ _lastTechProjectFile = fileName;
+ }
+ }
+
+ /// <summary>
+ /// Saves the current opened project file. If not project file is opened will call <see cref="SaveAsProject"/>.
+ /// </summary>
+ private void SaveProject()
+ {
+ if (File.Exists(_lastTechProjectFile))
+ {
+ SaveProjectFile(_lastTechProjectFile);
+ }
+ else
+ {
+ SaveAsProject();
+ }
+ }
+
+ /// <summary>
+ /// Generates a project file from the current element setup.
+ /// </summary>
+ /// <returns></returns>
+ private MachineTechViewProject GenerateProjectFile()
+ {
+ MachineTechViewProject project = new MachineTechViewProject();
+
+ foreach (var element in Elements)
+ {
+ if (element.HostedElement is MotorGroupItem)
+ {
+ var group = element.HostedElement as MotorGroupItem;
+ group.ItemsGuids = group.TechMotors.Select(x => x.Guid).ToList();
+ }
+
+ (element.HostedElement as TechItem).SetBounds(element.GetBounds());
+ project.Items.Add(element.HostedElement as TechItem);
+ }
+
+ return project;
+ }
+
+ #endregion
+
+ #region IShutdownListener
+
+ /// <summary>
+ /// Called when the application is about to terminate.
+ /// </summary>
+ public void OnShuttingDown()
+ {
+ InvokeUINow(() =>
+ {
+ SettingsManager.Default.MachineStudio.TechnicianModule.LasTechProjectFile = _lastTechProjectFile;
+ });
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MainViewVM.cs
new file mode 100644
index 000000000..306f15c5c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MainViewVM.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.Commands;
+using Tango.MachineStudio.Technician.Navigation;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.Technician.ViewModels
+{
+ /// <summary>
+ /// Represents the technician module main view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ public class MainViewVM : ViewModel
+ {
+ private TechNavigationManager _navigation;
+
+ #region Constructors
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
+ /// <param name="navigationManager">The navigation manager.</param>
+ public MainViewVM(TechNavigationManager navigationManager)
+ {
+ _navigation = navigationManager;
+ NavigateToViewCommand = new RelayCommand<string>(NavigateToView);
+ }
+
+ #endregion
+
+ #region Commands
+
+ /// <summary>
+ /// Gets or sets the navigate to view command.
+ /// </summary>
+ public RelayCommand<String> NavigateToViewCommand { get; set; }
+
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Navigates to the specified view.
+ /// </summary>
+ /// <param name="view">The view.</param>
+ private void NavigateToView(string view)
+ {
+ _navigation.NavigateTo((TechNavigationView)Enum.Parse(typeof(TechNavigationView), view, true));
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/SensorsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/SensorsViewVM.cs
new file mode 100644
index 000000000..4480e353b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/SensorsViewVM.cs
@@ -0,0 +1,192 @@
+using RealTimeGraphEx.Controllers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.Operators;
+using Tango.Logging;
+using Tango.MachineStudio.Common.Modules;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.PMR.Diagnostics;
+using Tango.Settings;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.Technician.ViewModels
+{
+ /// <summary>
+ /// Represents the technician module sensors view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
+ public class SensorsViewVM : ViewModel
+ {
+ private List<GraphControllerBase> _controllers;
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets the application manager.
+ /// </summary>
+ public IStudioApplicationManager ApplicationManager { get; set; }
+
+ private IMachineOperator _machineOperator;
+ /// <summary>
+ /// Gets or sets the machine operator.
+ /// </summary>
+ public IMachineOperator MachineOperator
+ {
+ get { return _machineOperator; }
+ set { _machineOperator = value; RaisePropertyChangedAuto(); }
+ }
+
+ private int _graphSeconds;
+ /// <summary>
+ /// Gets or sets the graphs number of seconds to complete FIFO capacity.
+ /// </summary>
+ public int GraphSeconds
+ {
+ get { return _graphSeconds; }
+ set { _graphSeconds = value; RaisePropertyChanged(nameof(GraphSeconds)); }
+ }
+
+ /// <summary>
+ /// Clears the graphs.
+ /// </summary>
+ public void ClearGraphs()
+ {
+ _controllers.ForEach(x => x.Clear());
+ }
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SensorsViewVM"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="moduleLoader">The module loader.</param>
+ public SensorsViewVM(IStudioApplicationManager applicationManager, IStudioModuleLoader moduleLoader)
+ {
+ ApplicationManager = applicationManager;
+ ApplicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
+
+ InitializeConnectedMachine(ApplicationManager.ConnectedMachine);
+
+ if (!DesignMode)
+ {
+ //Set graphs FIFO capacity by seconds (this will be converted to MaxPoints by the view).
+ GraphSeconds = SettingsManager.Default.MachineStudio.TechnicianModule.GraphsDuration;
+
+ _controllers = new List<GraphControllerBase>();
+
+ TemperatureController = new GraphController();
+ PressureController = new GraphController();
+ VelocityController = new GraphController();
+
+ _controllers.Add(TemperatureController);
+ _controllers.Add(PressureController);
+ _controllers.Add(VelocityController);
+
+ var module = moduleLoader.GetStudioModule<TechnicianModule>();
+
+ if (module != null)
+ {
+ module.IsLoadedChanged += Module_IsLoadedChanged;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ /// <summary>
+ /// Handles the technician module IsLoaded changed event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="loaded">if set to <c>true</c> [loaded].</param>
+ private void Module_IsLoadedChanged(object sender, bool loaded)
+ {
+ _controllers.ForEach(x => x.ChangeRenderMode(loaded));
+ }
+
+ /// <summary>
+ /// Handles the application manager connected machine changed event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="machineOperator">The machine operator.</param>
+ private void ApplicationManager_ConnectedMachineChanged(object sender, Integration.Services.IExternalBridgeClient machineOperator)
+ {
+ InitializeConnectedMachine(machineOperator);
+ }
+
+ /// <summary>
+ /// Handles the machine operator diagnostics data available event
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="data">The data.</param>
+ private void MachineOperator_DiagnosticsDataAvailable(object sender, PushDiagnosticsResponse data)
+ {
+ //TemperatureController.PushData(data.Temperature.ToArray());
+ //PressureController.PushData(data.Temperature.ToArray());
+ //VelocityController.PushData(data.Velocity.ToArray());
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ /// <summary>
+ /// Initializes the connected machine.
+ /// </summary>
+ /// <param name="machineOperator">The machine operator.</param>
+ private void InitializeConnectedMachine(IMachineOperator machineOperator)
+ {
+ //MachineOperator = machineOperator;
+
+ //if (MachineOperator != null)
+ //{
+ // MachineOperator.EnableSensorsUpdate = true;
+ // MachineOperator.DiagnosticsDataAvailable -= MachineOperator_DiagnosticsDataAvailable;
+ // MachineOperator.DiagnosticsDataAvailable += MachineOperator_DiagnosticsDataAvailable;
+ //}
+ }
+
+ #endregion
+
+ #region Graphs Controllers
+
+ private GraphController _temperatureController;
+ /// <summary>
+ /// Gets or sets the temperature sensor graph controller .
+ /// </summary>
+ public GraphController TemperatureController
+ {
+ get { return _temperatureController; }
+ set { _temperatureController = value; RaisePropertyChanged(nameof(TemperatureController)); }
+ }
+
+ private GraphController _pressureController;
+ /// <summary>
+ /// Gets or sets the pressure sensor graph controller .
+ /// </summary>
+ public GraphController PressureController
+ {
+ get { return _pressureController; }
+ set { _pressureController = value; RaisePropertyChanged(nameof(PressureController)); }
+ }
+
+ private GraphController _velocityController;
+ /// <summary>
+ /// Gets or sets the velocity sensor graph controller .
+ /// </summary>
+ public GraphController VelocityController
+ {
+ get { return _velocityController; }
+ set { _velocityController = value; RaisePropertyChanged(nameof(VelocityController)); }
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml
new file mode 100644
index 000000000..5996c351b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml
@@ -0,0 +1,404 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.Views.MachineTechView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Technician.ViewModels"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Technician"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
+ xmlns:fa="http://schemas.fontawesome.io/icons/"
+ xmlns:editors="clr-namespace:Tango.Editors;assembly=Tango.Editors"
+ xmlns:techItems="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:templates="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
+ xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" d:DataContext="{d:DesignInstance Type=vm:MachineTechViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MachineTechViewVM}">
+
+ <UserControl.Resources>
+ <converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
+ <converters:NumberToFileSizeConverter x:Key="NumberToFileSizeConverter" />
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="150"/>
+ <RowDefinition Height="199*"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto"/>
+ <RowDefinition Height="1*"/>
+ </Grid.RowDefinitions>
+
+ <Menu Padding="5" Background="#C6ECECEC" Visibility="{Binding HideMenu,Converter={StaticResource BooleanToVisibilityInverseConverter}}">
+ <MenuItem Header="File">
+ <MenuItem Command="{Binding OpenProjectCommand}" MinWidth="180" Header="Open" VerticalContentAlignment="Center">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="FolderOpen" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Save" Command="{Binding SaveProjectCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Save" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Save as" Command="{Binding SaveAsProjectCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Save" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ </MenuItem>
+ <MenuItem Header="Edit">
+ <MenuItem Header="Cut (Ctrl+X)" Command="{Binding ElementName=editor,Path=CutCommand}" MinWidth="210">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Cut" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Copy (Ctrl+C)" Command="{Binding ElementName=editor,Path=CopyCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Copy" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Paste (Ctrl+V)" Command="{Binding ElementName=editor,Path=PasteCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Paste" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Undo (Ctrl+Z)" Command="{Binding ElementName=editor,Path=UndoCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Undo" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Redo (Ctrl+Y)" Command="{Binding ElementName=editor,Path=RedoCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="RotateRight" Width="16"></fa:ImageAwesome>
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Delete (DELETE)" Command="{Binding ElementName=editor,Path=DeleteCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Recycle" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Select All (Ctrl+A)" Command="{Binding ElementName=editor,Path=SelectAllCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Th" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ </MenuItem>
+ <MenuItem Header="View">
+ <MenuItem Header="Zoom In" Command="{Binding ElementName=editor,Path=ZoomCommand}" CommandParameter="0.1">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="SearchPlus" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Zoom Out" Command="{Binding ElementName=editor,Path=ZoomCommand}" CommandParameter="-0.1">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="SearchMinus" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Reset Zoom" Command="{Binding ElementName=editor,Path=ResetZoomCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Search" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ </MenuItem>
+ <MenuItem Header="Components">
+ <MenuItem.ItemContainerStyle>
+ <Style TargetType="MenuItem" BasedOn="{x:Null}">
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Style.Triggers>
+ <Trigger Property="IsMouseOver" Value="True">
+ <Setter Property="Background" Value="Transparent"></Setter>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+ </MenuItem.ItemContainerStyle>
+ <ListBox Margin="-27 0 -22 0" MinWidth="180" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding AvailableTechItems}" SelectedItem="{Binding SelectedTechItem}" HorizontalContentAlignment="Stretch">
+ <ListBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <Border Width="24" Height="24" BorderThickness="1" CornerRadius="100">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="BorderBrush" Value="{StaticResource AccentColorBrush}"></Setter>
+ <Setter Property="BorderThickness" Value="1"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected}" Value="True">
+ <Setter Property="Background" Value="White"></Setter>
+ <Setter Property="BorderBrush" Value="#FF7575"></Setter>
+ <Setter Property="BorderThickness" Value="2"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+ <Image Source="{Binding Image}" RenderOptions.BitmapScalingMode="Fant"></Image>
+ </Border>
+ <TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Text="{Binding Name}"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+ </MenuItem>
+ </Menu>
+
+ <Grid Grid.Row="1">
+ <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="20 0 0 0">
+ <ListBox ItemContainerStyle="{StaticResource basicListBoxItem}" ItemsSource="{Binding AvailableTechItems}" SelectedItem="{Binding SelectedTechItem,Mode=TwoWay}" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
+ <ListBox.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Horizontal"></StackPanel>
+ </ItemsPanelTemplate>
+ </ListBox.ItemsPanel>
+ <ListBox.ItemTemplate>
+ <DataTemplate DataType="{x:Type techItems:TechItem}">
+ <Border Cursor="Hand" ToolTip="{Binding Description}" RenderTransformOrigin="0.5,0.5" Width="70" Padding="10" Margin="5" Height="70" BorderThickness="1" CornerRadius="100">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="BorderBrush" Value="{StaticResource AccentColorBrush}"></Setter>
+ <Setter Property="BorderThickness" Value="1"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected}" Value="True">
+ <Setter Property="Background" Value="White"></Setter>
+ <Setter Property="BorderBrush" Value="#FF7575"></Setter>
+ <Setter Property="BorderThickness" Value="2"></Setter>
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1.1" Duration="00:00:0.2"></DoubleAnimation>
+ <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1.1" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="00:00:0.2"></DoubleAnimation>
+ <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1" Duration="00:00:0.2"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+ <Image Source="{Binding Image}" RenderOptions.BitmapScalingMode="Fant"></Image>
+ </Border>
+ </DataTemplate>
+ </ListBox.ItemTemplate>
+ </ListBox>
+ </StackPanel>
+
+ <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0 0 255 10" VerticalAlignment="Bottom">
+ <ListBox x:Name="listMode" SelectedIndex="0" Style="{StaticResource MaterialDesignToolToggleListBox}">
+ <ListBoxItem Height="40" Width="60" HorizontalContentAlignment="Center" ToolTip="Edit Mode">
+ <materialDesign:PackIcon HorizontalAlignment="Center" Width="30" Height="30" Kind="Pencil" />
+ </ListBoxItem>
+ <ListBoxItem Height="40" Width="60" HorizontalContentAlignment="Center" ToolTip="Action Mode" MouseUp="OnActionModeClicked">
+ <materialDesign:PackIcon HorizontalAlignment="Center" Width="30" Height="30" Kind="HandPointingRight" />
+ </ListBoxItem>
+ </ListBox>
+ </StackPanel>
+
+ <Border HorizontalAlignment="Right" Width="220" Margin="10 0 5 8" BorderBrush="Gainsboro" BorderThickness="1 0 1 1" Padding="5">
+ <Grid>
+ <StackPanel TextElement.FontSize="10" VerticalAlignment="Center" TextElement.Foreground="Gray">
+ <TextBlock HorizontalAlignment="Center"><Run FontWeight="SemiBold" FontStyle="Italic">Version Name:</Run> <Run Text="{Binding CurrentDiagnosticsResponse.VersionName,FallbackValue='N/A'}"></Run></TextBlock>
+ <TextBlock HorizontalAlignment="Center" Margin="0 2 0 0"><Run FontWeight="SemiBold" FontStyle="Italic">Version Number:</Run> <Run Text="{Binding CurrentDiagnosticsResponse.Version,FallbackValue='N/A'}"></Run></TextBlock>
+ <TextBlock HorizontalAlignment="Center" Margin="0 2 0 0"><Run FontWeight="SemiBold" FontStyle="Italic">Build Date:</Run> <Run Text="{Binding CurrentDiagnosticsResponse.VersionBuildDate,FallbackValue='N/A'}"></Run></TextBlock>
+ <TextBlock HorizontalAlignment="Center" Margin="0 2 0 0"><Run FontWeight="SemiBold" FontStyle="Italic">Diagnostics Frame Size:</Run> <Run Text="{Binding CurrentDiagnosticsResponseSize,Converter={StaticResource NumberToFileSizeConverter},FallbackValue='N/A'}"></Run></TextBlock>
+ </StackPanel>
+ </Grid>
+ </Border>
+ </Grid>
+ </Grid>
+
+ <Grid Grid.Row="1" Margin="5">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="1*"/>
+ <ColumnDefinition Width="220"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="1*"/>
+ <ColumnDefinition Width="Auto"/>
+ </Grid.ColumnDefinitions>
+ <editors:ElementsEditor
+ x:Name="editor"
+ Elements="{Binding Elements}"
+ ElementCreation="ElementsEditor_ElementCreation"
+ ElementsRemoved="ElementsEditor_ElementsRemoved"
+ AfterPaste="ElementsEditor_AfterPaste"
+ RulerHeight="32"
+ EditorWidth="1920"
+ EditorHeight="1080"
+ FontSize="10"
+ Background="Transparent"
+ EditorBackground="#70FFFFFF"
+ RulerBackground="Transparent"
+ Foreground="{StaticResource AccentColorBrush}"
+ SelectionFillBrush="#338D8D8D"
+ SelectionStrokeBrush="{StaticResource AccentColorBrush}"
+ BorderBrush="{StaticResource AccentColorBrush}"
+ BorderThickness="1">
+
+ <editors:ElementsEditor.Style>
+ <Style TargetType="editors:ElementsEditor">
+ <Setter Property="IsEditable" Value="True"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ElementName=listMode,Path=SelectedIndex}" Value="1">
+ <Setter Property="IsEditable" Value="False"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </editors:ElementsEditor.Style>
+
+ <editors:ElementsEditor.ContextMenu>
+ <ContextMenu DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
+ <MenuItem Header="Cut (Ctrl+X)" Command="{Binding CutCommand}" MinWidth="210">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Cut" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Copy (Ctrl+C)" Command="{Binding CopyCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Copy" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Paste (Ctrl+V)" Command="{Binding PasteCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Paste" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Undo (Ctrl+Z)" Command="{Binding UndoCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Undo" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <MenuItem Header="Redo (Ctrl+Y)" Command="{Binding RedoCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="RotateRight" Width="16"></fa:ImageAwesome>
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Delete (DELETE)" Command="{Binding DeleteCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Recycle" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ <Separator/>
+ <MenuItem Header="Select All (Ctrl+A)" Command="{Binding SelectAllCommand}">
+ <MenuItem.Icon>
+ <fa:ImageAwesome Icon="Th" Width="16" />
+ </MenuItem.Icon>
+ </MenuItem>
+ </ContextMenu>
+ </editors:ElementsEditor.ContextMenu>
+ </editors:ElementsEditor>
+
+ <Slider Grid.Column="1" Orientation="Vertical" Margin="5" Maximum="3" Minimum="0.2" Value="{Binding ElementName=editor,Path=ScaleFactor}"></Slider>
+ </Grid>
+
+ <Grid Grid.Column="1">
+ <DockPanel>
+ <TextBlock DockPanel.Dock="Top" Margin="0 -30 0 0" DataContext="{Binding ElementName=editor,Path=SelectedElement.HostedElement}" Text="{Binding TechName}" FontSize="16" FontWeight="Bold" FontStyle="Italic"></TextBlock>
+ <GroupBox DockPanel.Dock="Top" Header="BOUNDS" Padding="5">
+ <StackPanel>
+ <!--Position-->
+ <UniformGrid Columns="2" Margin="0 5 0 0">
+ <StackPanel Margin="0 0 5 0">
+ <TextBlock>Left</TextBlock>
+ <mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="0" Maximum="{Binding ElementName=editor,Path=EditorWidth}" Value="{Binding ElementName=editor,Path=SelectedElement.Left}"></mahapps:NumericUpDown>
+ </StackPanel>
+ <StackPanel Margin="5 0 0 0">
+ <TextBlock>Top</TextBlock>
+ <mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="0" Maximum="{Binding ElementName=editor,Path=EditorHeight}" Value="{Binding ElementName=editor,Path=SelectedElement.Top}"></mahapps:NumericUpDown>
+ </StackPanel>
+ </UniformGrid>
+
+ <!--Size-->
+ <UniformGrid Columns="2" Margin="0 20 0 0">
+ <StackPanel Margin="0 0 5 0">
+ <TextBlock>Width</TextBlock>
+ <mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="10" Maximum="{Binding ElementName=editor,Path=EditorWidth}" Value="{Binding ElementName=editor,Path=SelectedElement.Width}"></mahapps:NumericUpDown>
+ </StackPanel>
+ <StackPanel Margin="5 0 0 0">
+ <TextBlock>Height</TextBlock>
+ <mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="10" Maximum="{Binding ElementName=editor,Path=EditorHeight}" Value="{Binding ElementName=editor,Path=SelectedElement.Height}"></mahapps:NumericUpDown>
+ </StackPanel>
+ </UniformGrid>
+
+ <!--<Angle-->
+ <Grid Margin="0 20 0 0">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="22*"></ColumnDefinition>
+ <ColumnDefinition Width="20*"></ColumnDefinition>
+ </Grid.ColumnDefinitions>
+ <TextBlock VerticalAlignment="Center" Margin="0 0 10 0" HorizontalAlignment="Left">Angle</TextBlock>
+ <mahapps:NumericUpDown Grid.Column="1" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Maximum="360" Minimum="-360" HasDecimals="False" Margin="0 5 0 0" Value="{Binding ElementName=editor,Path=SelectedElement.Angle}"></mahapps:NumericUpDown>
+ </Grid>
+ </StackPanel>
+ </GroupBox>
+
+ <ContentControl Margin="0 10 0 0" DataContext="{Binding ElementName=editor,Path=SelectedElement.HostedElement}" Content="{Binding ElementName=editor,Path=SelectedElement.HostedElement}">
+ <ContentControl.Resources>
+ <DataTemplate DataType="{x:Type sys:Nullable}">
+
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:MonitorItem}">
+ <templates:MonitorTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:DigitalInItem}">
+ <templates:DigitalInTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:MotorGroupItem}">
+ <templates:MotorGroupTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:ThreadMotionItem}">
+ <templates:ThreadMotionTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:DigitalOutItem}">
+ <templates:DigitalOutTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:DispenserItem}">
+ <templates:DispenserTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:MotorItem}">
+ <templates:MotorTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:MeterItem}">
+ <templates:MeterTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:SingleGraphItem}">
+ <templates:SingleGraphTemplate/>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type items:MultiGraphItem}">
+ <templates:MultiGraphTemplate/>
+ </DataTemplate>
+ </ContentControl.Resources>
+ </ContentControl>
+ </DockPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml.cs
new file mode 100644
index 000000000..b60f4d725
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MachineTechView.xaml.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Editors;
+using Tango.MachineStudio.Technician.ViewModels;
+
+namespace Tango.MachineStudio.Technician.Views
+{
+ /// <summary>
+ /// Interaction logic for MachineTechView.xaml
+ /// </summary>
+ public partial class MachineTechView : UserControl
+ {
+ private MachineTechViewVM _vm;
+
+ public MachineTechView()
+ {
+ InitializeComponent();
+
+ this.Loaded += (x, y) =>
+ {
+ _vm = DataContext as MachineTechViewVM;
+ };
+
+ (editor.UndoRedoStatesProvider as ElementsEditorUndoRedoStatesProvider).StateExecuted += MachineTechView_StateExecuted;
+ }
+
+ private void MachineTechView_StateExecuted(object sender, UndoRedoStateExecutedEventArgs e)
+ {
+ ElementsEditorUndoRedoState state = e.State as ElementsEditorUndoRedoState;
+ }
+
+ private void ElementsEditor_ElementCreation(object sender, ElementCreationEventArgs e)
+ {
+ _vm.CreateElement(e.Bounds);
+ e.AppendUndoState = true;
+ }
+
+ private void ElementsEditor_ElementsRemoved(object sender, ElementsEventArgs e)
+ {
+ _vm.OnElementsRemoved(e.Elements);
+ }
+
+ private void ElementsEditor_AfterPaste(object sender, ElementsEventArgs e)
+ {
+ _vm.OnElementsPasted(e.Elements);
+ }
+
+ private void OnActionModeClicked(object sender, MouseButtonEventArgs e)
+ {
+ editor.DeselectElements();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml
new file mode 100644
index 000000000..6b84881fd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml
@@ -0,0 +1,102 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.Views.MainView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Technician"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Technician.ViewModels"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:sharedUI="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}" Background="White">
+
+ <UserControl.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+ <ResourceDictionary Source="../Resources/GraphEx.xaml"></ResourceDictionary>
+ <ResourceDictionary>
+ <converters:TransitionLinkConverter x:Key="linkConverter"></converters:TransitionLinkConverter>
+ </ResourceDictionary>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </UserControl.Resources>
+
+
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="50"/>
+ <RowDefinition Height="1*"/>
+ </Grid.RowDefinitions>
+
+ <Grid Background="#F1F1F1">
+ <Grid.Resources>
+ <Style TargetType="Border" x:Key="glowBorder">
+ <Setter Property="Height" Value="2"></Setter>
+ <Setter Property="Margin" Value="0 0 0 -15"></Setter>
+ <Setter Property="HorizontalAlignment" Value="Stretch"></Setter>
+ <Setter Property="Background" Value="{StaticResource AccentColorBrush3}"></Setter>
+ <Setter Property="CornerRadius" Value="3"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button},Path=FontWeight}" Value="Normal">
+ <DataTrigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="0" Duration="00:00:1" Storyboard.TargetProperty="Opacity"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.EnterActions>
+ <DataTrigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="Opacity"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </DataTrigger.ExitActions>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Grid.Resources>
+ <StackPanel Orientation="Horizontal" Margin="10 0 0 0">
+ <Button Width="110" Style="{StaticResource LinkButton}" FontSize="{StaticResource LargeFontSize}" FontWeight="{Binding ElementName=TransitionControl,Path=SelectedControl,Converter={StaticResource linkConverter}, ConverterParameter='Overview'}" VerticalAlignment="Center" Command="{Binding NavigateToViewCommand}" CommandParameter="Overview">
+ <StackPanel Orientation="Vertical">
+ <TextBlock Text="OVERVIEW"></TextBlock>
+ <Border Style="{StaticResource glowBorder}">
+ </Border>
+ </StackPanel>
+ </Button>
+ <Button IsEnabled="{Binding IsResultsAvailable}" Width="100" Style="{StaticResource LinkButton}" Margin="20 0 0 0" FontSize="{StaticResource LargeFontSize}" VerticalAlignment="Center" FontWeight="{Binding ElementName=TransitionControl,Path=SelectedControl,Converter={StaticResource linkConverter}, ConverterParameter='Motors'}" Command="{Binding NavigateToViewCommand}" CommandParameter="Motors">
+ <StackPanel Orientation="Vertical">
+ <TextBlock Text="MOTORS"></TextBlock>
+ <Border Style="{StaticResource glowBorder}">
+ </Border>
+ </StackPanel>
+ </Button>
+ <Grid Visibility="{Binding IsDebugViewEnabled,Converter={StaticResource BooleanToVisibilityConverter}}">
+ <Button Visibility="{Binding IsDebugViewAttached,Converter={StaticResource BooleanToVisibilityConverter}}" Width="150" Style="{StaticResource LinkButton}" Margin="20 0 0 0" FontSize="{StaticResource LargeFontSize}" VerticalAlignment="Center" FontWeight="{Binding ElementName=TransitionControl,Path=SelectedControl,Converter={StaticResource linkConverter}, ConverterParameter='Sensors'}" Command="{Binding NavigateToViewCommand}" CommandParameter="Sensors">
+ <StackPanel Orientation="Vertical">
+ <TextBlock Text="SENSORS"></TextBlock>
+ <Border Style="{StaticResource glowBorder}" >
+ </Border>
+ </StackPanel>
+ </Button>
+ </Grid>
+ </StackPanel>
+ </Grid>
+
+ <sharedUI:MultiTransitionControl Grid.Row="1" x:Name="TransitionControl" x:FieldModifier="public" AlwaysFade="True" TransitionType="Slide" Grid.RowSpan="2">
+ <sharedUI:MultiTransitionControl.Controls>
+ <ContentControl Tag="Overview">
+ <local:OverviewView></local:OverviewView>
+ </ContentControl>
+ <ContentControl Tag="Motors">
+ <local:MotorsView></local:MotorsView>
+ </ContentControl>
+ <ContentControl Tag="Sensors">
+ <local:SensorsView></local:SensorsView>
+ </ContentControl>
+ </sharedUI:MultiTransitionControl.Controls>
+ </sharedUI:MultiTransitionControl>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml.cs
new file mode 100644
index 000000000..b07fc597e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MainView.xaml.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.Views
+{
+ /// <summary>
+ /// Interaction logic for MainView.xaml
+ /// </summary>
+ public partial class MainView : UserControl
+ {
+ public static MainView Instance { get; set; }
+
+ public MainView()
+ {
+ InitializeComponent();
+ Instance = this;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml
index 95416b906..3fb49d457 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/UserControl1.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml
@@ -1,12 +1,12 @@
-<UserControl x:Class="Tango.MachineStudio.Developer.UserControl1"
+<UserControl x:Class="Tango.MachineStudio.Technician.Views.MotorsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:local="clr-namespace:Tango.MachineStudio.Developer"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
-
+ <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40">MOTORS</TextBlock>
</Grid>
</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml.cs
new file mode 100644
index 000000000..bd548766c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/MotorsView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.Views
+{
+ /// <summary>
+ /// Interaction logic for MotorsView.xaml
+ /// </summary>
+ public partial class MotorsView : UserControl
+ {
+ public MotorsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml
new file mode 100644
index 000000000..3c064346d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml
@@ -0,0 +1,12 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.Views.OverviewView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+ <Grid>
+ <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40">OVERVIEW</TextBlock>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml.cs
new file mode 100644
index 000000000..aeba42c00
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/OverviewView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.Views
+{
+ /// <summary>
+ /// Interaction logic for OverviewView.xaml
+ /// </summary>
+ public partial class OverviewView : UserControl
+ {
+ public OverviewView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml
new file mode 100644
index 000000000..63feae2f3
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml
@@ -0,0 +1,173 @@
+<UserControl x:Class="Tango.MachineStudio.Technician.Views.SensorsView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
+ xmlns:global="clr-namespace:Tango.MachineStudio.Technician"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.Technician.ViewModels"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:graphEx="clr-namespace:RealTimeGraphEx.FastGraphs;assembly=RealTimeGraphEx"
+ xmlns:components="clr-namespace:RealTimeGraphEx.Components;assembly=RealTimeGraphEx"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Technician.Converters"
+ mc:Ignorable="d"
+ d:DesignHeight="720" d:DesignWidth="1280" d:DataContext="{d:DesignInstance Type=vm:SensorsViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.SensorsViewVM}" Background="White">
+
+ <UserControl.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+ <!--RealTimeGraphEx-->
+ <ResourceDictionary Source="pack://application:,,,/RealTimeGraphEx;component/Resources/Resources.xaml"></ResourceDictionary>
+ <ResourceDictionary Source="../Resources/GraphEx.xaml"></ResourceDictionary>
+
+ <ResourceDictionary>
+ <Style TargetType="ContentControl" x:Key="graphContent">
+ <Style.Setters>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Grid MouseEnter="Graph_MouseEnter" MouseLeave="Graph_MouseLeave" ClipToBounds="True">
+ <ContentControl Content="{Binding}"></ContentControl>
+ <Grid Opacity="0.8" HorizontalAlignment="Stretch" VerticalAlignment="Top" ClipToBounds="True" Height="35" Margin="0 -35 0 0">
+ <Button Click="OnGraphFullScreen" Margin="5" ToolTip="Full Screen" HorizontalAlignment="Right" VerticalAlignment="Top" Width="24" Height="24" BorderBrush="Transparent" Background="{StaticResource AccentColorBrush}" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" >
+ <materialDesign:PackIcon Kind="Fullscreen" HorizontalAlignment="Right" Width="20" Height="20" Foreground="{StaticResource WhiteBrush}" />
+ </Button>
+ </Grid>
+ </Grid>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ </ResourceDictionary>
+
+ <ResourceDictionary>
+ <converters:SecondsToGraphPointsConverter x:Key="secondsToPoints"></converters:SecondsToGraphPointsConverter>
+ </ResourceDictionary>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </UserControl.Resources>
+
+ <Grid Margin="10">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="60"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="1*"/>
+ <ColumnDefinition Width="1*"/>
+ <ColumnDefinition Width="1*"/>
+ </Grid.ColumnDefinitions>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="1*"/>
+ </Grid.RowDefinitions>
+
+ <!--Temperature-->
+ <ContentControl Style="{StaticResource graphContent}" Margin="0 0 5 5" MinHeight="5">
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="40"/>
+ <ColumnDefinition Width="438*"/>
+ </Grid.ColumnDefinitions>
+
+ <Border BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1 1 0 1">
+ <StackPanel Orientation="Horizontal">
+ <components:YAxisScroll Interval="6" Graph="{Binding ElementName=graphTemperature}" Width="35" Foreground="{StaticResource MaterialDesignLightForeground}" VerticalOffset="-5" FontSize="8" StringFormat="#0.0"></components:YAxisScroll>
+ <components:YAxisTicks SmallTickTemplate="{StaticResource graphTicksTemplate}" Width="5" SmallTicks="6" Foreground="{StaticResource MaterialDesignLightForeground}" BigTicks="10" Graph="{Binding ElementName=graphTemperature}"></components:YAxisTicks>
+ </StackPanel>
+ </Border>
+ <Border Grid.Column="1" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" Background="{DynamicResource graphBackground}" Margin="5 0 0 0">
+ <graphEx:RealTimeGraphExLineErase x:Name="graphTemperature" Controller="{Binding TemperatureController}" Antialiased="True" RefreshRate="30" MaxPoints="{Binding GraphSeconds,Converter={StaticResource secondsToPoints}, ConverterParameter=10}" Minimum="0" Maximum="255" MarkerColor="{StaticResource graphsMarkerColor}" FillGraph="False" Stroke="DodgerBlue">
+ <graphEx:RealTimeGraphExLineErase.Components>
+ <components:MouseValueToolTip ToolTipTemplate="{StaticResource graphTooltipTemplate}" />
+ <components:GridLines Rows="4" Columns="6" GridBrush="{DynamicResource graphGridLinesBrush}"></components:GridLines>
+ </graphEx:RealTimeGraphExLineErase.Components>
+ <graphEx:RealTimeGraphExLineErase.InnerContent>
+ <Grid>
+ <Label Style="{StaticResource graphLabel}">
+ TEMPERATURE
+ </Label>
+ </Grid>
+ </graphEx:RealTimeGraphExLineErase.InnerContent>
+ </graphEx:RealTimeGraphExLineErase>
+ </Border>
+ </Grid>
+ </ContentControl>
+
+ <!--Pressure-->
+ <ContentControl Grid.Column="1" Style="{StaticResource graphContent}" Margin="0 0 5 5" MinHeight="5">
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="40"/>
+ <ColumnDefinition Width="438*"/>
+ </Grid.ColumnDefinitions>
+
+ <Border BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1 1 0 1">
+ <StackPanel Orientation="Horizontal">
+ <components:YAxisWave Interval="6" Graph="{Binding ElementName=graphPressure}" Width="35" Foreground="{StaticResource MaterialDesignLightForeground}" VerticalOffset="-5" FontSize="8" StringFormat="#0.0"></components:YAxisWave>
+ <components:YAxisTicks SmallTickTemplate="{StaticResource graphTicksTemplate}" Width="5" SmallTicks="6" Foreground="{StaticResource MaterialDesignLightForeground}" BigTicks="10" Graph="{Binding ElementName=graphPressure}"></components:YAxisTicks>
+ </StackPanel>
+ </Border>
+ <Border Grid.Column="1" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" Background="{DynamicResource graphBackground}" Margin="5 0 0 0">
+ <graphEx:RealTimeGraphExWaveScroll x:Name="graphPressure" Controller="{Binding PressureController}" Antialiased="True" RefreshRate="30" MaxPoints="{Binding GraphSeconds,Converter={StaticResource secondsToPoints}, ConverterParameter=10}" Minimum="0" Maximum="255" FillGraph="True" Fill="#70FF0000" Stroke="Red">
+ <graphEx:RealTimeGraphExWaveScroll.Components>
+ <components:MouseValueToolTip ToolTipTemplate="{StaticResource graphTooltipTemplate}" />
+ <components:GridLines Rows="4" Columns="6" GridBrush="{DynamicResource graphGridLinesBrush}"></components:GridLines>
+ </graphEx:RealTimeGraphExWaveScroll.Components>
+ <graphEx:RealTimeGraphExWaveScroll.InnerContent>
+ <Grid>
+ <Label Style="{StaticResource graphLabel}">
+ PRESSURE
+ </Label>
+ </Grid>
+ </graphEx:RealTimeGraphExWaveScroll.InnerContent>
+ </graphEx:RealTimeGraphExWaveScroll>
+ </Border>
+ </Grid>
+ </ContentControl>
+
+ <!--Velocity-->
+ <ContentControl Grid.Column="2" Style="{StaticResource graphContent}" Margin="0 0 5 5" MinHeight="5">
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="40"/>
+ <ColumnDefinition Width="438*"/>
+ </Grid.ColumnDefinitions>
+
+ <Border BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1 1 0 1">
+ <StackPanel Orientation="Horizontal">
+ <components:YAxisScroll Interval="6" Graph="{Binding ElementName=graphVelocity}" Width="35" Foreground="{StaticResource MaterialDesignLightForeground}" VerticalOffset="-5" FontSize="8" StringFormat="#0.0"></components:YAxisScroll>
+ <components:YAxisTicks SmallTickTemplate="{StaticResource graphTicksTemplate}" Width="5" SmallTicks="6" Foreground="{StaticResource MaterialDesignLightForeground}" BigTicks="10" Graph="{Binding ElementName=graphVelocity}"></components:YAxisTicks>
+ </StackPanel>
+ </Border>
+ <Border Grid.Column="1" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" Background="{DynamicResource graphBackground}" Margin="5 0 0 0">
+ <graphEx:RealTimeGraphExLineScroll x:Name="graphVelocity" Controller="{Binding VelocityController}" Antialiased="True" RefreshRate="30" MaxPoints="{Binding GraphSeconds,Converter={StaticResource secondsToPoints}, ConverterParameter=1}" Minimum="0" Maximum="1080" FillGraph="True" Fill="#70002BFF" Stroke="#0500FF">
+ <graphEx:RealTimeGraphExLineScroll.Components>
+ <components:MouseValueToolTip ToolTipTemplate="{StaticResource graphTooltipTemplate}" />
+ <components:GridLines Rows="4" Columns="6" GridBrush="{DynamicResource graphGridLinesBrush}"></components:GridLines>
+ </graphEx:RealTimeGraphExLineScroll.Components>
+ <graphEx:RealTimeGraphExLineScroll.InnerContent>
+ <Grid>
+ <Label Style="{StaticResource graphLabel}">
+ VELOCITY
+ </Label>
+ </Grid>
+ </graphEx:RealTimeGraphExLineScroll.InnerContent>
+ </graphEx:RealTimeGraphExLineScroll>
+ </Border>
+ </Grid>
+ </ContentControl>
+ </Grid>
+
+ <Grid Grid.Row="1">
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Width="140" Height="40" Margin="0 0 10 0">STOP</Button>
+ <Button Width="140" Height="40">START</Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml.cs
new file mode 100644
index 000000000..c94c26414
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/Views/SensorsView.xaml.cs
@@ -0,0 +1,54 @@
+using Microsoft.Practices.ServiceLocation;
+using RealTimeGraphEx.Synchronization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Technician.Views
+{
+ /// <summary>
+ /// Interaction logic for DebugView.xaml
+ /// </summary>
+ public partial class SensorsView : UserControl
+ {
+ private SyncManager _syncManager;
+
+ public SensorsView()
+ {
+ InitializeComponent();
+
+ _syncManager = new SyncManager();
+ _syncManager.AddGraph(graphTemperature);
+ _syncManager.AddGraph(graphPressure);
+ _syncManager.AddGraph(graphVelocity);
+ _syncManager.RefreshRate = 30;
+ _syncManager.Start();
+ }
+
+ private void OnGraphFullScreen(object sender, RoutedEventArgs e)
+ {
+
+ }
+
+ private void Graph_MouseEnter(object sender, MouseEventArgs e)
+ {
+
+ }
+
+ private void Graph_MouseLeave(object sender, MouseEventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/app.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/app.config
new file mode 100644
index 000000000..cacd4cd77
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/app.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/packages.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/packages.config
new file mode 100644
index 000000000..dc7f6404d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/packages.config
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="CommonServiceLocator" version="1.3" targetFramework="net46" />
+ <package id="FontAwesome.WPF" version="4.7.0.9" targetFramework="net46" />
+ <package id="Google.Protobuf" version="3.4.1" targetFramework="net46" />
+ <package id="MahApps.Metro" version="1.5.0" targetFramework="net46" />
+ <package id="MaterialDesignColors" version="1.1.2" targetFramework="net46" />
+ <package id="MaterialDesignThemes" version="2.3.1.953" targetFramework="net46" />
+ <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net46" />
+ <package id="System.Reactive" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Core" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Interfaces" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Linq" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.PlatformServices" version="3.1.1" targetFramework="net46" />
+ <package id="System.Reactive.Windows.Threading" version="3.1.1" targetFramework="net46" />
+ <package id="WpfAnimatedGif" version="1.4.14" targetFramework="net46" />
+</packages> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
index 488a2f6dc..590936163 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
@@ -3,18 +3,36 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
namespace Tango.MachineStudio.Common.Authentication
{
+ /// <summary>
+ /// Represents the Machine Studio user authentication provider responsible for the current logged-in user.
+ /// </summary>
public interface IAuthenticationProvider
{
+ /// <summary>
+ /// Occurs when the current logged-in user has changed.
+ /// </summary>
event EventHandler<User> CurrentUserChanged;
+ /// <summary>
+ /// Gets the current logged-in user.
+ /// </summary>
User CurrentUser { get; }
+ /// <summary>
+ /// Performs a user login by the specified email and password.
+ /// </summary>
+ /// <param name="email">The email.</param>
+ /// <param name="password">The password.</param>
+ /// <returns></returns>
User Login(String email, String password);
+ /// <summary>
+ /// Logs-out the current logged-in user.
+ /// </summary>
void Logout();
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml
new file mode 100644
index 000000000..6a9bf9cc9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml
@@ -0,0 +1,23 @@
+<UserControl x:Class="Tango.MachineStudio.Common.Controls.HiveColorPickerControl"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:colorPicker="clr-namespace:Tango;assembly=Tango.ColorPicker"
+ xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Common.Controls"
+ mc:Ignorable="d"
+ d:DesignHeight="250" d:DesignWidth="500" >
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="235"/>
+ <ColumnDefinition Width="43*"/>
+ </Grid.ColumnDefinitions>
+
+ <colorPicker:ColorCanvas SelectedColor="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=SelectedColor,Mode=TwoWay}" Background="Transparent" BorderThickness="0" UsingAlphaChannel="False" />
+
+ <Viewbox Stretch="Uniform" Grid.Column="1" Margin="5">
+ <controls:HiveControl x:Name="hive" Height="250" HexagonSelected="hive_HexagonSelected" MaxSelections="1" Width="250" BorderThickness="1" />
+ </Viewbox>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml.cs
new file mode 100644
index 000000000..9432ae9ef
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/HiveColorPickerControl.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Common.Controls
+{
+ /// <summary>
+ /// Interaction logic for HiveColorPickerControl.xaml
+ /// </summary>
+ public partial class HiveColorPickerControl : UserControl
+ {
+ public event EventHandler<Color> SelectedColorChanged;
+ private bool _preventHiveSelectedColorChange;
+
+ public bool DemoMode
+ {
+ get { return (bool)GetValue(DemoModeProperty); }
+ set { SetValue(DemoModeProperty, value); }
+ }
+ public static readonly DependencyProperty DemoModeProperty =
+ DependencyProperty.Register("DemoMode", typeof(bool), typeof(HiveColorPickerControl), new PropertyMetadata(false));
+
+ public Color SelectedColor
+ {
+ get { return (Color)GetValue(SelectedColorProperty); }
+ set { SetValue(SelectedColorProperty, value); }
+ }
+ public static readonly DependencyProperty SelectedColorProperty =
+ DependencyProperty.Register("SelectedColor", typeof(Color), typeof(HiveColorPickerControl), new PropertyMetadata(Colors.Red, (d, e) => (d as HiveColorPickerControl).OnSelectedColorChanged()));
+
+ public Color SelectedHiveColor
+ {
+ get { return (Color)GetValue(SelectedHiveColorProperty); }
+ set { SetValue(SelectedHiveColorProperty, value); }
+ }
+ public static readonly DependencyProperty SelectedHiveColorProperty =
+ DependencyProperty.Register("SelectedHiveColor", typeof(Color), typeof(HiveColorPickerControl), new PropertyMetadata(Colors.Red));
+
+ public HiveColorPickerControl()
+ {
+ InitializeComponent();
+
+ hive.Loaded += Hive_Loaded;
+ }
+
+ private void Hive_Loaded(object sender, RoutedEventArgs e)
+ {
+ OnSelectedColorChanged();
+ }
+
+ private void OnSelectedColorChanged()
+ {
+ if (DemoMode)
+ {
+ if (!_preventHiveSelectedColorChange)
+ {
+ GenerateDemoModeHiveColors();
+ }
+ SelectedColorChanged?.Invoke(this, SelectedColor);
+ }
+ }
+
+ private void hive_HexagonSelected(object sender, SharedUI.Controls.HexagonControl hexagon)
+ {
+ SelectedHiveColor = (hexagon.Fill as SolidColorBrush).Color;
+
+ _preventHiveSelectedColorChange = true;
+ SelectedColor = SelectedHiveColor;
+ _preventHiveSelectedColorChange = false;
+ }
+
+ private void GenerateDemoModeHiveColors()
+ {
+ if (hive.CenterHexagon != null)
+ {
+ Random rnd = new Random();
+
+ (hive.CenterHexagon.Fill as SolidColorBrush).Color = SelectedColor;
+
+ int counter = 0;
+
+ foreach (var hexagon in hive.Hexagons.Where(x => x != hive.CenterHexagon).OrderBy(x => rnd.Next()))
+ {
+ (hexagon.Fill as SolidColorBrush).Color = Color.FromRgb((byte)Math.Min(SelectedColor.R + counter++, 255), (byte)Math.Min((SelectedColor.G + counter++), 255), (byte)Math.Min((SelectedColor.B + counter++), 255));
+
+ counter += 4;
+ }
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs
new file mode 100644
index 000000000..bf40d459e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs
@@ -0,0 +1,53 @@
+using RealTimeGraphEx;
+using RealTimeGraphEx.Controllers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Common.Controls
+{
+ public interface IRealTimeGraph
+ {
+ /// <summary>
+ /// Gets or sets the name of the sensor.
+ /// </summary>
+ String SensorName { get; set; }
+
+ /// <summary>
+ /// Gets or sets the tag.
+ /// </summary>
+ Object Tag { get; set; }
+
+ /// <summary>
+ /// Gets or sets the sensor units.
+ /// </summary>
+ String SensorUnits { get; set; }
+
+ /// <summary>
+ /// Occurs when the graph remove button has been pressed.
+ /// </summary>
+ event EventHandler GraphRemoveButtonPressed;
+
+ /// <summary>
+ /// Occurs when the graph full screen button has been pressed.
+ /// </summary>
+ event EventHandler GraphFullScreenButtonPressed;
+
+ /// <summary>
+ /// Gets or sets the inner real-time graph control.
+ /// </summary>
+ RealTimeGraphExBase InnerGraph { get; set; }
+
+ /// <summary>
+ /// Gets or sets the inner graph controller.
+ /// </summary>
+ GraphControllerBase Controller { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to enable toolbar buttons.
+ /// </summary>
+ bool EnableToolBar { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs
index 469e3fda5..109b00531 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs
@@ -10,19 +10,34 @@ using Tango.Core.Commands;
namespace Tango.MachineStudio.Common.Controls
{
+ /// <summary>
+ /// Represents an <see cref="MdiContainerControl"/> child control.
+ /// </summary>
+ /// <seealso cref="System.Windows.DependencyObject" />
public class MdiChild : DependencyObject
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MdiChild"/> class.
+ /// </summary>
public MdiChild()
{
}
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MdiChild"/> class.
+ /// </summary>
+ /// <param name="header">The header.</param>
+ /// <param name="view">The view.</param>
public MdiChild(String header, FrameworkElement view) : this()
{
Header = header;
View = view;
}
+ /// <summary>
+ /// Gets or sets the icon.
+ /// </summary>
public PackIconKind Icon
{
get { return (PackIconKind)GetValue(IconProperty); }
@@ -31,6 +46,9 @@ namespace Tango.MachineStudio.Common.Controls
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("Icon", typeof(PackIconKind), typeof(MdiChild), new PropertyMetadata(PackIconKind.LaptopWindows));
+ /// <summary>
+ /// Gets or sets the header.
+ /// </summary>
public String Header
{
get { return (String)GetValue(HeaderProperty); }
@@ -39,6 +57,9 @@ namespace Tango.MachineStudio.Common.Controls
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(String), typeof(MdiChild), new PropertyMetadata(null));
+ /// <summary>
+ /// Gets or sets the view.
+ /// </summary>
public FrameworkElement View
{
get { return (FrameworkElement)GetValue(ViewProperty); }
@@ -47,6 +68,9 @@ namespace Tango.MachineStudio.Common.Controls
public static readonly DependencyProperty ViewProperty =
DependencyProperty.Register("View", typeof(FrameworkElement), typeof(MdiChild), new PropertyMetadata(null));
+ /// <summary>
+ /// Gets or sets the location.
+ /// </summary>
public Point Location
{
get { return (Point)GetValue(LocationProperty); }
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs
index dbf4ee74b..ceeda050b 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs
@@ -20,8 +20,11 @@ using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.Common.Controls
{
/// <summary>
- /// Interaction logic for MdiContainerControl.xaml
+ /// Represents an MDI-style container
/// </summary>
+ /// <seealso cref="System.Windows.Controls.UserControl" />
+ /// <seealso cref="System.Windows.Markup.IComponentConnector" />
+ /// <seealso cref="System.Windows.Markup.IStyleConnector" />
public partial class MdiContainerControl : UserControl
{
private const int MIN_SIZE = 200;
@@ -63,7 +66,6 @@ namespace Tango.MachineStudio.Common.Controls
return UIHelper.FindChild<Canvas>(itemsControl, "canvas");
}
-
private void OnControlMouseDown(object sender, MouseButtonEventArgs e)
{
Canvas.SetZIndex(sender as FrameworkElement, GetCanvas().Children.OfType<FrameworkElement>().Max(x => Canvas.GetZIndex(x) + 1));
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml
new file mode 100644
index 000000000..2f43869d5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml
@@ -0,0 +1,90 @@
+<UserControl x:Class="Tango.MachineStudio.Common.Controls.RealTimeGraphControl"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:graphEx="clr-namespace:RealTimeGraphEx.FastGraphs;assembly=RealTimeGraphEx"
+ xmlns:components="clr-namespace:RealTimeGraphEx.Components;assembly=RealTimeGraphEx"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Common.Converters"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Common.Controls"
+ mc:Ignorable="d"
+ d:DesignHeight="150" d:DesignWidth="300">
+
+ <UserControl.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+ <!--RealTimeGraphEx-->
+ <ResourceDictionary Source="pack://application:,,,/RealTimeGraphEx;component/Resources/Resources.xaml"></ResourceDictionary>
+ <ResourceDictionary Source="../Resources/MaterialDesign.xaml"></ResourceDictionary>
+
+ <ResourceDictionary>
+ <Style TargetType="ContentControl" x:Key="graphContent">
+ <Style.Setters>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Grid MouseEnter="Graph_MouseEnter" MouseLeave="Graph_MouseLeave" ClipToBounds="True">
+ <ContentControl Content="{Binding}"></ContentControl>
+ <Grid Opacity="0.8" HorizontalAlignment="Stretch" VerticalAlignment="Top" ClipToBounds="True" Height="35" Margin="0 -35 0 0">
+ <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right" VerticalAlignment="Top">
+ <Button Margin="0 0 5 0" Click="OnGraphFullScreen" ToolTip="Full Screen" Width="24" Height="24" BorderBrush="Transparent" Background="{StaticResource AccentColorBrush}" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" >
+ <materialDesign:PackIcon Kind="Fullscreen" HorizontalAlignment="Right" Width="20" Height="20" Foreground="{StaticResource WhiteBrush}" />
+ </Button>
+ <Button Click="OnGraphRemove" ToolTip="Remove" Width="24" Height="24" BorderBrush="Transparent" Background="#FF7777" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" >
+ <materialDesign:PackIcon Kind="CloseCircle" HorizontalAlignment="Right" Width="20" Height="20" Foreground="{StaticResource WhiteBrush}" />
+ </Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ </ResourceDictionary>
+
+ <ResourceDictionary>
+ <converters:SecondsToGraphPointsConverter x:Key="secondsToPoints"></converters:SecondsToGraphPointsConverter>
+ </ResourceDictionary>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </UserControl.Resources>
+
+ <Grid>
+ <!--Temperature-->
+ <ContentControl Style="{StaticResource graphContent}" Margin="0 0 0 0" MinHeight="5">
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="40"/>
+ <ColumnDefinition Width="438*"/>
+ </Grid.ColumnDefinitions>
+
+ <Border BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1 1 0 1" Background="#90FFFFFF">
+ <StackPanel Orientation="Horizontal">
+ <components:YAxisScroll x:Name="yAxis" Interval="6" Graph="{Binding ElementName=Graph}" Width="35" Foreground="{StaticResource MaterialDesignLightForeground}" VerticalOffset="-5" FontSize="8" StringFormat="#0.0"></components:YAxisScroll>
+ <components:YAxisTicks x:Name="yAxisTicks" SmallTickTemplate="{StaticResource graphTicksTemplate}" Width="5" SmallTicks="6" Foreground="{StaticResource MaterialDesignLightForeground}" BigTicks="10" Graph="{Binding ElementName=Graph}"></components:YAxisTicks>
+ </StackPanel>
+ </Border>
+ <Border Grid.Column="1" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" Background="{DynamicResource graphBackground}" Margin="5 0 0 0">
+ <graphEx:RealTimeGraphExLineErase x:Name="Graph" x:FieldModifier="public" Controller="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Controller}" Antialiased="True" RefreshRate="30" MarkerColor="{StaticResource graphsMarkerColor}" FillGraph="False" Stroke="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Color}" Minimum="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Minimum}" Maximum="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Maximum}">
+ <graphEx:RealTimeGraphExLineErase.Components>
+ <components:MouseValueToolTip ToolTipTemplate="{StaticResource graphTooltipTemplate}" />
+ <components:GridLines Rows="4" Columns="6" GridBrush="{DynamicResource graphGridLinesBrush}"></components:GridLines>
+ </graphEx:RealTimeGraphExLineErase.Components>
+ <graphEx:RealTimeGraphExLineErase.InnerContent>
+ <Grid>
+ <Label Style="{StaticResource graphLabel}">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=2},Path=SensorName,FallbackValue='Dispenser Motor'}"></TextBlock>
+ <TextBlock Foreground="Gray" Margin="10 0 0 0" FontFamily="Sylfaen Regular" VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=2},Path=SensorUnits,FallbackValue='(hz)'}"></TextBlock>
+ </StackPanel>
+ </Label>
+ </Grid>
+ </graphEx:RealTimeGraphExLineErase.InnerContent>
+ </graphEx:RealTimeGraphExLineErase>
+ </Border>
+ </Grid>
+ </ContentControl>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs
new file mode 100644
index 000000000..dd9aa1414
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs
@@ -0,0 +1,179 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using RealTimeGraphEx;
+using RealTimeGraphEx.Controllers;
+
+namespace Tango.MachineStudio.Common.Controls
+{
+ /// <summary>
+ /// Interaction logic for RealTimeGraphControl.xaml
+ /// </summary>
+ public partial class RealTimeGraphControl : UserControl, IRealTimeGraph
+ {
+ private Grid headerGrid;
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets the name of the sensor.
+ /// </summary>
+ public String SensorName
+ {
+ get { return (String)GetValue(SensorNameProperty); }
+ set { SetValue(SensorNameProperty, value); }
+ }
+ public static readonly DependencyProperty SensorNameProperty =
+ DependencyProperty.Register("SensorName", typeof(String), typeof(RealTimeGraphControl), new PropertyMetadata(null));
+
+ /// <summary>
+ /// Gets or sets the sensor units.
+ /// </summary>
+ public String SensorUnits
+ {
+ get { return (String)GetValue(SensorUnitsProperty); }
+ set { SetValue(SensorUnitsProperty, value); }
+ }
+ public static readonly DependencyProperty SensorUnitsProperty =
+ DependencyProperty.Register("SensorUnits", typeof(String), typeof(RealTimeGraphControl), new PropertyMetadata(null));
+
+
+
+ public double Minimum
+ {
+ get { return (double)GetValue(MinimumProperty); }
+ set { SetValue(MinimumProperty, value); }
+ }
+ public static readonly DependencyProperty MinimumProperty =
+ DependencyProperty.Register("Minimum", typeof(double), typeof(RealTimeGraphControl), new PropertyMetadata(0.0));
+
+
+
+ public double Maximum
+ {
+ get { return (double)GetValue(MaximumProperty); }
+ set { SetValue(MaximumProperty, value); }
+ }
+ public static readonly DependencyProperty MaximumProperty =
+ DependencyProperty.Register("Maximum", typeof(double), typeof(RealTimeGraphControl), new PropertyMetadata(100.0));
+
+
+
+ public Color Color
+ {
+ get { return (Color)GetValue(ColorProperty); }
+ set { SetValue(ColorProperty, value); }
+ }
+ public static readonly DependencyProperty ColorProperty =
+ DependencyProperty.Register("Color", typeof(Color), typeof(RealTimeGraphControl), new PropertyMetadata(Colors.DodgerBlue));
+
+
+
+ public void InvalidateGraph()
+ {
+ InnerGraph.Clear();
+ yAxis.Render(InnerGraph);
+ yAxisTicks.Render(InnerGraph);
+ }
+
+ /// <summary>
+ /// Gets or sets the inner real-time graph control.
+ /// </summary>
+ public RealTimeGraphExBase InnerGraph { get; set; }
+
+ /// <summary>
+ /// Gets or sets the inner graph controller.
+ /// </summary>
+ public GraphControllerBase Controller { get; set; }
+
+
+ private bool _enableToolbar;
+ /// <summary>
+ /// Gets or sets a value indicating whether to enable toolbar buttons.
+ /// </summary>
+ public bool EnableToolBar
+ {
+ get { return _enableToolbar; }
+ set
+ {
+ _enableToolbar = value;
+
+ if (!value)
+ {
+ if (headerGrid != null)
+ {
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, -35, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+ }
+ }
+ }
+
+
+ #endregion
+
+ #region Events
+
+ public event EventHandler GraphRemoveButtonPressed;
+ public event EventHandler GraphFullScreenButtonPressed;
+
+ #endregion
+
+ public RealTimeGraphControl()
+ {
+ InitializeComponent();
+ EnableToolBar = true;
+ InnerGraph = Graph;
+ Controller = new GraphController();
+ }
+
+ private void OnGraphFullScreen(object sender, RoutedEventArgs e)
+ {
+ GraphFullScreenButtonPressed?.Invoke(this, new EventArgs());
+ }
+
+ private void Graph_MouseEnter(object sender, MouseEventArgs e)
+ {
+ if (EnableToolBar)
+ {
+ Grid mainGrid = sender as Grid;
+ headerGrid = mainGrid.Children.OfType<Grid>().ToList().First();
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, 0, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+ }
+
+ private void Graph_MouseLeave(object sender, MouseEventArgs e)
+ {
+ Grid mainGrid = sender as Grid;
+ headerGrid = mainGrid.Children.OfType<Grid>().ToList().First();
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, -35, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+
+ private void OnGraphRemove(object sender, RoutedEventArgs e)
+ {
+ GraphRemoveButtonPressed?.Invoke(this, new EventArgs());
+ }
+
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml
new file mode 100644
index 000000000..5548c452e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml
@@ -0,0 +1,95 @@
+<UserControl x:Class="Tango.MachineStudio.Common.Controls.RealTimeGraphMultiControl"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:graphEx="clr-namespace:RealTimeGraphEx.FastGraphs;assembly=RealTimeGraphEx"
+ xmlns:components="clr-namespace:RealTimeGraphEx.Components;assembly=RealTimeGraphEx"
+ xmlns:converters="clr-namespace:Tango.MachineStudio.Common.Converters"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Common.Controls"
+ mc:Ignorable="d"
+ d:DesignHeight="150" d:DesignWidth="300">
+
+ <UserControl.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+ <!--RealTimeGraphEx-->
+ <ResourceDictionary Source="pack://application:,,,/RealTimeGraphEx;component/Resources/Resources.xaml"></ResourceDictionary>
+ <ResourceDictionary Source="../Resources/MaterialDesign.xaml"></ResourceDictionary>
+
+ <ResourceDictionary>
+ <Style TargetType="ContentControl" x:Key="graphContent">
+ <Style.Setters>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Grid MouseEnter="Graph_MouseEnter" MouseLeave="Graph_MouseLeave" ClipToBounds="True">
+ <ContentControl Content="{Binding}"></ContentControl>
+ <Grid Opacity="0.8" HorizontalAlignment="Stretch" VerticalAlignment="Top" ClipToBounds="True" Height="35" Margin="0 -35 0 0">
+ <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right" VerticalAlignment="Top">
+ <Button Margin="0 0 5 0" Click="OnGraphFullScreen" ToolTip="Full Screen" Width="24" Height="24" BorderBrush="Transparent" Background="{StaticResource AccentColorBrush}" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" >
+ <materialDesign:PackIcon Kind="Fullscreen" HorizontalAlignment="Right" Width="20" Height="20" Foreground="{StaticResource WhiteBrush}" />
+ </Button>
+ <Button Click="OnGraphRemove" ToolTip="Remove" Width="24" Height="24" BorderBrush="Transparent" Background="#FF7777" Style="{StaticResource MaterialDesignFloatingActionAccentButton}" >
+ <materialDesign:PackIcon Kind="CloseCircle" HorizontalAlignment="Right" Width="20" Height="20" Foreground="{StaticResource WhiteBrush}" />
+ </Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ </ResourceDictionary>
+
+ <ResourceDictionary>
+ <converters:SecondsToGraphPointsConverter x:Key="secondsToPoints"></converters:SecondsToGraphPointsConverter>
+ </ResourceDictionary>
+ </ResourceDictionary.MergedDictionaries>
+ </ResourceDictionary>
+ </UserControl.Resources>
+
+ <Grid>
+ <!--Temperature-->
+ <ContentControl Style="{StaticResource graphContent}" Margin="0 0 0 0" MinHeight="5">
+ <Grid>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="40"/>
+ <ColumnDefinition Width="438*"/>
+ </Grid.ColumnDefinitions>
+
+ <Border BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1 1 0 1" Background="#90FFFFFF">
+ <StackPanel Orientation="Horizontal">
+ <components:YAxisScroll x:Name="yAxis" Interval="6" Graph="{Binding ElementName=Graph}" Width="35" Foreground="{StaticResource MaterialDesignLightForeground}" VerticalOffset="-5" FontSize="8" StringFormat="#0.0"></components:YAxisScroll>
+ <components:YAxisTicks x:Name="yAxisTicks" SmallTickTemplate="{StaticResource graphTicksTemplate}" Width="5" SmallTicks="6" Foreground="{StaticResource MaterialDesignLightForeground}" BigTicks="10" Graph="{Binding ElementName=Graph}"></components:YAxisTicks>
+ </StackPanel>
+ </Border>
+ <Border Grid.Column="1" BorderThickness="1" BorderBrush="{StaticResource borderBrush}" Background="{DynamicResource graphBackground}" Margin="5 0 0 0">
+ <graphEx:RealTimeGraphExMultiLineErase x:Name="Graph" x:FieldModifier="public" Controller="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Controller}" Antialiased="True" RefreshRate="30" MarkerColor="{StaticResource graphsMarkerColor}" FillGraph="False" Minimum="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Minimum}" Maximum="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=Maximum}" Stroke="DodgerBlue">
+ <graphEx:RealTimeGraphExMultiLineErase.Components>
+ <components:MouseValueToolTip ToolTipTemplate="{StaticResource graphTooltipTemplate}" />
+ <components:GridLines Rows="4" Columns="6" GridBrush="{DynamicResource graphGridLinesBrush}"></components:GridLines>
+ </graphEx:RealTimeGraphExMultiLineErase.Components>
+ <graphEx:RealTimeGraphExMultiLineErase.InnerContent>
+ <Grid>
+ <Label Style="{StaticResource graphLabel}">
+ <StackPanel Orientation="Horizontal">
+ <TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=2},Path=SensorName,FallbackValue='Dispensers Motors'}"></TextBlock>
+ <TextBlock Foreground="Gray" Margin="10 0 0 0" FontFamily="Sylfaen Regular" VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=2},Path=SensorUnits,FallbackValue='(hz)'}"></TextBlock>
+ </StackPanel>
+ </Label>
+ </Grid>
+ </graphEx:RealTimeGraphExMultiLineErase.InnerContent>
+ </graphEx:RealTimeGraphExMultiLineErase>
+ </Border>
+
+ <Border Grid.Column="2" Margin="5 0 0 0" HorizontalAlignment="Right" Opacity="0.8">
+ <components:YAxisLegends VerticalAlignment="Center" Margin="0 0 5 0" Graph="{Binding ElementName=Graph}" Width="70" FlowDirection="RightToLeft" LegendTemplate="{StaticResource graphLegendTemplate}">
+ </components:YAxisLegends>
+ </Border>
+ </Grid>
+ </ContentControl>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs
new file mode 100644
index 000000000..8e3b6b6e3
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs
@@ -0,0 +1,162 @@
+using RealTimeGraphEx;
+using RealTimeGraphEx.Controllers;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.Common.Controls
+{
+ /// <summary>
+ /// Interaction logic for RealTimeGraphControl.xaml
+ /// </summary>
+ public partial class RealTimeGraphMultiControl : UserControl , IRealTimeGraph
+ {
+ private Grid headerGrid;
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets the name of the sensor.
+ /// </summary>
+ public String SensorName
+ {
+ get { return (String)GetValue(SensorNameProperty); }
+ set { SetValue(SensorNameProperty, value); }
+ }
+ public static readonly DependencyProperty SensorNameProperty =
+ DependencyProperty.Register("SensorName", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null));
+
+ /// <summary>
+ /// Gets or sets the sensor units.
+ /// </summary>
+ public String SensorUnits
+ {
+ get { return (String)GetValue(SensorUnitsProperty); }
+ set { SetValue(SensorUnitsProperty, value); }
+ }
+ public static readonly DependencyProperty SensorUnitsProperty =
+ DependencyProperty.Register("SensorUnits", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null));
+
+ public double Minimum
+ {
+ get { return (double)GetValue(MinimumProperty); }
+ set { SetValue(MinimumProperty, value); }
+ }
+ public static readonly DependencyProperty MinimumProperty =
+ DependencyProperty.Register("Minimum", typeof(double), typeof(RealTimeGraphMultiControl), new PropertyMetadata(0.0));
+
+
+
+ public double Maximum
+ {
+ get { return (double)GetValue(MaximumProperty); }
+ set { SetValue(MaximumProperty, value); }
+ }
+ public static readonly DependencyProperty MaximumProperty =
+ DependencyProperty.Register("Maximum", typeof(double), typeof(RealTimeGraphMultiControl), new PropertyMetadata(100.0));
+
+ public void InvalidateGraph()
+ {
+ InnerGraph.Clear();
+ yAxis.Render(InnerGraph);
+ yAxisTicks.Render(InnerGraph);
+ }
+
+ /// <summary>
+ /// Gets or sets the inner real-time graph control.
+ /// </summary>
+ public RealTimeGraphExBase InnerGraph { get; set; }
+
+ /// <summary>
+ /// Gets or sets the inner graph controller.
+ /// </summary>
+ public GraphControllerBase Controller { get; set; }
+
+ private bool _enableToolbar;
+ /// <summary>
+ /// Gets or sets a value indicating whether to enable toolbar buttons.
+ /// </summary>
+ public bool EnableToolBar
+ {
+ get { return _enableToolbar; }
+ set
+ {
+ _enableToolbar = value;
+
+ if (!value)
+ {
+ if (headerGrid != null)
+ {
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, -35, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Events
+
+ public event EventHandler GraphRemoveButtonPressed;
+ public event EventHandler GraphFullScreenButtonPressed;
+
+ #endregion
+
+ public RealTimeGraphMultiControl()
+ {
+ InitializeComponent();
+ EnableToolBar = true;
+ InnerGraph = Graph;
+ Controller = new GraphMultiController();
+ }
+
+ private void OnGraphFullScreen(object sender, RoutedEventArgs e)
+ {
+ GraphFullScreenButtonPressed?.Invoke(this, new EventArgs());
+ }
+
+ private void Graph_MouseEnter(object sender, MouseEventArgs e)
+ {
+ if (EnableToolBar)
+ {
+ Grid mainGrid = sender as Grid;
+ headerGrid = mainGrid.Children.OfType<Grid>().ToList().First();
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, 0, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+ }
+
+ private void Graph_MouseLeave(object sender, MouseEventArgs e)
+ {
+ Grid mainGrid = sender as Grid;
+ headerGrid = mainGrid.Children.OfType<Grid>().ToList().First();
+ ThicknessAnimation ani = new ThicknessAnimation();
+ ani.To = new Thickness(0, -35, 0, 0);
+ ani.Duration = TimeSpan.FromSeconds(0.2);
+ headerGrid.BeginAnimation(Grid.MarginProperty, ani);
+ }
+
+ private void OnGraphRemove(object sender, RoutedEventArgs e)
+ {
+ GraphRemoveButtonPressed?.Invoke(this, new EventArgs());
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/TableGrid.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/TableGrid.cs
new file mode 100644
index 000000000..07fd0c446
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/TableGrid.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Tango.MachineStudio.Common.Controls
+{
+ public class TableGrid : Grid
+ {
+ public TableGrid()
+ {
+ ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
+ ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
+ this.Loaded += TableGrid_Loaded;
+ }
+
+ private void TableGrid_Loaded(object sender, RoutedEventArgs e)
+ {
+ InvalidateGrid();
+ }
+
+ protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
+ {
+ base.OnVisualChildrenChanged(visualAdded, visualRemoved);
+ }
+
+ protected override Size ArrangeOverride(Size arrangeSize)
+ {
+ return base.ArrangeOverride(arrangeSize);
+ }
+
+ private void InvalidateGrid()
+ {
+ RowDefinitions.Clear();
+ RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Pixel) });
+
+ int currentRow = 0;
+
+ for (int i = 0; i < Children.Count; i++)
+ {
+ SetRow(Children[i], currentRow);
+
+ if (i % 2 != 0)
+ {
+ SetColumn(Children[i], 1);
+ (Children[i] as FrameworkElement).Margin = new Thickness(20, 0, 0, 0);
+ currentRow++;
+ RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Pixel) });
+ }
+
+ (Children[i] as FrameworkElement).VerticalAlignment = VerticalAlignment.Bottom;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/PointToMarginConverter.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/PointToMarginConverter.cs
index e6587b1ee..94748fb26 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/PointToMarginConverter.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/PointToMarginConverter.cs
@@ -9,8 +9,13 @@ using System.Windows.Data;
namespace Tango.MachineStudio.Common.Converters
{
+ /// <summary>
+ /// Represents a <see cref="Point"/> to <see cref="Thickness"/> binding converter.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
public class PointToMarginConverter : IValueConverter
{
+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Point p = (Point)value;
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/SecondsToGraphPointsConverter.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/SecondsToGraphPointsConverter.cs
new file mode 100644
index 000000000..17df7b9d5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Converters/SecondsToGraphPointsConverter.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace Tango.MachineStudio.Common.Converters
+{
+ /// <summary>
+ /// Converts number of seconds to graph FIFO capacity.
+ /// </summary>
+ /// <seealso cref="System.Windows.Data.IValueConverter" />
+ public class SecondsToGraphPointsConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ double arrLength = double.Parse(parameter.ToString());
+ return Helpers.GraphsHelper.GetMaxPoints(arrLength);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ return value;
+ }
+ }
+} \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/DefaultDiagnosticsFrameProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/DefaultDiagnosticsFrameProvider.cs
new file mode 100644
index 000000000..b77619ac2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/DefaultDiagnosticsFrameProvider.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.Operators;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.PMR.Diagnostics;
+
+namespace Tango.MachineStudio.Common.Diagnostics
+{
+ /// <summary>
+ /// Represents the default diagnostics frame provider.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Diagnostics.IDiagnosticsFrameProvider" />
+ public class DefaultDiagnosticsFrameProvider : IDiagnosticsFrameProvider
+ {
+ /// <summary>
+ /// Disables the frame delivery from the current connected machine and enables the manual push frame method.
+ /// </summary>
+ public bool Disable { get; set; }
+
+ /// <summary>
+ /// Occurs when a new data frame is available.
+ /// </summary>
+ public event EventHandler<PushDiagnosticsResponse> FrameReceived;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultDiagnosticsFrameProvider"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ public DefaultDiagnosticsFrameProvider(IStudioApplicationManager applicationManager)
+ {
+ applicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged;
+ }
+
+ /// <summary>
+ /// Applications the manager connected machine changed.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="machine">The machine.</param>
+ private void ApplicationManager_ConnectedMachineChanged(object sender, Integration.Services.IExternalBridgeClient machine)
+ {
+ if (machine != null)
+ {
+ (machine as MachineOperator).DiagnosticsDataAvailable += DefaultDiagnosticsFrameProvider_DiagnosticsDataAvailable;
+ }
+ }
+
+ /// <summary>
+ /// Defaults the diagnostics frame provider diagnostics data available.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="frame">The frame.</param>
+ private void DefaultDiagnosticsFrameProvider_DiagnosticsDataAvailable(object sender, PushDiagnosticsResponse frame)
+ {
+ if (!Disable)
+ {
+ OnFrameReceived(frame);
+ }
+ }
+
+ /// <summary>
+ /// Push frames manual. (Only when Disable = true)
+ /// </summary>
+ /// <param name="frame">The frame.</param>
+ public void PushFrame(PushDiagnosticsResponse frame)
+ {
+ if (Disable)
+ {
+ OnFrameReceived(frame);
+ }
+ }
+
+ /// <summary>
+ /// Raises the <see cref="FrameReceived"/> event.
+ /// </summary>
+ /// <param name="frame">The frame.</param>
+ protected virtual void OnFrameReceived(PushDiagnosticsResponse frame)
+ {
+ FrameReceived?.Invoke(this, frame);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/IDiagnosticsFrameProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/IDiagnosticsFrameProvider.cs
new file mode 100644
index 000000000..0d63b59b6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Diagnostics/IDiagnosticsFrameProvider.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.PMR.Diagnostics;
+
+namespace Tango.MachineStudio.Common.Diagnostics
+{
+ /// <summary>
+ /// Represents a tango machine diagnostics frame provider.
+ /// </summary>
+ public interface IDiagnosticsFrameProvider
+ {
+ /// <summary>
+ /// Occurs when a new data frame is available.
+ /// </summary>
+ event EventHandler<PushDiagnosticsResponse> FrameReceived;
+
+ /// <summary>
+ /// Disables the frame delivery from the current connected machine and enables the manual push frame method.
+ /// </summary>
+ bool Disable { get; set; }
+
+ /// <summary>
+ /// Push frames manual. (Only when Disable = true)
+ /// </summary>
+ /// <param name="frame">The frame.</param>
+ void PushFrame(PushDiagnosticsResponse frame);
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/IStudioMessageExtensions.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/IStudioMessageExtensions.cs
index 83183f328..7ae259e04 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/IStudioMessageExtensions.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/IStudioMessageExtensions.cs
@@ -6,8 +6,15 @@ using System.Text;
using System.Threading.Tasks;
using Tango.MachineStudio.Common.Messages;
+/// <summary>
+/// Contains <see cref="IStudioMessage"/> extension methods.
+/// </summary>
public static class IStudioMessageExtensions
{
+ /// <summary>
+ /// Sends the message.
+ /// </summary>
+ /// <param name="message">The message.</param>
public static void Send(this IStudioMessage message)
{
Messenger.Default.Send(message);
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/UserExtensions.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/UserExtensions.cs
deleted file mode 100644
index a6c98319e..000000000
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ExtensionMethods/UserExtensions.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Tango.DAL.Observables;
-
-public static class UserExtensions
-{
- public static bool HasPermission(this User user, Permissions permission)
- {
- return user.UsersRoles.Select(x => x.Role).ToList().SelectMany(x => x.RolesPermissions).ToList().Exists(x => x.Permission.Code == permission.ToInt32());
- }
-}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Fonts/digital-7.ttf b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Fonts/digital-7.ttf
new file mode 100644
index 000000000..5dbe6f908
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Fonts/digital-7.ttf
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Helpers/GraphsHelper.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Helpers/GraphsHelper.cs
new file mode 100644
index 000000000..53e832eb5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Helpers/GraphsHelper.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Settings;
+
+namespace Tango.MachineStudio.Common.Helpers
+{
+ /// <summary>
+ /// Contains RealTimeGraphEx helper methods.
+ /// </summary>
+ public static class GraphsHelper
+ {
+ /// <summary>
+ /// Gets the maximum points graph points by correlating between seconds duration from settings and expected graph points per frame.
+ /// </summary>
+ /// <param name="pointsPerFrame">Length of graph points per frame.</param>
+ /// <returns></returns>
+ public static int GetMaxPoints(double pointsPerFrame)
+ {
+ try
+ {
+ double seconds = SettingsManager.Default.MachineStudio.TechnicianModule.GraphsDuration;
+ double pullRate = SettingsManager.Default.MachineStudio.TechnicianModule.GraphsPullingInterval;
+ return (int)(((pullRate * pointsPerFrame * 10 * seconds) * (10 / pullRate)) * 0.65);
+ }
+ catch (Exception)
+ {
+ return 300;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs
index 902a45a2f..7718c0a7a 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs
@@ -5,24 +5,54 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
namespace Tango.MachineStudio.Common
{
+ /// <summary>
+ /// Represents a Machine Studio module.
+ /// </summary>
+ /// <seealso cref="System.IDisposable" />
public interface IStudioModule : IDisposable
{
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
String Name { get; }
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
String Description { get; }
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
BitmapSource Image { get; }
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
FrameworkElement MainView { get; }
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
Permissions Permission { get; }
+ /// <summary>
+ /// Gets a value indicating whether this module has been initialized.
+ /// </summary>
bool IsInitialized { get; }
+ /// <summary>
+ /// Perform any operations required to initialize this module.
+ /// </summary>
void Initialize();
+
+ /// <summary>
+ /// Sets a value indicating whether this module is loaded.
+ /// </summary>
+ bool IsLoaded { set; get; }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Messages/IStudioMessage.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Messages/IStudioMessage.cs
index 7d1232c7b..61056ab16 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Messages/IStudioMessage.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Messages/IStudioMessage.cs
@@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Common.Messages
{
+ /// <summary>
+ /// Represents an MVVM base interface for MVVM Light Messenger messages.
+ /// </summary>
public interface IStudioMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Modules/IStudioModuleLoader.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Modules/IStudioModuleLoader.cs
index d67accbc1..1fd72c53a 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Modules/IStudioModuleLoader.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Modules/IStudioModuleLoader.cs
@@ -7,12 +7,31 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Common.Modules
{
+ /// <summary>
+ /// Represents a Machine Studio <see cref="IStudioModule"/> modules loading engine.
+ /// </summary>
public interface IStudioModuleLoader
{
+ /// <summary>
+ /// Gets all loaded modules.
+ /// </summary>
ObservableCollection<IStudioModule> AllModules { get; }
+ /// <summary>
+ /// Gets all the user permitted modules.
+ /// </summary>
ObservableCollection<IStudioModule> UserModules { get; }
+ /// <summary>
+ /// Gets the studio module of type T if loaded.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns></returns>
+ T GetStudioModule<T>() where T : IStudioModule;
+
+ /// <summary>
+ /// Loads all available Machine Studio modules.
+ /// </summary>
void LoadModules();
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationManager.cs
index 631f9e2eb..4d1cbea8c 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/INavigationManager.cs
@@ -6,8 +6,15 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Common.Navigation
{
+ /// <summary>
+ /// Represents the Machine Studio views navigation manager.
+ /// </summary>
public interface INavigationManager
{
+ /// <summary>
+ /// Navigates to the specified view.
+ /// </summary>
+ /// <param name="view">The view.</param>
void NavigateTo(NavigationView view);
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs
index 77dbaf5b4..db0f0471f 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs
@@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Common.Navigation
{
+ /// <summary>
+ /// Represents the available views to navigate to using the <see cref="INavigationManager"/>.
+ /// </summary>
public enum NavigationView
{
LoadingView,
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/BarItem.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/BarItem.cs
new file mode 100644
index 000000000..d46bf5b5d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/BarItem.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Tango.Core;
+
+namespace Tango.MachineStudio.Common.Notifications
+{
+ public class BarItem : ExtendedObject, IDisposable
+ {
+ private INotificationProvider _notificationProvider;
+
+ public FrameworkElement Element { get; set; }
+
+ public BarItem(INotificationProvider notificationProvider)
+ {
+ _notificationProvider = notificationProvider;
+ }
+
+ public BarItem(INotificationProvider notificationProvider, FrameworkElement element) : this(notificationProvider)
+ {
+ Element = element;
+ }
+
+ /// <summary>
+ /// Removed this item from the queue.
+ /// </summary>
+ public void Pop()
+ {
+ _notificationProvider.PopBarItem(this);
+ }
+
+ /// <summary>
+ /// Pushes this item to the queue.
+ /// </summary>
+ public void Push()
+ {
+ _notificationProvider.PushBarItem(this);
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public void Dispose()
+ {
+ Pop();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/DialogViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/DialogViewVM.cs
index e5e4cac78..5fcd63071 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/DialogViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/DialogViewVM.cs
@@ -8,11 +8,18 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.Common.Notifications
{
+ /// <summary>
+ /// Represents a dialog view model base class.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public abstract class DialogViewVM : ViewModel
{
public event Action Accepted;
public event Action Canceled;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DialogViewVM"/> class.
+ /// </summary>
public DialogViewVM()
{
CanClose = true;
@@ -20,25 +27,39 @@ namespace Tango.MachineStudio.Common.Notifications
}
private bool _canClose;
-
+ /// <summary>
+ /// Gets or sets a value indicating whether this dialog can be closed.
+ /// </summary>
public bool CanClose
{
get { return _canClose; }
set { _canClose = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
}
+ /// <summary>
+ /// Gets or sets the close command.
+ /// </summary>
public RelayCommand CloseCommand { get; set; }
+ /// <summary>
+ /// Called when the dialog has been shown.
+ /// </summary>
public virtual void OnShow()
{
}
+ /// <summary>
+ /// Invokes the <see cref="Accepted"/> event.
+ /// </summary>
protected virtual void Accept()
{
Accepted?.Invoke();
}
+ /// <summary>
+ /// Invokes the <see cref="Canceled"/> event.
+ /// </summary>
protected virtual void Cancel()
{
Canceled?.Invoke();
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/INotificationProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/INotificationProvider.cs
index 937a39ec2..e1b6275bd 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/INotificationProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/INotificationProvider.cs
@@ -10,34 +10,135 @@ using System.Windows.Media;
namespace Tango.MachineStudio.Common.Notifications
{
+ /// <summary>
+ /// Represents the Machine Studio user notification provider responsible for displaying information, alerts and dialogs to the user.
+ /// </summary>
public interface INotificationProvider
{
+ /// <summary>
+ /// Gets the collection of active task items.
+ /// </summary>
ObservableCollection<TaskItem> TaskItems { get; }
+ /// <summary>
+ /// Gets the collection of active bar items.
+ /// </summary>
+ ObservableCollection<BarItem> BarItems { get; }
+
+ /// <summary>
+ /// Gets the current displayed task item.
+ /// </summary>
TaskItem CurrentTaskItem { get; }
+ /// <summary>
+ /// Gets a value indicating whether there are any queued task items.
+ /// </summary>
bool HasTaskItems { get; }
+ /// <summary>
+ /// Pushes the specified task item to the queue.
+ /// </summary>
+ /// <param name="taskItem">The task item.</param>
void PushTaskItem(TaskItem taskItem);
+ /// <summary>
+ /// Create and push a new task item from the specified message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <returns></returns>
TaskItem PushTaskItem(String message);
+ /// <summary>
+ /// Creates and push a new bar item from the specified framework element.
+ /// </summary>
+ /// <param name="element">The element.</param>
+ /// <returns></returns>
+ BarItem PushBarItem(FrameworkElement element);
+
+ /// <summary>
+ /// Pushes the specified bar item.
+ /// </summary>
+ /// <param name="barItem">The bar item.</param>
+ /// <returns></returns>
+ BarItem PushBarItem(BarItem barItem);
+
+ /// <summary>
+ /// Removed the specified task item from the queue.
+ /// </summary>
+ /// <param name="taskItem">The task item.</param>
void PopTaskItem(TaskItem taskItem);
+ /// <summary>
+ /// Removed the specified bar item.
+ /// </summary>
+ /// <param name="barItem">The bar item.</param>
+ void PopBarItem(BarItem barItem);
+
+ /// <summary>
+ /// Creates a new instance of the specified View type and displays it as a modal dialog.
+ /// </summary>
+ /// <typeparam name="View">The type of the view.</typeparam>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
+ /// <param name="onCancel">Cancel button callback.</param>
void ShowModalDialog<View, VM>(Action<VM> onAccept, Action onCancel) where View : FrameworkElement where VM : DialogViewVM;
+ /// <summary>
+ /// Creates a new view by a naming convention of the specified view model type.
+ /// </summary>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
+ /// <param name="onCancel">Cancel button callback.</param>
void ShowModalDialog<VM>(Action<VM> onAccept, Action onCancel) where VM : DialogViewVM;
+ /// <summary>
+ /// Creates a new view by a naming convention of the specified view model type.
+ /// </summary>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
void ShowModalDialog<VM>(Action<VM> onAccept) where VM : DialogViewVM;
- bool? ShowDialog(PackIconKind icon, Brush iconColor, String message, bool hasCancel);
+ /// <summary>
+ /// Display a message box.
+ /// </summary>
+ /// <param name="icon">The icon.</param>
+ /// <param name="iconColor">Color of the icon.</param>
+ /// <param name="message">The message.</param>
+ /// <param name="hasCancel">if set to <c>true</c> displays the cancel button.</param>
+ /// <returns></returns>
+ bool? ShowMessageBox(PackIconKind icon, Brush iconColor, String message, bool hasCancel);
+ /// <summary>
+ /// Shows an information message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
void ShowInfo(String message);
- void ShowWarnning(String message);
+ /// <summary>
+ /// Shows warning message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ void ShowWarning(String message);
+ /// <summary>
+ /// Shows an error message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
void ShowError(String message);
+ /// <summary>
+ /// Shows a question message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
bool ShowQuestion(String message);
+
+ /// <summary>
+ /// Shows a dialog with a text input field and returns the response.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <param name="hint">Text field hint.</param>
+ /// <param name="defaultResponse">Optional default response.</param>
+ /// <returns></returns>
+ String ShowTextInput(String message, String hint, String defaultResponse = null);
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/TaskItem.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/TaskItem.cs
index 0cf5e2c8e..110fbfa74 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/TaskItem.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Notifications/TaskItem.cs
@@ -7,32 +7,53 @@ using Tango.Core;
namespace Tango.MachineStudio.Common.Notifications
{
+ /// <summary>
+ /// Represents a Machine Studio "work-bar" item.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="System.IDisposable" />
public class TaskItem : ExtendedObject, IDisposable
{
private INotificationProvider _notificationProvider;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="TaskItem"/> class.
+ /// </summary>
+ /// <param name="notificationProvider">The notification provider.</param>
public TaskItem(INotificationProvider notificationProvider)
{
_notificationProvider = notificationProvider;
}
private String _message;
+ /// <summary>
+ /// Gets or sets the message.
+ /// </summary>
public String Message
{
get { return _message; }
set { _message = value; RaisePropertyChangedAuto(); }
}
+ /// <summary>
+ /// Removed this item from the queue.
+ /// </summary>
public void Pop()
{
_notificationProvider.PopTaskItem(this);
}
+ /// <summary>
+ /// Pushes this item to the queue.
+ /// </summary>
public void Push()
{
_notificationProvider.PushTaskItem(this);
}
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
public void Dispose()
{
Pop();
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Properties/AssemblyInfo.cs
index 33d6edb60..f03b250be 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Properties/AssemblyInfo.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Properties/AssemblyInfo.cs
@@ -15,3 +15,6 @@ using System.Windows;
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
+
+//Friends With
+[assembly: InternalsVisibleTo("Tango.MachineStudio.UI")]
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/GradientOffsetSlider.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/GradientOffsetSlider.xaml
new file mode 100644
index 000000000..28d29a727
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/GradientOffsetSlider.xaml
@@ -0,0 +1,83 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="clr-namespace:Tango.MachineStudio.Common.Resources"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes">
+
+
+ <Style x:Key="SliderRepeatButton" TargetType="RepeatButton">
+ <Setter Property="SnapsToDevicePixels" Value="true" />
+ <Setter Property="OverridesDefaultStyle" Value="true" />
+ <Setter Property="IsTabStop" Value="false" />
+ <Setter Property="Focusable" Value="false" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="RepeatButton">
+ <Border BorderThickness="1" BorderBrush="#8A8A8A" Background="#8A8A8A" Height="3"/>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="SliderRepeatButton1" TargetType="RepeatButton">
+ <Setter Property="SnapsToDevicePixels" Value="true" />
+ <Setter Property="OverridesDefaultStyle" Value="true" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="RepeatButton">
+ <Border SnapsToDevicePixels="True" Background="#7F7F7F" BorderThickness="1" BorderBrush="#777777" Height="3"/>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="SliderThumb" TargetType="Thumb">
+ <Setter Property="SnapsToDevicePixels" Value="true" />
+ <Setter Property="OverridesDefaultStyle" Value="true" />
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="Margin" Value="-11 -20 0 0"></Setter>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Thumb">
+ <Canvas>
+ <materialDesign:PackIcon Kind="MapMarker" Width="24" Background="Transparent" Height="24" IsHitTestVisible="True" Margin="0 0 0 0" />
+ </Canvas>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <ControlTemplate x:Key="Slider" TargetType="Slider">
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Track Grid.Row="1" x:Name="PART_Track" >
+ <Track.DecreaseRepeatButton>
+ <RepeatButton Style="{StaticResource SliderRepeatButton1}" Command="Slider.DecreaseLarge" />
+ </Track.DecreaseRepeatButton>
+ <Track.Thumb>
+ <Thumb Style="{StaticResource SliderThumb}" />
+ </Track.Thumb>
+ <Track.IncreaseRepeatButton>
+ <RepeatButton Style="{StaticResource SliderRepeatButton}" Command="Slider.IncreaseLarge" />
+ </Track.IncreaseRepeatButton>
+ </Track>
+ </Grid>
+ </ControlTemplate>
+
+ <Style x:Key="GradientOffsetSlider" TargetType="Slider">
+ <Setter Property="Focusable" Value="False"/>
+ <Setter Property="SnapsToDevicePixels" Value="true" />
+ <Setter Property="OverridesDefaultStyle" Value="true" />
+ <Style.Triggers>
+ <Trigger Property="Orientation" Value="Horizontal">
+ <Setter Property="MinHeight" Value="21" />
+ <Setter Property="MinWidth" Value="104" />
+ <Setter Property="Template" Value="{StaticResource Slider}" />
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+
+</ResourceDictionary> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml
index 58bb9ef34..ca0685f3c 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml
@@ -1,7 +1,9 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters;assembly=MaterialDesignThemes.Wpf"
+ xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters;assembly=MaterialDesignThemes.Wpf"
xmlns:editors="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete"
+ xmlns:dragAndDrop="clr-namespace:Tango.DragAndDrop;assembly=Tango.DragAndDrop"
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:Tango.MachineStudio.Common.Resources">
<ResourceDictionary.MergedDictionaries>
<!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
@@ -43,6 +45,7 @@
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/materialdesigntheme.ProgressBar.xaml"/>
+ <ResourceDictionary Source="GradientOffsetSlider.xaml" />
<!--MahApps Brushes-->
<ResourceDictionary>
@@ -62,6 +65,11 @@
<SolidColorBrush x:Key="IdealForegroundColorBrush" Color="{DynamicResource Primary500Foreground}" />
<SolidColorBrush x:Key="IdealForegroundDisabledBrush" Color="{DynamicResource Primary500}" Opacity="0.4" />
</ResourceDictionary>
+
+ <!--Fonts-->
+ <ResourceDictionary>
+ <FontFamily x:Key="digital-7">../Fonts/#digital-7</FontFamily>
+ </ResourceDictionary>
<!--Styles-->
<ResourceDictionary>
@@ -172,6 +180,302 @@
</Setter.Value>
</Setter>
</Style>
+
+
+ <!--Extensions-->
+
+ <FontFamily x:Key="FontName">Segoe UI</FontFamily>
+ <FontFamily x:Key="NotesFont">Lucida Console</FontFamily>
+
+ <sys:Double x:Key="ExtraExtraLargeFontSize">28</sys:Double>
+ <sys:Double x:Key="ExtraLargeFontSize">26</sys:Double>
+ <sys:Double x:Key="LargeFontSize">20</sys:Double>
+ <sys:Double x:Key="MediumFontSize">16</sys:Double>
+ <sys:Double x:Key="SmallFontSize">14</sys:Double>
+ <sys:Double x:Key="MiniFontSize">12</sys:Double>
+ <sys:Double x:Key="TinyFontSize">9</sys:Double>
+
+ <!--Colors-->
+ <Color x:Key="borderColor">Silver</Color>
+ <Color x:Key="graphGridLinesColor">#FFE9E9E9</Color>
+ <Color x:Key="graphsMarkerColor">Gray</Color>
+ <Color x:Key="materialColor">#03A9F4</Color>
+
+ <!--Brushes-->
+ <SolidColorBrush x:Key="borderBrush" Color="{StaticResource borderColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="BlackBrush" Color="#545454"></SolidColorBrush>
+
+ <SolidColorBrush x:Key="graphGridLinesLightBrush" Color="{StaticResource graphGridLinesColor}"></SolidColorBrush>
+ <SolidColorBrush x:Key="graphGridLinesDarkBrush" Color="#FF2E2E2E"></SolidColorBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundLight">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackgroundDark">
+ <GradientStop Color="Black"/>
+ <GradientStop Color="#FF333333" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphBackground">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFE9E9E9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLabelBackground" Opacity="0.7">
+ <GradientStop Color="White"/>
+ <GradientStop Color="#FFD9D9D9" Offset="1"/>
+ </LinearGradientBrush>
+
+ <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="graphLegendBackground" Opacity="0.7">
+ <GradientStop Color="#FFE9E9E9"/>
+ <GradientStop Color="#FFBDBDBD" Offset="1"/>
+ </LinearGradientBrush>
+
+ <SolidColorBrush Color="#FFF1F1F1" x:Key="topBarBackgroundBrush"></SolidColorBrush>
+ <!--Brushes-->
+
+ <!--Graph Label-->
+ <Style x:Key="graphLabel" TargetType="Label">
+ <Style.Setters>
+ <Setter Property="IsHitTestVisible" Value="False"></Setter>
+ <Setter Property="Margin" Value="-1 -1 0 0"></Setter>
+ <Setter Property="HorizontalAlignment" Value="Left"></Setter>
+ <Setter Property="VerticalAlignment" Value="Top"></Setter>
+ <Setter Property="Padding" Value="0"></Setter>
+ <Setter Property="ContentTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <Border Width="Auto" Padding="0 0 20 0" Height="25" BorderBrush="{StaticResource AccentColorBrush}" BorderThickness="1" CornerRadius="0 0 30 0" Background="{StaticResource graphLabelBackground}" >
+ <Label Margin="5 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="{StaticResource TinyFontSize}" Content="{Binding}"></Label>
+ </Border>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+ <!--Graph Label-->
+
+
+ <!--Graph Ticks Template-->
+ <DataTemplate x:Key="graphTicksTemplate">
+ <Ellipse Width="3" Height="3" Margin="0 0 0 0" Fill="{StaticResource AccentColorBrush}"></Ellipse>
+ </DataTemplate>
+ <!--Graph Ticks Template-->
+
+ <DataTemplate x:Key="graphTooltipTemplate">
+ <Border CornerRadius="5" BorderThickness="1" BorderBrush="White" Padding="8" MinWidth="50" Margin="20 0 20 0">
+ <Border.Background>
+ <SolidColorBrush Color="Black" Opacity="0.5"></SolidColorBrush>
+ </Border.Background>
+ <TextBlock Foreground="White" FontSize="10" HorizontalAlignment="Center" TextAlignment="Center" Text="{Binding StringFormat='0.000'}"></TextBlock>
+ </Border>
+ </DataTemplate>
+
+ <!--Graph Legend Template-->
+ <DataTemplate x:Key="graphLegendTemplate">
+ <Border Width="20" Height="20" Margin="2">
+ <Grid>
+ <ToggleButton IsChecked="{Binding IsVisible}" Padding="0" Margin="0" Background="Transparent" BorderBrush="{x:Null}" BorderThickness="0">
+ <ToggleButton.Style>
+ <Style TargetType="ToggleButton">
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate>
+ <Grid Background="Transparent">
+ <Grid>
+ <Ellipse HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Fill="{StaticResource graphLegendBackground}" StrokeThickness="1">
+ <Ellipse.Style>
+ <Style TargetType="Ellipse">
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsVisible}" Value="True">
+ <Setter Property="Stroke" Value="{Binding Stroke}"></Setter>
+ </DataTrigger>
+ <DataTrigger Binding="{Binding IsVisible}" Value="False">
+ <Setter Property="Stroke" Value="Transparent"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Ellipse.Style>
+ </Ellipse>
+ <TextBlock FontSize="8" Text="{Binding Name}" VerticalAlignment="Center" Foreground="Black" FontWeight="DemiBold" HorizontalAlignment="Center"></TextBlock>
+ </Grid>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </ToggleButton.Style>
+ </ToggleButton>
+ </Grid>
+ </Border>
+ </DataTemplate>
+ <!--Graph Legend Template-->
+
+
+ <Style TargetType="{x:Type ListBoxItem}" x:Key="basicListBoxItem">
+ <Setter Property="Background" Value="Transparent"/>
+ <Setter Property="BorderThickness" Value="0"></Setter>
+ <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
+ <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
+ <Setter Property="Padding" Value="0"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="{x:Type ListBoxItem}">
+ <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0" Background="{TemplateBinding Background}" Padding="0" SnapsToDevicePixels="true">
+ <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+ </Border>
+ <ControlTemplate.Triggers>
+ <Trigger Property="IsSelected" Value="true">
+ <Setter Property="Background" TargetName="Bd" Value="Transparent"/>
+ </Trigger>
+ <MultiTrigger>
+ <MultiTrigger.Conditions>
+ <Condition Property="IsSelected" Value="true"/>
+ <Condition Property="Selector.IsSelectionActive" Value="false"/>
+ </MultiTrigger.Conditions>
+ <Setter Property="Background" TargetName="Bd" Value="Transparent"/>
+ </MultiTrigger>
+ <Trigger Property="IsEnabled" Value="false">
+ <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
+ </Trigger>
+ </ControlTemplate.Triggers>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <PathGeometry x:Key="CirclePath">M46.615 402.03c6.549 9.313 13.718 18.176 21.456 26.528l23.472-21.728c-6.767-7.3-13.038-15.045-18.768-23.184 L46.615 402.03z M32.007 254.83c0.178-112.07 83.047-206.811 194.096-221.904l-4.192-31.728C81.787 20.041-16.53 148.91 2.314 289.033 c3.942 29.31 12.932 57.716 26.573 83.957l28.368-14.784C40.563 326.311 31.897 290.828 32.007 254.83z M92.807 452.03c8.765 7.252 17.995 13.923 27.632 19.968l16.976-27.2c-8.448-5.292-16.535-11.139-24.208-17.504 L92.807 452.03z M361.761 21.742c-22.756-10.308-46.898-17.229-71.658-20.544l-4.192 31.728 c122.555 16.88 208.221 129.915 191.341 252.469C462.017 396.001 367.656 478.501 256.007 478.83 c-31.831 0.078-63.306-6.694-92.288-19.856l-13.216 29.152c128.788 58.337 280.484 1.225 338.821-127.563 C547.661 231.775 490.549 80.079 361.761 21.742z</PathGeometry>
+
+ <Style TargetType="ContentControl" x:Key="numberBorder">
+ <Style.Setters>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ContentControl">
+ <Grid>
+ <Viewbox>
+ <Path Data="{StaticResource CirclePath}" Fill="{TemplateBinding Foreground}"></Path>
+ </Viewbox>
+ <ContentPresenter Content="{TemplateBinding Content}" />
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style.Setters>
+ </Style>
+
+ <Style x:Key="emptyToggleButton" TargetType="ToggleButton">
+ <Setter Property="Background" Value="Transparent" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="ToggleButton">
+ <Grid Background="{TemplateBinding Background}">
+ <ContentPresenter />
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="emptyButton" TargetType="Button">
+ <Setter Property="Background" Value="Transparent" />
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <Grid Background="{TemplateBinding Background}">
+ <ContentPresenter />
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+
+ <!--Drag & Drop-->
+ <Style x:Key="draggableGrid" TargetType="Grid">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Draggable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.DraggingSurface" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}"></Setter>
+ </Style>
+
+ <Style x:Key="droppableGrid" TargetType="Grid">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Droppable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.DraggingSurface" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}"></Setter>
+ <Style.Triggers>
+ <Trigger Property="dragAndDrop:DragAndDropService.IsDraggableOver" Value="True">
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ <Trigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.EnterActions>
+ <Trigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.ExitActions>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+
+ <Style x:Key="draggableDroppableGrid" TargetType="Grid">
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
+ <Setter Property="Background" Value="Transparent"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Draggable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.Droppable" Value="True"></Setter>
+ <Setter Property="dragAndDrop:DragAndDropService.DraggingSurface" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}"></Setter>
+ <Style.Triggers>
+ <Trigger Property="dragAndDrop:DragAndDropService.IsDraggableOver" Value="True">
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ <Trigger.EnterActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="0.95" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.EnterActions>
+ <Trigger.ExitActions>
+ <BeginStoryboard>
+ <Storyboard>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleX"></DoubleAnimation>
+ <DoubleAnimation To="1" Duration="00:00:0.2" Storyboard.TargetProperty="RenderTransform.ScaleY"></DoubleAnimation>
+ </Storyboard>
+ </BeginStoryboard>
+ </Trigger.ExitActions>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+ <!--Drag & Drop-->
+
+ <!--Extensions-->
+
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IModuleRequestListener.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IModuleRequestListener.cs
new file mode 100644
index 000000000..b950d7bcd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IModuleRequestListener.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Common.StudioApplication
+{
+ /// <summary>
+ /// Represents a type which will be notified when a new module request was made by <see cref="IStudioApplicationManager.RequestModule(string, object)"/>
+ /// </summary>
+ public interface IModuleRequestListener
+ {
+ /// <summary>
+ /// Called when the request has been made.
+ /// </summary>
+ /// <param name="module">The module instance.</param>
+ /// <param name="args">The arguments.</param>
+ void OnRequestModule(IStudioModule module, Object args);
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownListener.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownListener.cs
new file mode 100644
index 000000000..1ca5a7df2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownListener.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Common.StudioApplication
+{
+ /// <summary>
+ /// Used to notify view models about application terminating.
+ /// </summary>
+ public interface IShutdownListener
+ {
+ /// <summary>
+ /// Called when the application is about to terminate.
+ /// </summary>
+ void OnShuttingDown();
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownRequestBlocker.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownRequestBlocker.cs
index a157bd598..4d5f968a4 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownRequestBlocker.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IShutdownRequestBlocker.cs
@@ -6,8 +6,16 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.Common.StudioApplication
{
+ /// <summary>
+ /// Represents a component capable of receiving notification for when the Machine Studio shuts down.
+ /// The component can perform it's own shutdown operations, or cancel the current shutdown operation.
+ /// </summary>
public interface IShutdownRequestBlocker
{
+ /// <summary>
+ /// Called when the application is shutting down.
+ /// </summary>
+ /// <returns></returns>
Task<bool> OnShutdownRequest();
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs
index 42f4f7b65..c67c34044 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs
@@ -7,12 +7,46 @@ using Tango.Integration.Services;
namespace Tango.MachineStudio.Common.StudioApplication
{
+ /// <summary>
+ /// Represents the Machine Studio application manager.
+ /// </summary>
public interface IStudioApplicationManager
{
- bool IsShuttingDown { get;}
+ /// <summary>
+ /// Occurs when the connected machine property has changed.
+ /// </summary>
+ event EventHandler<IExternalBridgeClient> ConnectedMachineChanged;
+
+ /// <summary>
+ /// Gets a value indicating whether Machine Studio is shutting down.
+ /// </summary>
+ bool IsShuttingDown { get; }
+
+ /// <summary>
+ /// Shutdown the application.
+ /// </summary>
void ShutDown();
+
+ /// <summary>
+ /// Gets or sets the currently connected machine if any.
+ /// </summary>
IExternalBridgeClient ConnectedMachine { get; set; }
+
+ /// <summary>
+ /// Gets a value indicating whether the <see cref="ConnectedMachine"/> is valid.
+ /// </summary>
bool IsMachineConnected { get; }
- bool IsMachineConnectedViaTCP { get; }
+
+ /// <summary>
+ /// Gets a value indicating whether the <see cref="ConnectedMachine"/> is valid and connected through TCP/IP.
+ /// </summary>
+ bool IsMachineConnectedViaTCP { get; }
+
+ /// <summary>
+ /// Loads the specified module if permitted.
+ /// </summary>
+ /// <param name="moduleName">Name of the module.</param>
+ /// <param name="args">The arguments.</param>
+ void RequestModule(String moduleName, Object args);
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs
new file mode 100644
index 000000000..5c594ab70
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs
@@ -0,0 +1,113 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using Tango.Integration.Observables;
+
+namespace Tango.MachineStudio.Common
+{
+ /// <summary>
+ /// Represents a base class for studio modules.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" />
+ public abstract class StudioModuleBase : IStudioModule
+ {
+ private bool _isInitialized;
+ private bool _isLoaded;
+
+ /// <summary>
+ /// Occurs when the user has navigated into or out of this module.
+ /// </summary>
+ public event EventHandler<bool> IsLoadedChanged;
+
+ /// <summary>
+ /// Gets the module name.
+ /// </summary>
+ public abstract string Name { get; }
+
+ /// <summary>
+ /// Gets the module description.
+ /// </summary>
+ public abstract string Description { get; }
+
+ /// <summary>
+ /// Gets the module cover image.
+ /// </summary>
+ public abstract BitmapSource Image { get; }
+
+ /// <summary>
+ /// Gets the module entry point view.
+ /// </summary>
+ public abstract FrameworkElement MainView { get; }
+
+ /// <summary>
+ /// Gets the permission required to see and load this module.
+ /// </summary>
+ public abstract Permissions Permission { get; }
+
+ /// <summary>
+ /// Gets a value indicating whether this module has been initialized.
+ /// </summary>
+ public bool IsInitialized
+ {
+ get
+ {
+ return _isInitialized;
+ }
+ private set
+ {
+ _isInitialized = value;
+ }
+ }
+
+ /// <summary>
+ /// Sets a value indicating whether this module is loaded.
+ /// </summary>
+ public bool IsLoaded
+ {
+ get
+ {
+ return _isLoaded;
+ }
+ set
+ {
+ _isLoaded = value;
+ IsLoadedChanged?.Invoke(this, value);
+ }
+ }
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public abstract void Dispose();
+
+ /// <summary>
+ /// Perform any operations required to initialize this module.
+ /// </summary>
+ public void Initialize()
+ {
+ OnInitialized();
+ IsInitialized = true;
+ }
+
+ /// <summary>
+ /// Called when machine studio initializes this module.
+ /// </summary>
+ protected virtual void OnInitialized()
+ {
+
+ }
+
+ /// <summary>
+ /// Raises the <see cref="IsLoadedChanged"/> event.
+ /// </summary>
+ /// <param name="loaded">if set to <c>true</c> the module is loaded.</param>
+ protected virtual void OnLoadedChanged(bool loaded)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj
index 49fee31f1..cd4fc1aeb 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj
@@ -71,13 +71,38 @@
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Controls\HiveColorPickerControl.xaml.cs">
+ <DependentUpon>HiveColorPickerControl.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\IRealTimeGraph.cs" />
+ <Compile Include="Controls\RealTimeGraphMultiControl.xaml.cs">
+ <DependentUpon>RealTimeGraphMultiControl.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\RealTimeGraphControl.xaml.cs">
+ <DependentUpon>RealTimeGraphControl.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\TableGrid.cs" />
+ <Compile Include="Converters\SecondsToGraphPointsConverter.cs" />
+ <Compile Include="Diagnostics\DefaultDiagnosticsFrameProvider.cs" />
+ <Compile Include="Diagnostics\IDiagnosticsFrameProvider.cs" />
+ <Compile Include="Helpers\GraphsHelper.cs" />
+ <Compile Include="Notifications\BarItem.cs" />
<Compile Include="Notifications\DialogViewVM.cs" />
+ <Compile Include="StudioApplication\IModuleRequestListener.cs" />
+ <Compile Include="StudioApplication\IShutdownListener.cs" />
<Compile Include="StudioApplication\IStudioApplicationManager.cs" />
<Compile Include="StudioApplication\IShutdownRequestBlocker.cs" />
<Compile Include="ExtensionMethods\IStudioMessageExtensions.cs" />
<Compile Include="Messages\IStudioMessage.cs" />
<Compile Include="Notifications\TaskItem.cs" />
+ <Compile Include="StudioModuleBase.cs" />
<Compile Include="ValidationRules\Required.cs" />
+ <Compile Include="Video\DefaultVideoCaptureProvider.cs" />
+ <Compile Include="Video\IVideoCaptureProvider.cs" />
+ <Page Include="Controls\HiveColorPickerControl.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Controls\MdiContainerControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -91,12 +116,23 @@
<DependentUpon>MdiContainerControl.xaml</DependentUpon>
</Compile>
<Compile Include="Converters\PointToMarginConverter.cs" />
- <Compile Include="ExtensionMethods\UserExtensions.cs" />
<Compile Include="IStudioModule.cs" />
<Compile Include="Modules\IStudioModuleLoader.cs" />
<Compile Include="Navigation\INavigationManager.cs" />
<Compile Include="Navigation\NavigationView.cs" />
<Compile Include="Notifications\INotificationProvider.cs" />
+ <Page Include="Controls\RealTimeGraphMultiControl.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Controls\RealTimeGraphControl.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Resources\GradientOffsetSlider.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Resources\MaterialDesign.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -121,6 +157,7 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
+ <Resource Include="Fonts\digital-7.ttf" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
@@ -128,30 +165,58 @@
</None>
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\..\SideChains\RealTimeGraphEx\RealTimeGraphEx.csproj">
+ <Project>{b9ae25d6-be35-492f-9079-21a7f3e6f7cc}</Project>
+ <Name>RealTimeGraphEx</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\SideChains\Tango.AutoComplete\Tango.AutoComplete.csproj">
<Project>{bb2abb74-ba58-4812-83aa-ec8171f42df4}</Project>
<Name>Tango.AutoComplete</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.ColorPicker\Tango.ColorPicker.csproj">
+ <Project>{a2f5af44-29ff-45d6-9d25-ecda5cce88b5}</Project>
+ <Name>Tango.ColorPicker</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj">
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
<Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
<Name>Tango.DAL.Remote</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.DragAndDrop\Tango.DragAndDrop.csproj">
+ <Project>{b112d89a-a106-41ae-a0c1-4abc84c477f5}</Project>
+ <Name>Tango.DragAndDrop</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.Editors\Tango.Editors.csproj">
+ <Project>{de2f2b86-025b-4f26-83a4-38bd48224ed5}</Project>
+ <Name>Tango.Editors</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Integration\Tango.Integration.csproj">
<Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project>
<Name>Tango.Integration</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.PMR\Tango.PMR.csproj">
+ <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project>
+ <Name>Tango.PMR</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.Settings\Tango.Settings.csproj">
+ <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project>
+ <Name>Tango.Settings</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.SharedUI\Tango.SharedUI.csproj">
<Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
<Name>Tango.SharedUI</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.Transport\Tango.Transport.csproj">
+ <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
+ <Name>Tango.Transport</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.Video\Tango.Video.csproj">
+ <Project>{9652f972-2bd1-4283-99cb-fc6240434c17}</Project>
+ <Name>Tango.Video</Name>
+ </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ValidationRules/Required.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ValidationRules/Required.cs
index 84f274965..aac00fdf1 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ValidationRules/Required.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/ValidationRules/Required.cs
@@ -8,8 +8,20 @@ using System.Windows.Controls;
namespace Tango.MachineStudio.Common.ValidationRules
{
+ /// <summary>
+ /// Represents a required field validation rule.
+ /// </summary>
+ /// <seealso cref="System.Windows.Controls.ValidationRule" />
public class Required : ValidationRule
{
+ /// <summary>
+ /// When overridden in a derived class, performs validation checks on a value.
+ /// </summary>
+ /// <param name="value">The value from the binding target to check.</param>
+ /// <param name="cultureInfo">The culture to use in this rule.</param>
+ /// <returns>
+ /// A <see cref="T:System.Windows.Controls.ValidationResult" /> object.
+ /// </returns>
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return new ValidationResult(!String.IsNullOrWhiteSpace(value.ToStringSafe()), "Required");
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/DefaultVideoCaptureProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/DefaultVideoCaptureProvider.cs
new file mode 100644
index 000000000..3aa9d4c88
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/DefaultVideoCaptureProvider.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Video.DirectCapture;
+
+namespace Tango.MachineStudio.Common.Video
+{
+ /// <summary>
+ /// Represents the default implementation of <see cref="IVideoCaptureProvider"/>.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Video.IVideoCaptureProvider" />
+ public class DefaultVideoCaptureProvider : IVideoCaptureProvider
+ {
+ /// <summary>
+ /// Gets the available capture devices.
+ /// </summary>
+ public ObservableCollection<CaptureDevice> AvailableCaptureDevices { get; private set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultVideoCaptureProvider"/> class.
+ /// </summary>
+ public DefaultVideoCaptureProvider()
+ {
+ AvailableCaptureDevices = new ObservableCollection<CaptureDevice>();
+
+ var availableDevices = CaptureDevice.GetAvailableCaptureDevices();
+
+ for (int i = 0; i < 3; i++)
+ {
+ if (i > availableDevices.Count - 1)
+ {
+ AvailableCaptureDevices.Add(new CaptureDevice() { Device = null });
+ }
+ else
+ {
+ AvailableCaptureDevices.Add(new CaptureDevice() { Device = availableDevices[i] });
+ }
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/IVideoCaptureProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/IVideoCaptureProvider.cs
new file mode 100644
index 000000000..cd797dce2
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Video/IVideoCaptureProvider.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Video.DirectCapture;
+
+namespace Tango.MachineStudio.Common.Video
+{
+ /// <summary>
+ /// Represents a video capturing device provider.
+ /// </summary>
+ public interface IVideoCaptureProvider
+ {
+ /// <summary>
+ /// Gets the available capture devices.
+ /// </summary>
+ ObservableCollection<CaptureDevice> AvailableCaptureDevices { get; }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Installer/Tango.MachineStudio.Installer.vdproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Installer/Tango.MachineStudio.Installer.vdproj
new file mode 100644
index 000000000..e07a3a884
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Installer/Tango.MachineStudio.Installer.vdproj
@@ -0,0 +1,8338 @@
+"DeployProject"
+{
+"VSVersion" = "3:800"
+"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:Tango.MachineStudio.Installer"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+ "Hierarchy"
+ {
+ "Entry"
+ {
+ "MsmKey" = "8:_00AB5F4CB0B9DCC466359F8589533B68"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_00AB5F4CB0B9DCC466359F8589533B68"
+ "OwnerKey" = "8:_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_032C05575B795D1CAEDD5105F1520FBB"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_04D23F89470123BB32E04152B3DA36A5"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0B4B393563808E508848ED965CF47AEE"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_136196DD2763419D959721C2BA143498"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_13803D82858878E2D3953D4742A1A596"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_13803D82858878E2D3953D4742A1A596"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_13803D82858878E2D3953D4742A1A596"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_14CF2DBBA5462C65F94A9137DCE014F9"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_173C4B05CE04BA34E920DC64B25A8670"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AC47588060EAA9F2B7A13EC07359D10"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AC47588060EAA9F2B7A13EC07359D10"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AC47588060EAA9F2B7A13EC07359D10"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AC47588060EAA9F2B7A13EC07359D10"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AF921770726F808CD12907CBE271CB0"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AF921770726F808CD12907CBE271CB0"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AF921770726F808CD12907CBE271CB0"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1AF921770726F808CD12907CBE271CB0"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_20F7C5A192304AF349FFA1FC8741471D"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_20F7C5A192304AF349FFA1FC8741471D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_20F7C5A192304AF349FFA1FC8741471D"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2444D22B50272EAE03F2B5D2457335EC"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2444D22B50272EAE03F2B5D2457335EC"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2444D22B50272EAE03F2B5D2457335EC"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2444D22B50272EAE03F2B5D2457335EC"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_244F067B77DB6F9852E2286427480A18"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2589A08E4AC51C4B69842E948EFC87DB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2589A08E4AC51C4B69842E948EFC87DB"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2589A08E4AC51C4B69842E948EFC87DB"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2589A08E4AC51C4B69842E948EFC87DB"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_26BF1219019A4367BA3497A5899C05B1"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_283F49175556E95BE98A7C8600F4030B"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_2FA2B573783C66016BCED4EA9D33E5B6"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_33C8144311EC5FA3E39D6B7EBB8FBC78"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_33C8144311EC5FA3E39D6B7EBB8FBC78"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_359F09B8EC59D6FC1859EFF3D2274920"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_359F09B8EC59D6FC1859EFF3D2274920"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_39C2ACA7C5003F7A39323635C3B4B924"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3B351F730871D9CC74A40D74B6C6E61A"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3C71904C35BED6686835B5A1C74768BE"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3C71904C35BED6686835B5A1C74768BE"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3C71904C35BED6686835B5A1C74768BE"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_3E6534AA37C9012ED3BDF4DCB02EFDB6"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "OwnerKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_448EC30219E98C0B91ABF43C7D4F223F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4672E56FCA5A7523E491A1DF92B58426"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4672E56FCA5A7523E491A1DF92B58426"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4672E56FCA5A7523E491A1DF92B58426"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4A5E77F2FEA9C4080C8FD63B968FBE6C"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4E399A139695EBD13928A80C850A7E9D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_8D3497DF2885B15B643A20537C75D67E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_709D007D7E89A10E63C141E3A08311FD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "OwnerKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51F95A8D4A956260EFCD558FA4BEE2F4"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_51F95A8D4A956260EFCD558FA4BEE2F4"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_55B682D249F24BD9069F5CC33AAB44F0"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_55D25B13F818972AA7BF22C7264EBB19"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5747A410B7984793A0F6D9121679C6F3"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_E700A1A13A5B6DB314933FC1205AFDAB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5D31D40A55F64C363A1DE193E24D604B"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5D31D40A55F64C363A1DE193E24D604B"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5D31D40A55F64C363A1DE193E24D604B"
+ "OwnerKey" = "8:_69CC8DD07F81DD7EA883434F53157FBC"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5DAE745CD40555B469B53E8DB8A5D7DA"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_5DAE745CD40555B469B53E8DB8A5D7DA"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_62EC6F0F04E5435ABCC0479D48BEBE1B"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_637E851F9FB315C0C0E9FD781D57341F"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_90D408142B1F2A9F72CBF42FC38348F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "OwnerKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69CC8DD07F81DD7EA883434F53157FBC"
+ "OwnerKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69CC8DD07F81DD7EA883434F53157FBC"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_E700A1A13A5B6DB314933FC1205AFDAB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "OwnerKey" = "8:_F1DFFB8E50BAD2529B0C859268ED8956"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_709D007D7E89A10E63C141E3A08311FD"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "OwnerKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_7A0D754929705CC64EF84E26BD75D642"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_7A0D754929705CC64EF84E26BD75D642"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_7E765F76FDFC3DCF4EAEB59B5546B063"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_847DE93907D7F6B17C0694F74120086B"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_873B6D0FDF23828BEF4F97FA21EAB767"
+ "OwnerKey" = "8:_4A5E77F2FEA9C4080C8FD63B968FBE6C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_873B6D0FDF23828BEF4F97FA21EAB767"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_873B6D0FDF23828BEF4F97FA21EAB767"
+ "OwnerKey" = "8:_55B682D249F24BD9069F5CC33AAB44F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "OwnerKey" = "8:_55B682D249F24BD9069F5CC33AAB44F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_896E731F0FFC039A04E0A4482B3FED1F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89CE1C8A864B36E2C7FFCCB0015DD78A"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_89CE1C8A864B36E2C7FFCCB0015DD78A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8D3497DF2885B15B643A20537C75D67E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8D3497DF2885B15B643A20537C75D67E"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_8D3497DF2885B15B643A20537C75D67E"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_90C6EB30636F05FB3DFD7C943DC16EAC"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_90D408142B1F2A9F72CBF42FC38348F0"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_90D408142B1F2A9F72CBF42FC38348F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_983D79DC449AD65746DD38E6468BD886"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_98D5175644A3BC174BCA498A1B20FF84"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9CCA52D51EEDBFE9F9794A8ACD30D5D9"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A0C8023CFDF8E1966A878020945346CF"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1336C0121F3132E09400329ACD12B30"
+ "OwnerKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1336C0121F3132E09400329ACD12B30"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1336C0121F3132E09400329ACD12B30"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A1336C0121F3132E09400329ACD12B30"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A35B706F66B9C77B3D87D7B0FF53D652"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A7976B20CB4BFC0F5C8BE15430B6005E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A7976B20CB4BFC0F5C8BE15430B6005E"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A7976B20CB4BFC0F5C8BE15430B6005E"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A8CAAF0845B31C55C0C40E212F6C7D65"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A8CAAF0845B31C55C0C40E212F6C7D65"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_A8CAAF0845B31C55C0C40E212F6C7D65"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AB0E0C1990036EFBAC9C728A9902D668"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AC22B81E0F8A0CB4C79C8B878F2D1BCF"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AF79FC974C2F42D24D74E5313E475E87"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AF79FC974C2F42D24D74E5313E475E87"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AF79FC974C2F42D24D74E5313E475E87"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_AF79FC974C2F42D24D74E5313E475E87"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B5EF2444BE89A32E5FE026C4A5018FAD"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B5EF2444BE89A32E5FE026C4A5018FAD"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_B8EE1FC78F28FD0B62389E8796D603FB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C179B63E2F5A58786B70FADA6C8496A5"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_C6BFB4DAD78C1798616508141EF1234E"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CBF3A46BFE914D8E4658EABB5A204074"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CBF3A46BFE914D8E4658EABB5A204074"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CC7BD04781686DE3403908303698199D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CCD49B330E05F963B5AE73E3D04F5762"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CDE626AD60FD216A79A42FF0C1FA037D"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CDE626AD60FD216A79A42FF0C1FA037D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D0CFB25F1239503E9FE3881A033B3110"
+ "OwnerKey" = "8:_00AB5F4CB0B9DCC466359F8589533B68"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D0CFB25F1239503E9FE3881A033B3110"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3EF38D40E0CBE1BD391303952B0493E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3EF38D40E0CBE1BD391303952B0493E"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D3EF38D40E0CBE1BD391303952B0493E"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D48D475C8BD232C2AC87A2A7C6CCA53D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D8A84B2F626300DA2E9147709713E9CB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "OwnerKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DB4A94107FB1929721E56ED40844F276"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DC627D829804D2AC4A3984133840F2D5"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "OwnerKey" = "8:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD77D7B58FFDC37F83D85D632BEC9DC4"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DD77D7B58FFDC37F83D85D632BEC9DC4"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DE3FACD5F197D2E261A0C6B32E0D1CAC"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0573A6D7543083D0A5654271DF50643"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_9EE464FC4C8FCD72BCAA46095DD85257"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_89624A3865EAD179277FE5905CBE627D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "OwnerKey" = "8:_036933210F6D8ADC298F5A996490268D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E700A1A13A5B6DB314933FC1205AFDAB"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_E700A1A13A5B6DB314933FC1205AFDAB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB38C1BD04FDFE44579B9868D6D1E139"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB38C1BD04FDFE44579B9868D6D1E139"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB38C1BD04FDFE44579B9868D6D1E139"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_ED524252AD28281FAE5468349D0E5797"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_ED524252AD28281FAE5468349D0E5797"
+ "OwnerKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_EF2623DE67EDC70B584821A055B86302"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F1DFFB8E50BAD2529B0C859268ED8956"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F1DFFB8E50BAD2529B0C859268ED8956"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3898C4F454B4D1481E055F2AB2B217B"
+ "OwnerKey" = "8:_UNDEFINED"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3D3908BF1850F33CACA8DC41CB6869E"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3D3908BF1850F33CACA8DC41CB6869E"
+ "OwnerKey" = "8:_732A3EC12F10FF1A5DA8EE301EB14539"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F46F8B020857673C983D66FE2F41B983"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F46F8B020857673C983D66FE2F41B983"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "OwnerKey" = "8:_F1DFFB8E50BAD2529B0C859268ED8956"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_FA58218115CCED35D22896A731510356"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_FA997D5286D6E9EC1A80EB888D9FDA72"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_13803D82858878E2D3953D4742A1A596"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_136196DD2763419D959721C2BA143498"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_90D408142B1F2A9F72CBF42FC38348F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_55B682D249F24BD9069F5CC33AAB44F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_7E765F76FDFC3DCF4EAEB59B5546B063"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_4A5E77F2FEA9C4080C8FD63B968FBE6C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_873B6D0FDF23828BEF4F97FA21EAB767"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_847DE93907D7F6B17C0694F74120086B"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_709D007D7E89A10E63C141E3A08311FD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_98D5175644A3BC174BCA498A1B20FF84"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_7A0D754929705CC64EF84E26BD75D642"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_B7F1A99B13057B9195F587E580BA16AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_BA97AA5828837180D47BBD44C338D695"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_25CA87997CBA1F923E61CE5BB20D3891"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D9C852C126C7F540922D946114717E3C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_F1DFFB8E50BAD2529B0C859268ED8956"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_E700A1A13A5B6DB314933FC1205AFDAB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_61BCA14057E1BA0AB03D4576CBA56A88"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_69F60BE42927314554CD235D3185D2CE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_C6BFB4DAD78C1798616508141EF1234E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_637E851F9FB315C0C0E9FD781D57341F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_04D23F89470123BB32E04152B3DA36A5"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_EB38C1BD04FDFE44579B9868D6D1E139"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_75D29198D3E03B5554EF1C7382CF5B14"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_73674B32069839371DC47411D1B7EBE0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_2F23291F311EE9576449E5628A5702AE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_712AAF71834640D10C755D415AF2200C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_92EADCA3313D55CFE2BB3BBA193941F3"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_64AD2A918B16AA625B839A6A2D4288AB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_5A8B326A4A0607AFC366F8FD9657A87A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_38A402C026B59AE31D2CBB0235AF3368"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_9758638AABE50C72FFA87E6544F6D70F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_69CC8DD07F81DD7EA883434F53157FBC"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_8D3497DF2885B15B643A20537C75D67E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_51C4508525FA0604A9CD727897EBD530"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_0D2EC478B8B5A060121B647E6BA3DE05"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A1336C0121F3132E09400329ACD12B30"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_42250239B4791E8133657256CCE3506C"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D50E7D146D0988E066CF588364E8E12F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DB4941BAFA45E5921E7072990000621E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_CBF3A46BFE914D8E4658EABB5A204074"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_00AB5F4CB0B9DCC466359F8589533B68"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D0CFB25F1239503E9FE3881A033B3110"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_5D31D40A55F64C363A1DE193E24D604B"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_F6E368D9549B410C14AA88FB39A3F64F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_89CE1C8A864B36E2C7FFCCB0015DD78A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_33C8144311EC5FA3E39D6B7EBB8FBC78"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_CDE626AD60FD216A79A42FF0C1FA037D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A8CAAF0845B31C55C0C40E212F6C7D65"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_B5EF2444BE89A32E5FE026C4A5018FAD"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_51F95A8D4A956260EFCD558FA4BEE2F4"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D3D539069043EC01D3D978E2A00C1597"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_3B351F730871D9CC74A40D74B6C6E61A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_2FA2B573783C66016BCED4EA9D33E5B6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DB4A94107FB1929721E56ED40844F276"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_3E6534AA37C9012ED3BDF4DCB02EFDB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_1AF921770726F808CD12907CBE271CB0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_20F7C5A192304AF349FFA1FC8741471D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_1AC47588060EAA9F2B7A13EC07359D10"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_AF79FC974C2F42D24D74E5313E475E87"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_ED524252AD28281FAE5468349D0E5797"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_032C05575B795D1CAEDD5105F1520FBB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_1910D5B276479C48B4F7762A638405F5"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_4672E56FCA5A7523E491A1DF92B58426"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_2444D22B50272EAE03F2B5D2457335EC"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_3C71904C35BED6686835B5A1C74768BE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_55D25B13F818972AA7BF22C7264EBB19"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_FA58218115CCED35D22896A731510356"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_B8EE1FC78F28FD0B62389E8796D603FB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D3EF38D40E0CBE1BD391303952B0493E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_173C4B05CE04BA34E920DC64B25A8670"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_4E399A139695EBD13928A80C850A7E9D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_359F09B8EC59D6FC1859EFF3D2274920"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_EBFEF6DABA658232EC82197A8E01F66E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_9CCA52D51EEDBFE9F9794A8ACD30D5D9"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A7976B20CB4BFC0F5C8BE15430B6005E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A2659FED3E8DE537BFD1EE3E6A429175"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_983D79DC449AD65746DD38E6468BD886"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_26BF1219019A4367BA3497A5899C05B1"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DC627D829804D2AC4A3984133840F2D5"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_90C6EB30636F05FB3DFD7C943DC16EAC"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D8A84B2F626300DA2E9147709713E9CB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D48D475C8BD232C2AC87A2A7C6CCA53D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_14CF2DBBA5462C65F94A9137DCE014F9"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DE3FACD5F197D2E261A0C6B32E0D1CAC"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_448EC30219E98C0B91ABF43C7D4F223F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DD77D7B58FFDC37F83D85D632BEC9DC4"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A35B706F66B9C77B3D87D7B0FF53D652"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_AED50036F562B75035A039EECFC7BA07"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_5DAE745CD40555B469B53E8DB8A5D7DA"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_6D9156D5DBF08959BE20FE18FA09E71A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_D1CB239DDD65E78A28094BC854772AFF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_CC07BBC3C44CE424AA0EF90844590E4E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_2589A08E4AC51C4B69842E948EFC87DB"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_967E9E20CB6B9C494DFC2637B6384B13"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_62EC6F0F04E5435ABCC0479D48BEBE1B"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_39C2ACA7C5003F7A39323635C3B4B924"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_0B4B393563808E508848ED965CF47AEE"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_08C7D6D7EF105161BD48E61BBEBBF002"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_A0C8023CFDF8E1966A878020945346CF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_896E731F0FFC039A04E0A4482B3FED1F"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_EF2623DE67EDC70B584821A055B86302"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_CCD49B330E05F963B5AE73E3D04F5762"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_244F067B77DB6F9852E2286427480A18"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_AC22B81E0F8A0CB4C79C8B878F2D1BCF"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_CC7BD04781686DE3403908303698199D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_F46F8B020857673C983D66FE2F41B983"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_C179B63E2F5A58786B70FADA6C8496A5"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_FA997D5286D6E9EC1A80EB888D9FDA72"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_023CEE1263BC2659C4302E37A4F8A946"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_EB90C5C498BD80F4675C07A364C45E3D"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_283F49175556E95BE98A7C8600F4030B"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_E0573A6D7543083D0A5654271DF50643"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_F3D3908BF1850F33CACA8DC41CB6869E"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_AB0E0C1990036EFBAC9C728A9902D668"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ "Entry"
+ {
+ "MsmKey" = "8:_UNDEFINED"
+ "OwnerKey" = "8:_018A2A1E8555CACB14EEBBCFE003E82A"
+ "MsmSig" = "8:_UNDEFINED"
+ }
+ }
+ "Configurations"
+ {
+ "Debug"
+ {
+ "DisplayName" = "8:Debug"
+ "IsDebugOnly" = "11:TRUE"
+ "IsReleaseOnly" = "11:FALSE"
+ "OutputFilename" = "8:..\\..\\Build\\Debug\\Installers\\Machine Studio Installer v1.0.msi"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:2"
+ }
+ "Release"
+ {
+ "DisplayName" = "8:Release"
+ "IsDebugOnly" = "11:FALSE"
+ "IsReleaseOnly" = "11:TRUE"
+ "OutputFilename" = "8:Release\\Tango.MachineStudio.Installer.msi"
+ "PackageFilesAs" = "3:2"
+ "PackageFileSize" = "3:-2147483648"
+ "CabType" = "3:1"
+ "Compression" = "3:2"
+ "SignOutput" = "11:FALSE"
+ "CertificateFile" = "8:"
+ "PrivateKeyFile" = "8:"
+ "TimeStampServer" = "8:"
+ "InstallerBootstrapper" = "3:2"
+ }
+ }
+ "Deployable"
+ {
+ "CustomAction"
+ {
+ }
+ "DefaultFeature"
+ {
+ "Name" = "8:DefaultFeature"
+ "Title" = "8:"
+ "Description" = "8:"
+ }
+ "ExternalPersistence"
+ {
+ "LaunchCondition"
+ {
+ "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_57416B062DDF4C7D949EE93B8783A324"
+ {
+ "Name" = "8:.NET Framework"
+ "Message" = "8:[VSDNETMSG]"
+ "FrameworkVersion" = "8:.NETFramework,Version=v4.6.1"
+ "AllowLaterVersions" = "11:FALSE"
+ "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=671728"
+ }
+ }
+ }
+ "File"
+ {
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_00AB5F4CB0B9DCC466359F8589533B68"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:RazorEngine, Version=3.10.0.0, Culture=neutral, PublicKeyToken=9ee697374c7e744a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_00AB5F4CB0B9DCC466359F8589533B68"
+ {
+ "Name" = "8:RazorEngine.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:RazorEngine.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_018A2A1E8555CACB14EEBBCFE003E82A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Collections, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_018A2A1E8555CACB14EEBBCFE003E82A"
+ {
+ "Name" = "8:System.Collections.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Collections.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_023CEE1263BC2659C4302E37A4F8A946"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.Tools, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_023CEE1263BC2659C4302E37A4F8A946"
+ {
+ "Name" = "8:System.Diagnostics.Tools.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.Tools.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_032C05575B795D1CAEDD5105F1520FBB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Text.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_032C05575B795D1CAEDD5105F1520FBB"
+ {
+ "Name" = "8:System.Text.RegularExpressions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.RegularExpressions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_036933210F6D8ADC298F5A996490268D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Collections.Immutable, Version=1.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_036933210F6D8ADC298F5A996490268D"
+ {
+ "Name" = "8:System.Collections.Immutable.DLL"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Collections.Immutable.DLL"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_04D23F89470123BB32E04152B3DA36A5"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_04D23F89470123BB32E04152B3DA36A5"
+ {
+ "Name" = "8:System.Linq.Expressions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Linq.Expressions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_08C7D6D7EF105161BD48E61BBEBBF002"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_08C7D6D7EF105161BD48E61BBEBBF002"
+ {
+ "Name" = "8:System.Reflection.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0B4B393563808E508848ED965CF47AEE"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Emit, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_0B4B393563808E508848ED965CF47AEE"
+ {
+ "Name" = "8:System.Reflection.Emit.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Emit.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Microsoft.CodeAnalysis, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_0CB867F7AB3CABEC84ED61F996D9AEB6"
+ {
+ "Name" = "8:Microsoft.CodeAnalysis.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Microsoft.CodeAnalysis.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0D2EC478B8B5A060121B647E6BA3DE05"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_0D2EC478B8B5A060121B647E6BA3DE05"
+ {
+ "Name" = "8:Tango.Core.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Core.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_13803D82858878E2D3953D4742A1A596"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Collections.Concurrent, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_13803D82858878E2D3953D4742A1A596"
+ {
+ "Name" = "8:System.Collections.Concurrent.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Collections.Concurrent.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_14CF2DBBA5462C65F94A9137DCE014F9"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Xml, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_14CF2DBBA5462C65F94A9137DCE014F9"
+ {
+ "Name" = "8:System.Runtime.Serialization.Xml.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Serialization.Xml.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_173C4B05CE04BA34E920DC64B25A8670"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Xml.ReaderWriter, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_173C4B05CE04BA34E920DC64B25A8670"
+ {
+ "Name" = "8:System.Xml.ReaderWriter.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Xml.ReaderWriter.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1910D5B276479C48B4F7762A638405F5"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_1910D5B276479C48B4F7762A638405F5"
+ {
+ "Name" = "8:System.Runtime.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_197CAF3FE1DF1DC0514D774674A3F0FF"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.MachineDesigner, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_197CAF3FE1DF1DC0514D774674A3F0FF"
+ {
+ "Name" = "8:Tango.MachineStudio.MachineDesigner.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.MachineDesigner.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1AC47588060EAA9F2B7A13EC07359D10"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Threading, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_1AC47588060EAA9F2B7A13EC07359D10"
+ {
+ "Name" = "8:System.Threading.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1AF921770726F808CD12907CBE271CB0"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_1AF921770726F808CD12907CBE271CB0"
+ {
+ "Name" = "8:System.IO.FileSystem.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.IO.FileSystem.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1D8AF1DCF3ACB1AB530315306B0866FB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_1D8AF1DCF3ACB1AB530315306B0866FB"
+ {
+ "Name" = "8:System.ValueTuple.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ValueTuple.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_20F7C5A192304AF349FFA1FC8741471D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_20F7C5A192304AF349FFA1FC8741471D"
+ {
+ "Name" = "8:System.IO.Compression.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.IO.Compression.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2444D22B50272EAE03F2B5D2457335EC"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_2444D22B50272EAE03F2B5D2457335EC"
+ {
+ "Name" = "8:System.Reflection.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_244F067B77DB6F9852E2286427480A18"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Net.NetworkInformation, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_244F067B77DB6F9852E2286427480A18"
+ {
+ "Name" = "8:System.Net.NetworkInformation.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Net.NetworkInformation.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2589A08E4AC51C4B69842E948EFC87DB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_2589A08E4AC51C4B69842E948EFC87DB"
+ {
+ "Name" = "8:System.Reflection.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_25CA87997CBA1F923E61CE5BB20D3891"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.Stubs, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_25CA87997CBA1F923E61CE5BB20D3891"
+ {
+ "Name" = "8:Tango.MachineStudio.Stubs.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.Stubs.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_26BF1219019A4367BA3497A5899C05B1"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ServiceModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_26BF1219019A4367BA3497A5899C05B1"
+ {
+ "Name" = "8:System.ServiceModel.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ServiceModel.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_283F49175556E95BE98A7C8600F4030B"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.Contracts, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_283F49175556E95BE98A7C8600F4030B"
+ {
+ "Name" = "8:System.Diagnostics.Contracts.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.Contracts.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2F23291F311EE9576449E5628A5702AE"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Transport, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_2F23291F311EE9576449E5628A5702AE"
+ {
+ "Name" = "8:Tango.Transport.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Transport.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2FA2B573783C66016BCED4EA9D33E5B6"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Text.Encoding.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_2FA2B573783C66016BCED4EA9D33E5B6"
+ {
+ "Name" = "8:System.Text.Encoding.Extensions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.Encoding.Extensions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_33C8144311EC5FA3E39D6B7EBB8FBC78"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_33C8144311EC5FA3E39D6B7EBB8FBC78"
+ {
+ "Name" = "8:System.Console.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Console.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_359F09B8EC59D6FC1859EFF3D2274920"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_359F09B8EC59D6FC1859EFF3D2274920"
+ {
+ "Name" = "8:System.Threading.Tasks.Parallel.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.Tasks.Parallel.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_38A402C026B59AE31D2CBB0235AF3368"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.DAL.Remote, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_38A402C026B59AE31D2CBB0235AF3368"
+ {
+ "Name" = "8:Tango.DAL.Remote.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.DAL.Remote.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_39C2ACA7C5003F7A39323635C3B4B924"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Emit.ILGeneration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_39C2ACA7C5003F7A39323635C3B4B924"
+ {
+ "Name" = "8:System.Reflection.Emit.ILGeneration.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Emit.ILGeneration.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3B351F730871D9CC74A40D74B6C6E61A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_3B351F730871D9CC74A40D74B6C6E61A"
+ {
+ "Name" = "8:System.Text.Encoding.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.Encoding.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3C71904C35BED6686835B5A1C74768BE"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Globalization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_3C71904C35BED6686835B5A1C74768BE"
+ {
+ "Name" = "8:System.Globalization.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Globalization.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3E6534AA37C9012ED3BDF4DCB02EFDB6"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_3E6534AA37C9012ED3BDF4DCB02EFDB6"
+ {
+ "Name" = "8:System.IO.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.IO.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_42250239B4791E8133657256CCE3506C"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_42250239B4791E8133657256CCE3506C"
+ {
+ "Name" = "8:Google.Protobuf.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Google.Protobuf.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_448EC30219E98C0B91ABF43C7D4F223F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Json, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_448EC30219E98C0B91ABF43C7D4F223F"
+ {
+ "Name" = "8:System.Runtime.Serialization.Json.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Serialization.Json.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4672E56FCA5A7523E491A1DF92B58426"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_4672E56FCA5A7523E491A1DF92B58426"
+ {
+ "Name" = "8:System.Runtime.Extensions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Extensions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A5E77F2FEA9C4080C8FD63B968FBE6C"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:MahApps.Metro, Version=1.5.0.23, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_4A5E77F2FEA9C4080C8FD63B968FBE6C"
+ {
+ "Name" = "8:MahApps.Metro.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:MahApps.Metro.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4E399A139695EBD13928A80C850A7E9D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Threading.Timer, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_4E399A139695EBD13928A80C850A7E9D"
+ {
+ "Name" = "8:System.Threading.Timer.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.Timer.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_4FC5C727C21C7B57C1E2B8E55A9E8748"
+ {
+ "Name" = "8:System.Linq.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Linq.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_51C4508525FA0604A9CD727897EBD530"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_51C4508525FA0604A9CD727897EBD530"
+ {
+ "Name" = "8:EntityFramework.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:EntityFramework.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_51F95A8D4A956260EFCD558FA4BEE2F4"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.Algorithms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_51F95A8D4A956260EFCD558FA4BEE2F4"
+ {
+ "Name" = "8:System.Security.Cryptography.Algorithms.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Security.Cryptography.Algorithms.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_55B682D249F24BD9069F5CC33AAB44F0"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_55B682D249F24BD9069F5CC33AAB44F0"
+ {
+ "Name" = "8:GalaSoft.MvvmLight.Platform.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:GalaSoft.MvvmLight.Platform.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_55D25B13F818972AA7BF22C7264EBB19"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_55D25B13F818972AA7BF22C7264EBB19"
+ {
+ "Name" = "8:System.Windows.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Windows.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5747A410B7984793A0F6D9121679C6F3"
+ {
+ "SourcePath" = "8:..\\..\\Build\\Debug\\x86\\SQLite.Interop.dll"
+ "TargetName" = "8:SQLite.Interop.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_137C662BA6B24073AC58ED6C67DA7951"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5A8B326A4A0607AFC366F8FD9657A87A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.SharedUI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_5A8B326A4A0607AFC366F8FD9657A87A"
+ {
+ "Name" = "8:Tango.SharedUI.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.SharedUI.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.IO, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_5C5582DB321E2CC26F8F1FBF8B4866F0"
+ {
+ "Name" = "8:System.IO.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.IO.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5D31D40A55F64C363A1DE193E24D604B"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_5D31D40A55F64C363A1DE193E24D604B"
+ {
+ "Name" = "8:Newtonsoft.Json.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Newtonsoft.Json.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5DAE745CD40555B469B53E8DB8A5D7DA"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Handles, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_5DAE745CD40555B469B53E8DB8A5D7DA"
+ {
+ "Name" = "8:System.Runtime.Handles.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Handles.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_61BCA14057E1BA0AB03D4576CBA56A88"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.DB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_61BCA14057E1BA0AB03D4576CBA56A88"
+ {
+ "Name" = "8:Tango.MachineStudio.DB.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.DB.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_62EC6F0F04E5435ABCC0479D48BEBE1B"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Emit.Lightweight, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_62EC6F0F04E5435ABCC0479D48BEBE1B"
+ {
+ "Name" = "8:System.Reflection.Emit.Lightweight.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Emit.Lightweight.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_637E851F9FB315C0C0E9FD781D57341F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.ObjectModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_637E851F9FB315C0C0E9FD781D57341F"
+ {
+ "Name" = "8:System.ObjectModel.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ObjectModel.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_64AD2A918B16AA625B839A6A2D4288AB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reactive.Interfaces, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_64AD2A918B16AA625B839A6A2D4288AB"
+ {
+ "Name" = "8:System.Reactive.Interfaces.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reactive.Interfaces.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.DragAndDrop, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_67EAE4B6E14417FC2BF4F4EBF4473A1E"
+ {
+ "Name" = "8:Tango.DragAndDrop.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.DragAndDrop.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_69CC8DD07F81DD7EA883434F53157FBC"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Serialization, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_69CC8DD07F81DD7EA883434F53157FBC"
+ {
+ "Name" = "8:Tango.Serialization.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Serialization.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_69F60BE42927314554CD235D3185D2CE"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_69F60BE42927314554CD235D3185D2CE"
+ {
+ "Name" = "8:Tango.MachineStudio.Common.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.Common.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Microsoft.CodeAnalysis.Scripting, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_6CA5A606A5B05443A4EF3E39E49B6BDD"
+ {
+ "Name" = "8:Microsoft.CodeAnalysis.Scripting.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Microsoft.CodeAnalysis.Scripting.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6D9156D5DBF08959BE20FE18FA09E71A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Extensions, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_6D9156D5DBF08959BE20FE18FA09E71A"
+ {
+ "Name" = "8:System.Runtime.Extensions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Extensions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_709D007D7E89A10E63C141E3A08311FD"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_709D007D7E89A10E63C141E3A08311FD"
+ {
+ "Name" = "8:EntityFramework.SqlServer.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:EntityFramework.SqlServer.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_712AAF71834640D10C755D415AF2200C"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reactive.Linq, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_712AAF71834640D10C755D415AF2200C"
+ {
+ "Name" = "8:System.Reactive.Linq.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reactive.Linq.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_732A3EC12F10FF1A5DA8EE301EB14539"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_732A3EC12F10FF1A5DA8EE301EB14539"
+ {
+ "Name" = "8:GalaSoft.MvvmLight.Extras.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:GalaSoft.MvvmLight.Extras.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_73674B32069839371DC47411D1B7EBE0"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reactive.PlatformServices, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_73674B32069839371DC47411D1B7EBE0"
+ {
+ "Name" = "8:System.Reactive.PlatformServices.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reactive.PlatformServices.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_75D29198D3E03B5554EF1C7382CF5B14"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Integration, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_75D29198D3E03B5554EF1C7382CF5B14"
+ {
+ "Name" = "8:Tango.Integration.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Integration.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7A0D754929705CC64EF84E26BD75D642"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:RealTimeGraphEx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_7A0D754929705CC64EF84E26BD75D642"
+ {
+ "Name" = "8:RealTimeGraphEx.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:RealTimeGraphEx.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7E765F76FDFC3DCF4EAEB59B5546B063"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:MaterialDesignColors, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_7E765F76FDFC3DCF4EAEB59B5546B063"
+ {
+ "Name" = "8:MaterialDesignColors.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:MaterialDesignColors.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_847DE93907D7F6B17C0694F74120086B"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:FontAwesome.WPF, Version=4.7.0.37774, Culture=neutral, PublicKeyToken=0758b07a11a4f466, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_847DE93907D7F6B17C0694F74120086B"
+ {
+ "Name" = "8:FontAwesome.WPF.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:FontAwesome.WPF.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_873B6D0FDF23828BEF4F97FA21EAB767"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_873B6D0FDF23828BEF4F97FA21EAB767"
+ {
+ "Name" = "8:System.Windows.Interactivity.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Windows.Interactivity.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_89624A3865EAD179277FE5905CBE627D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_89624A3865EAD179277FE5905CBE627D"
+ {
+ "Name" = "8:GalaSoft.MvvmLight.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:GalaSoft.MvvmLight.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_896E731F0FFC039A04E0A4482B3FED1F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Net.WebHeaderCollection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_896E731F0FFC039A04E0A4482B3FED1F"
+ {
+ "Name" = "8:System.Net.WebHeaderCollection.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Net.WebHeaderCollection.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_89CE1C8A864B36E2C7FFCCB0015DD78A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.StackTrace, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_89CE1C8A864B36E2C7FFCCB0015DD78A"
+ {
+ "Name" = "8:System.Diagnostics.StackTrace.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.StackTrace.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_8A5EA8D9E307AB1AFEC20AB78AB46C78"
+ {
+ "Name" = "8:System.IO.FileSystem.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.IO.FileSystem.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8D3497DF2885B15B643A20537C75D67E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.DAL.Local, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_8D3497DF2885B15B643A20537C75D67E"
+ {
+ "Name" = "8:Tango.DAL.Local.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.DAL.Local.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_90C6EB30636F05FB3DFD7C943DC16EAC"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ServiceModel.Http, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_90C6EB30636F05FB3DFD7C943DC16EAC"
+ {
+ "Name" = "8:System.ServiceModel.Http.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ServiceModel.Http.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_90D408142B1F2A9F72CBF42FC38348F0"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reactive.Windows.Threading, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_90D408142B1F2A9F72CBF42FC38348F0"
+ {
+ "Name" = "8:System.Reactive.Windows.Threading.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reactive.Windows.Threading.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_92EADCA3313D55CFE2BB3BBA193941F3"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reactive.Core, Version=3.0.3000.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_92EADCA3313D55CFE2BB3BBA193941F3"
+ {
+ "Name" = "8:System.Reactive.Core.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reactive.Core.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.CodeGeneration, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_94B0EAFC6BCADB7C6DC2EF31467C8C24"
+ {
+ "Name" = "8:Tango.CodeGeneration.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.CodeGeneration.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_967E9E20CB6B9C494DFC2637B6384B13"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_967E9E20CB6B9C494DFC2637B6384B13"
+ {
+ "Name" = "8:System.Reflection.Extensions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Extensions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9758638AABE50C72FFA87E6544F6D70F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Settings, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_9758638AABE50C72FFA87E6544F6D70F"
+ {
+ "Name" = "8:Tango.Settings.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Settings.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_983D79DC449AD65746DD38E6468BD886"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ServiceModel.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_983D79DC449AD65746DD38E6468BD886"
+ {
+ "Name" = "8:System.ServiceModel.Security.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ServiceModel.Security.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_98D5175644A3BC174BCA498A1B20FF84"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Dragablz, Version=0.0.3.197, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_98D5175644A3BC174BCA498A1B20FF84"
+ {
+ "Name" = "8:Dragablz.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Dragablz.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9CCA52D51EEDBFE9F9794A8ACD30D5D9"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Text.RegularExpressions, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_9CCA52D51EEDBFE9F9794A8ACD30D5D9"
+ {
+ "Name" = "8:System.Text.RegularExpressions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.RegularExpressions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9EE464FC4C8FCD72BCAA46095DD85257"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Humanizer, Version=2.2.0.0, Culture=neutral, PublicKeyToken=979442b78dfc278e, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_9EE464FC4C8FCD72BCAA46095DD85257"
+ {
+ "Name" = "8:Humanizer.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Humanizer.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A0C8023CFDF8E1966A878020945346CF"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ObjectModel, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_A0C8023CFDF8E1966A878020945346CF"
+ {
+ "Name" = "8:System.ObjectModel.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ObjectModel.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A1336C0121F3132E09400329ACD12B30"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:SimpleValidator, Version=0.6.1.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_A1336C0121F3132E09400329ACD12B30"
+ {
+ "Name" = "8:SimpleValidator.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:SimpleValidator.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A2659FED3E8DE537BFD1EE3E6A429175"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Text.Encoding, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_A2659FED3E8DE537BFD1EE3E6A429175"
+ {
+ "Name" = "8:System.Text.Encoding.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.Encoding.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A35B706F66B9C77B3D87D7B0FF53D652"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.InteropServices.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_A35B706F66B9C77B3D87D7B0FF53D652"
+ {
+ "Name" = "8:System.Runtime.InteropServices.WindowsRuntime.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.InteropServices.WindowsRuntime.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Microsoft.CodeAnalysis.CSharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_A68EFDFBE5C2C1A85BE7E05BD895208A"
+ {
+ "Name" = "8:Microsoft.CodeAnalysis.CSharp.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Microsoft.CodeAnalysis.CSharp.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A7976B20CB4BFC0F5C8BE15430B6005E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Text.Encoding.Extensions, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_A7976B20CB4BFC0F5C8BE15430B6005E"
+ {
+ "Name" = "8:System.Text.Encoding.Extensions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.Encoding.Extensions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A8CAAF0845B31C55C0C40E212F6C7D65"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_A8CAAF0845B31C55C0C40E212F6C7D65"
+ {
+ "Name" = "8:System.Xml.ReaderWriter.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Xml.ReaderWriter.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AB0E0C1990036EFBAC9C728A9902D668"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ComponentModel.Annotations, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_AB0E0C1990036EFBAC9C728A9902D668"
+ {
+ "Name" = "8:System.ComponentModel.Annotations.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ComponentModel.Annotations.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AC22B81E0F8A0CB4C79C8B878F2D1BCF"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Linq.Queryable, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_AC22B81E0F8A0CB4C79C8B878F2D1BCF"
+ {
+ "Name" = "8:System.Linq.Queryable.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Linq.Queryable.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AED50036F562B75035A039EECFC7BA07"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.InteropServices, Version=4.0.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_AED50036F562B75035A039EECFC7BA07"
+ {
+ "Name" = "8:System.Runtime.InteropServices.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.InteropServices.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AF79FC974C2F42D24D74E5313E475E87"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.Debug, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_AF79FC974C2F42D24D74E5313E475E87"
+ {
+ "Name" = "8:System.Diagnostics.Debug.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.Debug.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B5EF2444BE89A32E5FE026C4A5018FAD"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_B5EF2444BE89A32E5FE026C4A5018FAD"
+ {
+ "Name" = "8:System.Security.Cryptography.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Security.Cryptography.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B7F1A99B13057B9195F587E580BA16AE"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.Synchronization, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_B7F1A99B13057B9195F587E580BA16AE"
+ {
+ "Name" = "8:Tango.MachineStudio.Synchronization.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.Synchronization.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B8EE1FC78F28FD0B62389E8796D603FB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Xml.XmlSerializer, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_B8EE1FC78F28FD0B62389E8796D603FB"
+ {
+ "Name" = "8:System.Xml.XmlSerializer.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Xml.XmlSerializer.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BA97AA5828837180D47BBD44C338D695"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Synchronization, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_BA97AA5828837180D47BBD44C338D695"
+ {
+ "Name" = "8:Tango.Synchronization.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Synchronization.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C179B63E2F5A58786B70FADA6C8496A5"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Dynamic.Runtime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_C179B63E2F5A58786B70FADA6C8496A5"
+ {
+ "Name" = "8:System.Dynamic.Runtime.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Dynamic.Runtime.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C6BFB4DAD78C1798616508141EF1234E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_C6BFB4DAD78C1798616508141EF1234E"
+ {
+ "Name" = "8:System.Threading.Tasks.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.Tasks.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CBF3A46BFE914D8E4658EABB5A204074"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Data.SQLite, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_CBF3A46BFE914D8E4658EABB5A204074"
+ {
+ "Name" = "8:System.Data.SQLite.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Data.SQLite.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CC07BBC3C44CE424AA0EF90844590E4E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Resources.ResourceManager, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_CC07BBC3C44CE424AA0EF90844590E4E"
+ {
+ "Name" = "8:System.Resources.ResourceManager.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Resources.ResourceManager.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CC7BD04781686DE3403908303698199D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Linq.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_CC7BD04781686DE3403908303698199D"
+ {
+ "Name" = "8:System.Linq.Parallel.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Linq.Parallel.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CCD49B330E05F963B5AE73E3D04F5762"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Net.Primitives, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_CCD49B330E05F963B5AE73E3D04F5762"
+ {
+ "Name" = "8:System.Net.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Net.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CDE626AD60FD216A79A42FF0C1FA037D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Xml.XPath.XDocument, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_CDE626AD60FD216A79A42FF0C1FA037D"
+ {
+ "Name" = "8:System.Xml.XPath.XDocument.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Xml.XPath.XDocument.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_CEFA219EC4E386E3C8E3825A73ACAA8A"
+ {
+ "Name" = "8:System.Text.Encoding.CodePages.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Text.Encoding.CodePages.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D0CFB25F1239503E9FE3881A033B3110"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_D0CFB25F1239503E9FE3881A033B3110"
+ {
+ "Name" = "8:System.Web.Razor.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Web.Razor.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D1CB239DDD65E78A28094BC854772AFF"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime, Version=4.0.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_D1CB239DDD65E78A28094BC854772AFF"
+ {
+ "Name" = "8:System.Runtime.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3D539069043EC01D3D978E2A00C1597"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Reflection.Metadata, Version=1.4.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_D3D539069043EC01D3D978E2A00C1597"
+ {
+ "Name" = "8:System.Reflection.Metadata.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Reflection.Metadata.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3EF38D40E0CBE1BD391303952B0493E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Xml.XDocument, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_D3EF38D40E0CBE1BD391303952B0493E"
+ {
+ "Name" = "8:System.Xml.XDocument.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Xml.XDocument.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D48D475C8BD232C2AC87A2A7C6CCA53D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Security.Principal, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_D48D475C8BD232C2AC87A2A7C6CCA53D"
+ {
+ "Name" = "8:System.Security.Principal.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Security.Principal.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D50E7D146D0988E066CF588364E8E12F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_D50E7D146D0988E066CF588364E8E12F"
+ {
+ "Name" = "8:Microsoft.Practices.ServiceLocation.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Microsoft.Practices.ServiceLocation.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D8A84B2F626300DA2E9147709713E9CB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ServiceModel.Duplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_D8A84B2F626300DA2E9147709713E9CB"
+ {
+ "Name" = "8:System.ServiceModel.Duplex.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ServiceModel.Duplex.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D9C852C126C7F540922D946114717E3C"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Stubs, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_D9C852C126C7F540922D946114717E3C"
+ {
+ "Name" = "8:Tango.Stubs.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Stubs.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DB4941BAFA45E5921E7072990000621E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Logging, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_DB4941BAFA45E5921E7072990000621E"
+ {
+ "Name" = "8:Tango.Logging.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Logging.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DB4A94107FB1929721E56ED40844F276"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_DB4A94107FB1929721E56ED40844F276"
+ {
+ "Name" = "8:System.Runtime.InteropServices.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.InteropServices.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DC627D829804D2AC4A3984133840F2D5"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ServiceModel.NetTcp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_DC627D829804D2AC4A3984133840F2D5"
+ {
+ "Name" = "8:System.ServiceModel.NetTcp.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ServiceModel.NetTcp.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Globalization, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_DCD0D71251FAABFB20D57E60AC3DEFA3"
+ {
+ "Name" = "8:System.Globalization.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Globalization.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Threading, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_DD10CB022785FD0CE997E8C7BC1D0FE6"
+ {
+ "Name" = "8:System.Threading.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DD77D7B58FFDC37F83D85D632BEC9DC4"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_DD77D7B58FFDC37F83D85D632BEC9DC4"
+ {
+ "Name" = "8:System.Runtime.Numerics.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Numerics.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DE3FACD5F197D2E261A0C6B32E0D1CAC"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Primitives, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_DE3FACD5F197D2E261A0C6B32E0D1CAC"
+ {
+ "Name" = "8:System.Runtime.Serialization.Primitives.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Runtime.Serialization.Primitives.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.PMR, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_DF6FFF88157E7FBCFB7E188431AAF4CF"
+ {
+ "Name" = "8:Tango.PMR.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.PMR.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E0573A6D7543083D0A5654271DF50643"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ComponentModel.EventBasedAsync, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_E0573A6D7543083D0A5654271DF50643"
+ {
+ "Name" = "8:System.ComponentModel.EventBasedAsync.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ComponentModel.EventBasedAsync.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E0FCEE9366306B5A88DC7CF29E913A4B"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:TRUE"
+ "AssemblyAsmDisplayName" = "8:System.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_E0FCEE9366306B5A88DC7CF29E913A4B"
+ {
+ "Name" = "8:System.Collections.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Collections.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E700A1A13A5B6DB314933FC1205AFDAB"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.Developer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_E700A1A13A5B6DB314933FC1205AFDAB"
+ {
+ "Name" = "8:Tango.MachineStudio.Developer.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.Developer.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.DAL.Observables, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_E7C14C9E3BC398BEC3B1A1D95C43E23F"
+ {
+ "Name" = "8:Tango.DAL.Observables.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.DAL.Observables.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EB38C1BD04FDFE44579B9868D6D1E139"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_EB38C1BD04FDFE44579B9868D6D1E139"
+ {
+ "Name" = "8:MaterialDesignThemes.Wpf.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:MaterialDesignThemes.Wpf.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EB90C5C498BD80F4675C07A364C45E3D"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.Debug, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_EB90C5C498BD80F4675C07A364C45E3D"
+ {
+ "Name" = "8:System.Diagnostics.Debug.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.Debug.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EBFEF6DABA658232EC82197A8E01F66E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Threading.Tasks, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_EBFEF6DABA658232EC82197A8E01F66E"
+ {
+ "Name" = "8:System.Threading.Tasks.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Threading.Tasks.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_ED524252AD28281FAE5468349D0E5797"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:ICSharpCode.AvalonEdit, Version=4.3.1.9429, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_ED524252AD28281FAE5468349D0E5797"
+ {
+ "Name" = "8:ICSharpCode.AvalonEdit.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:ICSharpCode.AvalonEdit.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EF2623DE67EDC70B584821A055B86302"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Net.Requests, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_EF2623DE67EDC70B584821A055B86302"
+ {
+ "Name" = "8:System.Net.Requests.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Net.Requests.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F1DFFB8E50BAD2529B0C859268ED8956"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.Scripting, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_F1DFFB8E50BAD2529B0C859268ED8956"
+ {
+ "Name" = "8:Tango.Scripting.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.Scripting.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F3898C4F454B4D1481E055F2AB2B217B"
+ {
+ "SourcePath" = "8:..\\..\\Build\\Debug\\x64\\SQLite.Interop.dll"
+ "TargetName" = "8:SQLite.Interop.dll"
+ "Tag" = "8:"
+ "Folder" = "8:_37D35F637FDD433095D8A36CAA7424C8"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F3D3908BF1850F33CACA8DC41CB6869E"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_F3D3908BF1850F33CACA8DC41CB6869E"
+ {
+ "Name" = "8:System.ComponentModel.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.ComponentModel.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.AutoComplete, Version=1.0.0.8, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_F3FFF4D4A0414ACC9A1C44596F7A5728"
+ {
+ "Name" = "8:Tango.AutoComplete.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.AutoComplete.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F46F8B020857673C983D66FE2F41B983"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Linq.Expressions, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_F46F8B020857673C983D66FE2F41B983"
+ {
+ "Name" = "8:System.Linq.Expressions.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Linq.Expressions.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F6E368D9549B410C14AA88FB39A3F64F"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Microsoft.CodeAnalysis.CSharp.Scripting, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_F6E368D9549B410C14AA88FB39A3F64F"
+ {
+ "Name" = "8:Microsoft.CodeAnalysis.CSharp.Scripting.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Microsoft.CodeAnalysis.CSharp.Scripting.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FA58218115CCED35D22896A731510356"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_FA58218115CCED35D22896A731510356"
+ {
+ "Name" = "8:System.Net.Http.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Net.Http.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FA997D5286D6E9EC1A80EB888D9FDA72"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:System.Diagnostics.Tracing, Version=4.0.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
+ "ScatterAssemblies"
+ {
+ "_FA997D5286D6E9EC1A80EB888D9FDA72"
+ {
+ "Name" = "8:System.Diagnostics.Tracing.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:System.Diagnostics.Tracing.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ {
+ "AssemblyRegister" = "3:1"
+ "AssemblyIsInGAC" = "11:FALSE"
+ "AssemblyAsmDisplayName" = "8:Tango.MachineStudio.Technician, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
+ "ScatterAssemblies"
+ {
+ "_FAAD9E9C9BB571F4E45C5C7C5DFD626A"
+ {
+ "Name" = "8:Tango.MachineStudio.Technician.dll"
+ "Attributes" = "3:512"
+ }
+ }
+ "SourcePath" = "8:Tango.MachineStudio.Technician.dll"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:TRUE"
+ "IsolateTo" = "8:"
+ }
+ }
+ "FileType"
+ {
+ }
+ "Folder"
+ {
+ "{1525181F-901A-416C-8A58-119130FE478E}:_2B7C57CBA7424F6BA8F808A3FF16C43F"
+ {
+ "Name" = "8:#1916"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:DesktopFolder"
+ "Folders"
+ {
+ }
+ }
+ "{1525181F-901A-416C-8A58-119130FE478E}:_968A4F66A48640108B0EA8FAEC525B37"
+ {
+ "Name" = "8:#1919"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:ProgramMenuFolder"
+ "Folders"
+ {
+ }
+ }
+ "{3C67513D-01DD-4637-8A68-80971EB9504F}:_C15E39669002469F98F297C08D55903C"
+ {
+ "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
+ "Name" = "8:#1925"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:TARGETDIR"
+ "Folders"
+ {
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_137C662BA6B24073AC58ED6C67DA7951"
+ {
+ "Name" = "8:x86"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_1F831795EFB9407FAABE378081755E62"
+ "Folders"
+ {
+ }
+ }
+ "{9EF0B969-E518-4E46-987F-47570745A589}:_37D35F637FDD433095D8A36CAA7424C8"
+ {
+ "Name" = "8:x64"
+ "AlwaysCreate" = "11:FALSE"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Property" = "8:_F592681A2CDE4CC1946728CA04414DC8"
+ "Folders"
+ {
+ }
+ }
+ }
+ }
+ }
+ "LaunchCondition"
+ {
+ }
+ "Locator"
+ {
+ }
+ "MsiBootstrapper"
+ {
+ "LangId" = "3:1033"
+ "RequiresElevation" = "11:FALSE"
+ }
+ "Product"
+ {
+ "Name" = "8:Microsoft Visual Studio"
+ "ProductName" = "8:Machine Studio"
+ "ProductCode" = "8:{85D89915-CDF5-4C10-AE24-99842E2FDAD0}"
+ "PackageCode" = "8:{64B364FB-4132-4794-9ED0-0A6939A0212F}"
+ "UpgradeCode" = "8:{EDD5BF5D-A0F0-4016-AE0A-5C008DD66BB6}"
+ "AspNetVersion" = "8:4.0.30319.0"
+ "RestartWWWService" = "11:FALSE"
+ "RemovePreviousVersions" = "11:FALSE"
+ "DetectNewerInstalledVersion" = "11:TRUE"
+ "InstallAllUsers" = "11:FALSE"
+ "ProductVersion" = "8:1.0.0"
+ "Manufacturer" = "8:Twine"
+ "ARPHELPTELEPHONE" = "8:"
+ "ARPHELPLINK" = "8:"
+ "Title" = "8:Machine Studio"
+ "Subject" = "8:"
+ "ARPCONTACT" = "8:Twine"
+ "Keywords" = "8:"
+ "ARPCOMMENTS" = "8:"
+ "ARPURLINFOABOUT" = "8:"
+ "ARPPRODUCTICON" = "8:"
+ "ARPIconIndex" = "3:0"
+ "SearchPath" = "8:"
+ "UseSystemSearchPath" = "11:TRUE"
+ "TargetPlatform" = "3:0"
+ "PreBuildEvent" = "8:"
+ "PostBuildEvent" = "8:"
+ "RunPostBuildEvent" = "3:0"
+ }
+ "Registry"
+ {
+ "HKLM"
+ {
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_67687E08172E49BEA900C5484C5FF8DA"
+ {
+ "Name" = "8:Software"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_01DA46310D13428A86083D861B5E2B54"
+ {
+ "Name" = "8:[Manufacturer]"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ }
+ "HKCU"
+ {
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9B146D40CB194C87882A4AE32F7F4B35"
+ {
+ "Name" = "8:Software"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_035000F1D57C4EACB15A7673F34EEB37"
+ {
+ "Name" = "8:[Manufacturer]"
+ "Condition" = "8:"
+ "AlwaysCreate" = "11:FALSE"
+ "DeleteAtUninstall" = "11:FALSE"
+ "Transitive" = "11:FALSE"
+ "Keys"
+ {
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ "Values"
+ {
+ }
+ }
+ }
+ }
+ "HKCR"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKU"
+ {
+ "Keys"
+ {
+ }
+ }
+ "HKPU"
+ {
+ "Keys"
+ {
+ }
+ }
+ }
+ "Sequences"
+ {
+ }
+ "Shortcut"
+ {
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_198AFFE2F9DE4D79906A285CA9243C2D"
+ {
+ "Name" = "8:Machine Studio"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_136196DD2763419D959721C2BA143498"
+ "Folder" = "8:_968A4F66A48640108B0EA8FAEC525B37"
+ "WorkingFolder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_4611BDFC25A64A63AE21584EE9FEFB83"
+ {
+ "Name" = "8:Machine Studio"
+ "Arguments" = "8:"
+ "Description" = "8:"
+ "ShowCmd" = "3:1"
+ "IconIndex" = "3:0"
+ "Transitive" = "11:FALSE"
+ "Target" = "8:_136196DD2763419D959721C2BA143498"
+ "Folder" = "8:_2B7C57CBA7424F6BA8F808A3FF16C43F"
+ "WorkingFolder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Icon" = "8:"
+ "Feature" = "8:"
+ }
+ }
+ "UserInterface"
+ {
+ "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_08B45AD123094F6C92B305C14627FB76"
+ {
+ "UseDynamicProperties" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6E6D9A9BD7974792B393BBF9B89C42E1"
+ {
+ "Name" = "8:#1902"
+ "Sequence" = "3:1"
+ "Attributes" = "3:3"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C0D4182D7CAA4C39A10E65DE809DAA4C"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Finished"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "UpdateText"
+ {
+ "Name" = "8:UpdateText"
+ "DisplayName" = "8:#1058"
+ "Description" = "8:#1158"
+ "Type" = "3:15"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1258"
+ "DefaultValue" = "8:#1258"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_75AC580475C8462AA4332E731B6F97BD"
+ {
+ "Name" = "8:#1901"
+ "Sequence" = "3:1"
+ "Attributes" = "3:2"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7087F748E92D45E99702F6CD55D69972"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Progress"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "ShowProgress"
+ {
+ "Name" = "8:ShowProgress"
+ "DisplayName" = "8:#1009"
+ "Description" = "8:#1109"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_A4C5DFB6206947E6A40AD0584377A7F5"
+ {
+ "UseDynamicProperties" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B7AFC6BC21994F5993C27ADE17D59052"
+ {
+ "Name" = "8:#1900"
+ "Sequence" = "3:1"
+ "Attributes" = "3:1"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_08A90397CA3047E88066D7CFB5879207"
+ {
+ "Sequence" = "3:300"
+ "DisplayName" = "8:Confirm Installation"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_941B7EBD8EB34731AD2F885ACF47D804"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Welcome"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "CopyrightWarning"
+ {
+ "Name" = "8:CopyrightWarning"
+ "DisplayName" = "8:#1002"
+ "Description" = "8:#1102"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1202"
+ "DefaultValue" = "8:#1202"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "Welcome"
+ {
+ "Name" = "8:Welcome"
+ "DisplayName" = "8:#1003"
+ "Description" = "8:#1103"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1203"
+ "DefaultValue" = "8:#1203"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F8D37B85CCF34A3EBCC34C2AA0CEC474"
+ {
+ "Sequence" = "3:200"
+ "DisplayName" = "8:Installation Folder"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "InstallAllUsersVisible"
+ {
+ "Name" = "8:InstallAllUsersVisible"
+ "DisplayName" = "8:#1059"
+ "Description" = "8:#1159"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D522BCA1443A4EF4A6728C158A0BFEC0"
+ {
+ "Name" = "8:#1902"
+ "Sequence" = "3:2"
+ "Attributes" = "3:3"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A464CE15CB6B4EBD8002FCF64B25F9F0"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Finished"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E1A90A55B08D47AB81224F2717FF1C8D"
+ {
+ "Name" = "8:#1901"
+ "Sequence" = "3:2"
+ "Attributes" = "3:2"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_40EFCCE2771040DB9A2BC3584D440B44"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Progress"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "ShowProgress"
+ {
+ "Name" = "8:ShowProgress"
+ "DisplayName" = "8:#1009"
+ "Description" = "8:#1109"
+ "Type" = "3:5"
+ "ContextData" = "8:1;True=1;False=0"
+ "Attributes" = "3:0"
+ "Setting" = "3:0"
+ "Value" = "3:1"
+ "DefaultValue" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F3B36666230B471BBD5F19C85329DFA3"
+ {
+ "Name" = "8:#1900"
+ "Sequence" = "3:2"
+ "Attributes" = "3:1"
+ "Dialogs"
+ {
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_488C757DE3BF4488B917842494386BCE"
+ {
+ "Sequence" = "3:200"
+ "DisplayName" = "8:Installation Folder"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A3A6A0CF6B0241A392124B3CDFEB2B6F"
+ {
+ "Sequence" = "3:100"
+ "DisplayName" = "8:Welcome"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "CopyrightWarning"
+ {
+ "Name" = "8:CopyrightWarning"
+ "DisplayName" = "8:#1002"
+ "Description" = "8:#1102"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1202"
+ "DefaultValue" = "8:#1202"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ "Welcome"
+ {
+ "Name" = "8:Welcome"
+ "DisplayName" = "8:#1003"
+ "Description" = "8:#1103"
+ "Type" = "3:3"
+ "ContextData" = "8:"
+ "Attributes" = "3:0"
+ "Setting" = "3:1"
+ "Value" = "8:#1203"
+ "DefaultValue" = "8:#1203"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E667812EA6BC4613911EFDF53B37DFA6"
+ {
+ "Sequence" = "3:300"
+ "DisplayName" = "8:Confirm Installation"
+ "UseDynamicProperties" = "11:TRUE"
+ "IsDependency" = "11:FALSE"
+ "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
+ "Properties"
+ {
+ "BannerBitmap"
+ {
+ "Name" = "8:BannerBitmap"
+ "DisplayName" = "8:#1001"
+ "Description" = "8:#1101"
+ "Type" = "3:8"
+ "ContextData" = "8:Bitmap"
+ "Attributes" = "3:4"
+ "Setting" = "3:1"
+ "UsePlugInResources" = "11:TRUE"
+ }
+ }
+ }
+ }
+ }
+ }
+ "MergeModule"
+ {
+ }
+ "ProjectOutput"
+ {
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_136196DD2763419D959721C2BA143498"
+ {
+ "SourcePath" = "8:..\\Tango.MachineStudio.UI\\obj\\Debug\\Tango.MachineStudio.UI.exe"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:Built"
+ "OutputProjectGuid" = "8:{116DFDB0-7681-46FE-8BAD-FE8AE09BB076}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_88F4B9AD85B348AA835884EA6B695677"
+ {
+ "SourcePath" = "8:"
+ "TargetName" = "8:"
+ "Tag" = "8:"
+ "Folder" = "8:_C15E39669002469F98F297C08D55903C"
+ "Condition" = "8:"
+ "Transitive" = "11:FALSE"
+ "Vital" = "11:TRUE"
+ "ReadOnly" = "11:FALSE"
+ "Hidden" = "11:FALSE"
+ "System" = "11:FALSE"
+ "Permanent" = "11:FALSE"
+ "SharedLegacy" = "11:FALSE"
+ "PackageAs" = "3:1"
+ "Register" = "3:1"
+ "Exclude" = "11:FALSE"
+ "IsDependency" = "11:FALSE"
+ "IsolateTo" = "8:"
+ "ProjectOutputGroupRegister" = "3:1"
+ "OutputConfiguration" = "8:"
+ "OutputGroupCanonicalName" = "8:ContentFiles"
+ "OutputProjectGuid" = "8:{116DFDB0-7681-46FE-8BAD-FE8AE09BB076}"
+ "ShowKeyOutput" = "11:TRUE"
+ "ExcludeFilters"
+ {
+ }
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml
index 8e5876e79..fe50851a0 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml
@@ -11,7 +11,10 @@
<!-- Accent and AppTheme setting -->
<ResourceDictionary Source="pack://application:,,,/Tango.MachineStudio.Common;component/Resources/MaterialDesign.xaml"></ResourceDictionary>
- <!-- Include the Dragablz Material Design style -->
+ <!--RealTimeGraphEx-->
+ <ResourceDictionary Source="pack://application:,,,/RealTimeGraphEx;component/Resources/Resources.xaml"></ResourceDictionary>
+
+ <!-- Include the Dragablz Material Design style -->
<ResourceDictionary Source="pack://application:,,,/Dragablz;component/Themes/materialdesign.xaml"/>
<ResourceDictionary>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
index ca553de1e..c15a87980 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
@@ -2,10 +2,14 @@
using System.Collections.Generic;
using System.Configuration;
using System.Data;
+using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
+using Tango.Logging;
+using Tango.MachineStudio.UI.Windows;
+using Tango.Settings;
namespace Tango.MachineStudio.UI
{
@@ -14,9 +18,63 @@ namespace Tango.MachineStudio.UI
/// </summary>
public partial class App : Application
{
+ private WpfGlobalExceptionTrapper exceptionTrapper;
+
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
+
+ LogManager.Categories.Clear();
+
+ if (SettingsManager.Default.MachineStudio.LoggingCategories.Count == 0)
+ {
+ SettingsManager.Default.MachineStudio.LoggingCategories.Add(LogCategory.Critical);
+ SettingsManager.Default.MachineStudio.LoggingCategories.Add(LogCategory.Error);
+ SettingsManager.Default.MachineStudio.LoggingCategories.Add(LogCategory.General);
+ SettingsManager.Default.MachineStudio.LoggingCategories.Add(LogCategory.Warning);
+ }
+
+ LogManager.Categories.AddRange(SettingsManager.Default.MachineStudio.LoggingCategories);
+
+ LogManager.RegisterLogger(new VSOutputLogger());
+ LogManager.RegisterLogger(new FileLogger());
+
+ exceptionTrapper = new WpfGlobalExceptionTrapper();
+ exceptionTrapper.Initialize(this);
+ exceptionTrapper.ApplicationCrashed += ExceptionTrapper_ApplicationCrashed;
}
+
+ #region Global Exception Trapping
+
+ /// <summary>
+ /// Handles the ApplicationCrashed event of the ExceptionTrapper.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="ApplicationCrashedEventArgs"/> instance containing the event data.</param>
+ private void ExceptionTrapper_ApplicationCrashed(object sender, ApplicationCrashedEventArgs e)
+ {
+ ExceptionWindow exWin = new ExceptionWindow(e.Exception);
+ exWin.ShowDialog();
+
+ switch (exWin.Resolution)
+ {
+ case ExceptionResolutions.Ignore:
+ e.TryRecover = true;
+ break;
+ case ExceptionResolutions.Restart:
+ e.TryRecover = false;
+ LogManager.Log("User selection was to restart the application. Restarting...");
+ Process.Start(Application.ResourceAssembly.Location);
+ Environment.Exit(0);
+ break;
+ case ExceptionResolutions.Shutdown:
+ e.TryRecover = false;
+ LogManager.Log("User selection was to shutdown the application. Restarting...");
+ Environment.Exit(0);
+ break;
+ }
+ }
+
+ #endregion
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Authentication/DefaultAuthenticationProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Authentication/DefaultAuthenticationProvider.cs
index a30cf0f92..82aba268d 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Authentication/DefaultAuthenticationProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Authentication/DefaultAuthenticationProvider.cs
@@ -5,15 +5,22 @@ using System.Security.Authentication;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
-using Tango.DAL.Observables;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Authentication;
namespace Tango.MachineStudio.UI.Authentication
{
+ /// <summary>
+ /// Represents the default Machine Studio <see cref="IAuthenticationProvider">Authentication provider</see>
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="Tango.MachineStudio.Common.Authentication.IAuthenticationProvider" />
public class DefaultAuthenticationProvider : ExtendedObject, IAuthenticationProvider
{
private User _currentUser;
-
+ /// <summary>
+ /// Gets the current logged-in user.
+ /// </summary>
public User CurrentUser
{
get { return _currentUser; }
@@ -25,8 +32,18 @@ namespace Tango.MachineStudio.UI.Authentication
}
}
+ /// <summary>
+ /// Occurs when the current logged-in user has changed.
+ /// </summary>
public event EventHandler<User> CurrentUserChanged;
+ /// <summary>
+ /// Performs a user login by the specified email and password.
+ /// </summary>
+ /// <param name="email">The email.</param>
+ /// <param name="password">The password.</param>
+ /// <returns></returns>
+ /// <exception cref="AuthenticationException">Login failed for user " + email</exception>
public User Login(string email, string password)
{
User user = ObservablesEntitiesAdapter.Instance.Users.SingleOrDefault(x => x.Email.ToLower() == email.ToLower() && x.Password == password);
@@ -40,6 +57,9 @@ namespace Tango.MachineStudio.UI.Authentication
return user;
}
+ /// <summary>
+ /// Logs-out the current logged-in user.
+ /// </summary>
public void Logout()
{
CurrentUser = null;
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/White-Abstract.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/White-Abstract.png
new file mode 100644
index 000000000..31bd18c35
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/White-Abstract.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/exception.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/exception.png
new file mode 100644
index 000000000..9a4abb703
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/exception.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-tcp.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-tcp.png
index 2d8c684b7..192cbcaa7 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-tcp.png
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-tcp.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-usb.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-usb.png
index 62fab6225..414bbab04 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-usb.png
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/external-bridge-usb.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml
index f07e7f476..e0f0b1f4f 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml
@@ -8,27 +8,37 @@
xmlns:views="clr-namespace:Tango.MachineStudio.UI.Views"
xmlns:sharedControls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
mc:Ignorable="d"
- Title="Tango" Height="720" Width="1280" WindowStartupLocation="CenterOwner" WindowState="Maximized" Foreground="#494949">
+ Title="Tango" Height="800" Width="1280" WindowStartupLocation="CenterOwner" WindowState="Maximized" Foreground="#494949" BorderThickness="1" BorderBrush="{StaticResource AccentColorBrush}">
+
<Grid>
- <sharedControls:MultiTransitionControl AlwaysFade="True" TransitionType="Zoom" x:Name="TransitionControl" x:FieldModifier="public">
- <sharedControls:MultiTransitionControl.Controls>
- <ContentControl Tag="LoadingView">
- <views:LoadingView></views:LoadingView>
- </ContentControl>
- <ContentControl Tag="LoginView">
- <views:LoginView></views:LoginView>
- </ContentControl>
- <ContentControl Tag="MainView">
- <views:MainView></views:MainView>
- </ContentControl>
- <ContentControl Tag="ShutdownView">
- <views:ShutdownView></views:ShutdownView>
- </ContentControl>
- </sharedControls:MultiTransitionControl.Controls>
- </sharedControls:MultiTransitionControl>
+ <Grid.Background>
+ <ImageBrush ImageSource="/Images/White-Abstract.png" Stretch="Fill"></ImageBrush>
+ </Grid.Background>
+ <Viewbox Stretch="Fill" UseLayoutRounding="True" SnapsToDevicePixels="True">
+ <Grid Width="1920" Height="1145">
+ <Grid>
+ <sharedControls:MultiTransitionControl AlwaysFade="True" TransitionType="Zoom" x:Name="TransitionControl" x:FieldModifier="public">
+ <sharedControls:MultiTransitionControl.Controls>
+ <ContentControl Tag="LoadingView">
+ <views:LoadingView></views:LoadingView>
+ </ContentControl>
+ <ContentControl Tag="LoginView">
+ <views:LoginView></views:LoginView>
+ </ContentControl>
+ <ContentControl Tag="MainView">
+ <views:MainView></views:MainView>
+ </ContentControl>
+ <ContentControl Tag="ShutdownView">
+ <views:ShutdownView></views:ShutdownView>
+ </ContentControl>
+ </sharedControls:MultiTransitionControl.Controls>
+ </sharedControls:MultiTransitionControl>
- <Grid Background="Black" Opacity="0.7" x:Name="shadowGrid" Visibility="Hidden">
+ <Grid Background="Black" Opacity="0.7" x:Name="shadowGrid" Visibility="Hidden">
- </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Viewbox>
</Grid>
</mahapps:MetroWindow>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
index 473e66d38..5951137e3 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
@@ -1,4 +1,5 @@
-using System;
+using GalaSoft.MvvmLight.Ioc;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
@@ -7,6 +8,8 @@ using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
+using Tango.Integration.Observables;
+using Tango.Logging;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.Authentication;
using Tango.MachineStudio.Common.Modules;
@@ -16,11 +19,21 @@ using Tango.MachineStudio.Stubs;
namespace Tango.MachineStudio.UI.Modules
{
+ /// <summary>
+ /// Represents the Machine Studio default <see cref="IStudioModuleLoader">module loader</see>.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="Tango.MachineStudio.Common.Modules.IStudioModuleLoader" />
public class DefaultStudioModuleLoader : ExtendedObject, IStudioModuleLoader
{
private IAuthenticationProvider _authenticationProvider;
private bool _loaded;
+ public event EventHandler ModulesLoaded;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultStudioModuleLoader"/> class.
+ /// </summary>
+ /// <param name="authenticationProvider">The authentication provider.</param>
public DefaultStudioModuleLoader(IAuthenticationProvider authenticationProvider)
{
_authenticationProvider = authenticationProvider;
@@ -29,12 +42,20 @@ namespace Tango.MachineStudio.UI.Modules
_authenticationProvider.CurrentUserChanged += _authenticationProvider_CurrentUserChanged;
}
- private void _authenticationProvider_CurrentUserChanged(object sender, DAL.Observables.User e)
+ /// <summary>
+ /// Handles the authentication provider user changed event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void _authenticationProvider_CurrentUserChanged(object sender, User e)
{
LoadModules();
}
private ObservableCollection<IStudioModule> _allModules;
+ /// <summary>
+ /// Gets all loaded modules.
+ /// </summary>
public ObservableCollection<IStudioModule> AllModules
{
get { return _allModules; }
@@ -42,12 +63,18 @@ namespace Tango.MachineStudio.UI.Modules
}
private ObservableCollection<IStudioModule> _userModules;
+ /// <summary>
+ /// Gets all the user permitted modules.
+ /// </summary>
public ObservableCollection<IStudioModule> UserModules
{
get { return _userModules; }
private set { _userModules = value; RaisePropertyChangedAuto(); }
}
+ /// <summary>
+ /// Loads all available Machine Studio modules.
+ /// </summary>
public void LoadModules()
{
if (!_loaded)
@@ -70,12 +97,19 @@ namespace Tango.MachineStudio.UI.Modules
if (moduleAssembly != null)
{
- foreach (var moduleType in moduleAssembly.GetTypes().Where(x => !x.IsInterface && typeof(IStudioModule).IsAssignableFrom(x)))
+ foreach (var moduleType in moduleAssembly.GetTypes().Where(x => !x.IsInterface && typeof(IStudioModule).IsAssignableFrom(x) && !x.IsAbstract))
{
if (!AllModules.ToList().Exists(x => x.GetType() == moduleType))
{
- var module = Activator.CreateInstance(moduleType) as IStudioModule;
- AllModules.Add(module);
+ try
+ {
+ var module = Activator.CreateInstance(moduleType) as IStudioModule;
+ AllModules.Add(module);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Could not load module " + moduleType.Name);
+ }
}
}
}
@@ -92,6 +126,18 @@ namespace Tango.MachineStudio.UI.Modules
{
UserModules = AllModules.Where(x => _authenticationProvider.CurrentUser.HasPermission(x.Permission)).ToObservableCollection();
}
+
+ ModulesLoaded?.Invoke(this, new EventArgs());
+ }
+
+ /// <summary>
+ /// Gets the studio module of type T if loaded.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns></returns>
+ public T GetStudioModule<T>() where T : IStudioModule
+ {
+ return UserModules.OfType<T>().FirstOrDefault();
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Navigation/DefaultNavigationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Navigation/DefaultNavigationManager.cs
index 15f2fe422..56abbd702 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Navigation/DefaultNavigationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Navigation/DefaultNavigationManager.cs
@@ -3,12 +3,21 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.Navigation;
namespace Tango.MachineStudio.UI.Navigation
{
+ /// <summary>
+ /// Represents the Machine Studio default <see cref="INavigationManager">Navigation Manager</see>.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Navigation.INavigationManager" />
public class DefaultNavigationManager : INavigationManager
{
+ /// <summary>
+ /// Navigates to the specified view.
+ /// </summary>
+ /// <param name="view">The view.</param>
public void NavigateTo(NavigationView view)
{
MainWindow.Instance.Dispatcher.Invoke(() =>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DefaultNotificationProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DefaultNotificationProvider.cs
index d4d053eaf..1ea22c587 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DefaultNotificationProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DefaultNotificationProvider.cs
@@ -13,31 +13,68 @@ using System.Collections.ObjectModel;
namespace Tango.MachineStudio.UI.Notifications
{
+ /// <summary>
+ /// Represents the default Machine Studio <see cref="INotificationProvider">Notification Provider</see>.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="Tango.MachineStudio.Common.Notifications.INotificationProvider" />
public class DefaultNotificationProvider : ExtendedObject, INotificationProvider
{
+ /// <summary>
+ /// The view types
+ /// </summary>
private static List<Type> viewTypes;
+ /// <summary>
+ /// Gets the collection of active task items.
+ /// </summary>
public ObservableCollection<TaskItem> TaskItems { get; private set; }
+ /// <summary>
+ /// Gets the collection of active bar items.
+ /// </summary>
+ public ObservableCollection<BarItem> BarItems { get; private set; }
+
+ /// <summary>
+ /// Gets a value indicating whether there are any queued task items.
+ /// </summary>
public bool HasTaskItems
{
get { return TaskItems.Count > 0; }
}
+ /// <summary>
+ /// The current task item
+ /// </summary>
private TaskItem _currentTaskItem;
+ /// <summary>
+ /// Gets the current displayed task item.
+ /// </summary>
public TaskItem CurrentTaskItem
{
get { return _currentTaskItem; }
set { _currentTaskItem = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(HasTaskItems)); }
}
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultNotificationProvider"/> class.
+ /// </summary>
public DefaultNotificationProvider()
{
TaskItems = new ObservableCollection<TaskItem>();
+ BarItems = new ObservableCollection<BarItem>();
}
- public bool? ShowDialog(PackIconKind icon, Brush iconColor, string message, bool hasCancel)
+ /// <summary>
+ /// Display a message box.
+ /// </summary>
+ /// <param name="icon">The icon.</param>
+ /// <param name="iconColor">Color of the icon.</param>
+ /// <param name="message">The message.</param>
+ /// <param name="hasCancel">if set to <c>true</c> displays the cancel button.</param>
+ /// <returns></returns>
+ public bool? ShowMessageBox(PackIconKind icon, Brush iconColor, string message, bool hasCancel)
{
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
@@ -55,6 +92,13 @@ namespace Tango.MachineStudio.UI.Notifications
return result;
}
+ /// <summary>
+ /// Creates a new instance of the specified View type and displays it as a modal dialog.
+ /// </summary>
+ /// <typeparam name="View">The type of the view.</typeparam>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
+ /// <param name="onCancel">Cancel button callback.</param>
public void ShowModalDialog<View, VM>(Action<VM> onAccept, Action onCancel) where View : FrameworkElement where VM : DialogViewVM
{
var view = Activator.CreateInstance<View>();
@@ -68,7 +112,7 @@ namespace Tango.MachineStudio.UI.Notifications
dialog.DataContext = context;
Action onAcceptAction = null;
- onAcceptAction = new Action(() =>
+ onAcceptAction = new Action(() =>
{
dialog.Close();
onAccept(context);
@@ -76,7 +120,7 @@ namespace Tango.MachineStudio.UI.Notifications
});
Action onCancelAction = null;
- onCancelAction = new Action(() =>
+ onCancelAction = new Action(() =>
{
dialog.Close();
@@ -97,6 +141,13 @@ namespace Tango.MachineStudio.UI.Notifications
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
+ /// <summary>
+ /// Creates a new view by a naming convention of the specified view model type.
+ /// </summary>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
+ /// <param name="onCancel">Cancel button callback.</param>
+ /// <exception cref="NullReferenceException">Could not locate view " + viewName</exception>
public void ShowModalDialog<VM>(Action<VM> onAccept, Action onCancel) where VM : DialogViewVM
{
String viewName = typeof(VM).Name.Replace("VM", "");
@@ -121,6 +172,10 @@ namespace Tango.MachineStudio.UI.Notifications
view.Loaded += (x, y) =>
{
VM context = view.DataContext as VM;
+ if (context == null)
+ {
+ context = Activator.CreateInstance<VM>();
+ }
dialog.DataContext = context;
Action onAcceptAction = null;
@@ -149,42 +204,73 @@ namespace Tango.MachineStudio.UI.Notifications
context.OnShow();
};
-
+
dialog.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
+ /// <summary>
+ /// Creates a new view by a naming convention of the specified view model type.
+ /// </summary>
+ /// <typeparam name="VM">The type of the view model.</typeparam>
+ /// <param name="onAccept">Accept button callback.</param>
public void ShowModalDialog<VM>(Action<VM> onAccept) where VM : DialogViewVM
{
ShowModalDialog<VM>(onAccept, null);
}
+ /// <summary>
+ /// Shows an error message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
public void ShowError(string message)
{
- ShowDialog(PackIconKind.Exclamation, Brushes.Red, message, false);
+ ShowMessageBox(PackIconKind.Exclamation, Brushes.Red, message, false);
}
+ /// <summary>
+ /// Shows an information message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
public void ShowInfo(string message)
{
- ShowDialog(PackIconKind.Information, Brushes.Black, message, false);
+ ShowMessageBox(PackIconKind.Information, Brushes.Black, message, false);
}
+ /// <summary>
+ /// Shows a question message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <returns></returns>
public bool ShowQuestion(string message)
{
- return ShowDialog(PackIconKind.CommentQuestionOutline, Brushes.Black, message, true).Value;
+ return ShowMessageBox(PackIconKind.CommentQuestionOutline, Brushes.Black, message, true).Value;
}
- public void ShowWarnning(string message)
+ /// <summary>
+ /// Shows warning message box.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ public void ShowWarning(string message)
{
- ShowDialog(PackIconKind.Exclamation, Brushes.DarkOrange, message, false);
+ ShowMessageBox(PackIconKind.Exclamation, Brushes.DarkOrange, message, false);
}
+ /// <summary>
+ /// Pushes the specified task item to the queue.
+ /// </summary>
+ /// <param name="taskItem">The task item.</param>
public void PushTaskItem(TaskItem taskItem)
{
TaskItems.Add(taskItem);
CurrentTaskItem = taskItem;
}
+ /// <summary>
+ /// Create and push a new task item from the specified message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <returns></returns>
public TaskItem PushTaskItem(string message)
{
TaskItem item = new TaskItem(this);
@@ -193,6 +279,10 @@ namespace Tango.MachineStudio.UI.Notifications
return item;
}
+ /// <summary>
+ /// Removed the specified task item from the queue.
+ /// </summary>
+ /// <param name="taskItem">The task item.</param>
public void PopTaskItem(TaskItem taskItem)
{
TaskItems.Remove(taskItem);
@@ -204,5 +294,65 @@ namespace Tango.MachineStudio.UI.Notifications
RaisePropertyChanged(nameof(HasTaskItems));
}
+
+ /// <summary>
+ /// Pushes the specified bar item.
+ /// </summary>
+ /// <param name="barItem">The bar item.</param>
+ /// <returns></returns>
+ public BarItem PushBarItem(BarItem barItem)
+ {
+ BarItems.Add(barItem);
+ return barItem;
+ }
+
+ /// <summary>
+ /// Creates and push a new bar item from the specified framework element.
+ /// </summary>
+ /// <param name="element">The element.</param>
+ /// <returns></returns>
+ public BarItem PushBarItem(FrameworkElement element)
+ {
+ BarItem item = new BarItem(this);
+ item.Element = element;
+ PushBarItem(item);
+ return item;
+ }
+
+ /// <summary>
+ /// Removed the specified bar item.
+ /// </summary>
+ /// <param name="barItem">The bar item.</param>
+ public void PopBarItem(BarItem barItem)
+ {
+ BarItems.Remove(barItem);
+ }
+
+ /// <summary>
+ /// Shows a dialog with a text input field and returns the response.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <param name="hint">Text field hint.</param>
+ /// <param name="defaultResponse">Optional default response.</param>
+ /// <returns></returns>
+ public string ShowTextInput(string message, string hint, string defaultResponse = null)
+ {
+ MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
+
+ TextInputBoxWindow dlg = new TextInputBoxWindow()
+ {
+ Owner = Application.Current.MainWindow,
+ Message = message,
+ IconKind = PackIconKind.Pencil,
+ IconColor = Brushes.DimGray,
+ Hint = hint,
+ Response = defaultResponse
+ };
+
+ var result = dlg.ShowDialog();
+
+ MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
+ return (result.Value ? dlg.Response : null);
+ }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DialogWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DialogWindow.xaml.cs
index d1bc0564b..8ed1a4946 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DialogWindow.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/DialogWindow.xaml.cs
@@ -36,7 +36,5 @@ namespace Tango.MachineStudio.UI.Windows
// Using a DependencyProperty as the backing store for InnerContent. This enables animation, styling, binding, etc...
public static readonly DependencyProperty InnerContentProperty =
DependencyProperty.Register("InnerContent", typeof(FrameworkElement), typeof(DialogWindow), new PropertyMetadata(null));
-
-
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml
new file mode 100644
index 000000000..d2aad7cee
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml
@@ -0,0 +1,44 @@
+<Window x:Class="Tango.MachineStudio.UI.Notifications.TextInputBoxWindow"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:local="clr-namespace:Tango.MachineStudio.UI.Notifications"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ mc:Ignorable="d"
+ Title="Machine Studio" MinHeight="220" MaxHeight="600" SizeToContent="Height" Width="570" Opacity="0" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterOwner" Background="Transparent">
+
+ <Window.Resources>
+ <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"></BooleanToVisibilityConverter>
+ </Window.Resources>
+
+ <Grid>
+ <Border Background="White" CornerRadius="10" Padding="10" Margin="20">
+ <Border.Effect>
+ <DropShadowEffect ShadowDepth="0" BlurRadius="10"></DropShadowEffect>
+ </Border.Effect>
+ <DockPanel LastChildFill="True">
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
+ <Button Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 8 8 0" Click="OnOKClicked">
+ ACCEPT
+ </Button>
+ <Button Style="{StaticResource MaterialDesignFlatButton}" IsCancel="False" Margin="0 8 8 0" Click="OnCancelClicked">
+ CANCEL
+ </Button>
+ </StackPanel>
+ <Grid>
+ <StackPanel VerticalAlignment="Top" Margin="0 30 0 0">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=IconKind}" VerticalAlignment="Top" Width="50" Height="50" Foreground="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=IconColor}" />
+ <TextBlock Padding="0 10 0 0" TextWrapping="Wrap" Margin="10 0 0 0" VerticalAlignment="Top" FontSize="14" Text="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=Message}" Width="400"></TextBlock>
+ </StackPanel>
+
+ <TextBox x:Name="txtText" Margin="60 0 20 0" materialDesign:HintAssist.Hint="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=Hint}" Text="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=Response,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
+ </StackPanel>
+ </Grid>
+ </DockPanel>
+ </Border>
+ </Grid>
+</Window>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml.cs
new file mode 100644
index 000000000..d774c14eb
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Notifications/TextInputBoxWindow.xaml.cs
@@ -0,0 +1,99 @@
+using MahApps.Metro.Controls;
+using MaterialDesignThemes.Wpf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.UI.Notifications
+{
+ /// <summary>
+ /// Interaction logic for TextInputBoxWindow.xaml
+ /// </summary>
+ public partial class TextInputBoxWindow : Window
+ {
+ public TextInputBoxWindow()
+ {
+ InitializeComponent();
+ this.Loaded += TextInputBoxWindow_Loaded;
+ }
+
+ private void TextInputBoxWindow_Loaded(object sender, RoutedEventArgs e)
+ {
+ DoubleAnimation ani = new DoubleAnimation();
+ ani.To = 1;
+ ani.Duration = TimeSpan.FromSeconds(0.5);
+ this.BeginAnimation(Window.OpacityProperty, ani);
+
+ txtText.Focus();
+ }
+
+
+
+ public String Hint
+ {
+ get { return (String)GetValue(HintProperty); }
+ set { SetValue(HintProperty, value); }
+ }
+ public static readonly DependencyProperty HintProperty =
+ DependencyProperty.Register("Hint", typeof(String), typeof(TextInputBoxWindow), new PropertyMetadata(null));
+
+
+
+ public String Response
+ {
+ get { return (String)GetValue(ResponseProperty); }
+ set { SetValue(ResponseProperty, value); }
+ }
+ public static readonly DependencyProperty ResponseProperty =
+ DependencyProperty.Register("Response", typeof(String), typeof(TextInputBoxWindow), new PropertyMetadata(null));
+
+
+
+ public String Message
+ {
+ get { return (String)GetValue(MessageProperty); }
+ set { SetValue(MessageProperty, value); }
+ }
+ public static readonly DependencyProperty MessageProperty =
+ DependencyProperty.Register("Message", typeof(String), typeof(TextInputBoxWindow), new PropertyMetadata(null));
+
+ public Brush IconColor
+ {
+ get { return (Brush)GetValue(IconColorProperty); }
+ set { SetValue(IconColorProperty, value); }
+ }
+ public static readonly DependencyProperty IconColorProperty =
+ DependencyProperty.Register("IconColor", typeof(Brush), typeof(TextInputBoxWindow), new PropertyMetadata(Brushes.Black));
+
+ public PackIconKind IconKind
+ {
+ get { return (PackIconKind)GetValue(IconKindProperty); }
+ set { SetValue(IconKindProperty, value); }
+ }
+ public static readonly DependencyProperty IconKindProperty =
+ DependencyProperty.Register("IconKind", typeof(PackIconKind), typeof(TextInputBoxWindow), new PropertyMetadata(PackIconKind.Information));
+
+ private void OnOKClicked(object sender, RoutedEventArgs e)
+ {
+ DialogResult = true;
+ Close();
+ }
+
+ private void OnCancelClicked(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
index de8649c13..886985c92 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
@@ -14,22 +14,50 @@ using System.Collections;
using Tango.Integration.Services;
using Tango.Core;
using Tango.Logging;
+using Tango.MachineStudio.Common.Modules;
+using Tango.MachineStudio.Common;
+using Tango.Settings;
namespace Tango.MachineStudio.UI.StudioApplication
{
+ /// <summary>
+ /// Represents the default Machine Studio <see cref="IStudioApplicationManager">Application Manager</see>.
+ /// </summary>
+ /// <seealso cref="Tango.Core.ExtendedObject" />
+ /// <seealso cref="Tango.MachineStudio.Common.StudioApplication.IStudioApplicationManager" />
public class DefaultStudioApplicationManager : ExtendedObject, IStudioApplicationManager
{
private INavigationManager _navigationManager;
+ private IStudioModuleLoader _moduleLoader;
- public DefaultStudioApplicationManager(INavigationManager navigationManager)
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultStudioApplicationManager" /> class.
+ /// </summary>
+ /// <param name="navigationManager">The navigation manager.</param>
+ public DefaultStudioApplicationManager(INavigationManager navigationManager, IStudioModuleLoader moduleLoader)
{
+ _moduleLoader = moduleLoader;
_navigationManager = navigationManager;
}
+ /// <summary>
+ /// Gets a value indicating whether Machine Studio is shutting down.
+ /// </summary>
public bool IsShuttingDown { get; private set; }
+ /// <summary>
+ /// The connected machine
+ /// </summary>
private IExternalBridgeClient _connectedMachine;
+ /// <summary>
+ /// Occurs when the connected machine property has changed.
+ /// </summary>
+ public event EventHandler<IExternalBridgeClient> ConnectedMachineChanged;
+
+ /// <summary>
+ /// Gets or sets the currently connected machine if any.
+ /// </summary>
public IExternalBridgeClient ConnectedMachine
{
get { return _connectedMachine; }
@@ -45,14 +73,24 @@ namespace Tango.MachineStudio.UI.StudioApplication
_connectedMachine.StateChanged -= ConnectedMachine_StateChanged;
_connectedMachine.StateChanged += ConnectedMachine_StateChanged;
}
+
+ ConnectedMachineChanged?.Invoke(this, _connectedMachine);
}
}
+ /// <summary>
+ /// Gets a value indicating whether the <see cref="P:Tango.MachineStudio.Common.StudioApplication.IStudioApplicationManager.ConnectedMachine" /> is valid and connected through TCP/IP.
+ /// </summary>
public bool IsMachineConnectedViaTCP
{
- get { return IsMachineConnected && ConnectedMachine.Type != ExternalBridgeClientType.USB; }
+ get { return IsMachineConnected && ConnectedMachine is ExternalBridgeTcpClient; }
}
+ /// <summary>
+ /// Handles the <see cref="ConnectedMachine"/> state changed event.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
private void ConnectedMachine_StateChanged(object sender, Transport.TransportComponentState e)
{
if (e == Transport.TransportComponentState.Disconnected || e == Transport.TransportComponentState.Failed)
@@ -62,11 +100,17 @@ namespace Tango.MachineStudio.UI.StudioApplication
}
+ /// <summary>
+ /// Gets a value indicating whether the <see cref="P:Tango.MachineStudio.Common.StudioApplication.IStudioApplicationManager.ConnectedMachine" /> is valid.
+ /// </summary>
public bool IsMachineConnected
{
get { return ConnectedMachine != null; }
}
+ /// <summary>
+ /// Shutdown the application.
+ /// </summary>
public async void ShutDown()
{
if (IsShuttingDown) return;
@@ -75,6 +119,24 @@ namespace Tango.MachineStudio.UI.StudioApplication
await Task.Factory.StartNew(async () =>
{
+ //Do Shutdown Procedures...
+ foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IShutdownRequestBlocker>())
+ {
+ try
+ {
+ var result = await vm.OnShutdownRequest();
+ if (!result)
+ {
+ IsShuttingDown = false;
+ return;
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error on shutdown request with " + vm.GetType().Name);
+ }
+ }
+
try
{
if (ConnectedMachine != null)
@@ -87,22 +149,52 @@ namespace Tango.MachineStudio.UI.StudioApplication
LogManager.Log(ex, "Error disconnecting from machine.");
}
- //Do Shutdown Procedures...
- foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IShutdownRequestBlocker>())
+ foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IShutdownListener>())
{
- var result = await vm.OnShutdownRequest();
- if (!result)
- {
- IsShuttingDown = false;
- return;
- }
+ vm.OnShuttingDown();
+ }
+
+ try
+ {
+ SettingsManager.SaveDefaultSettings();
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error saving settings.");
}
_navigationManager.NavigateTo(NavigationView.ShutdownView);
+
Thread.Sleep(3000);
+
Environment.Exit(0);
});
}
+
+ /// <summary>
+ /// Loads the specified module if permitted.
+ /// </summary>
+ /// <param name="moduleName">Name of the module.</param>
+ /// <param name="args">The arguments.</param>
+ public void RequestModule(string moduleName, object args)
+ {
+ IStudioModule module = _moduleLoader.UserModules.SingleOrDefault(x => x.Name == moduleName);
+
+ if (module != null)
+ {
+ ServiceLocator.Current.GetInstance<ViewModels.MainViewVM>().StartModule(module);
+
+ //Notify request listeners.
+ foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IModuleRequestListener>())
+ {
+ vm.OnRequestModule(module, args);
+ }
+ }
+ else
+ {
+ throw new InvalidOperationException("The module was not found or you do not have sufficient privileges.");
+ }
+ }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/SupervisingController/IMainView.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/SupervisingController/IMainView.cs
index 70b57027e..fd8ef4be5 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/SupervisingController/IMainView.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/SupervisingController/IMainView.cs
@@ -3,12 +3,21 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using Tango.MachineStudio.Common;
using Tango.SharedUI;
namespace Tango.MachineStudio.UI.SupervisingController
{
+ /// <summary>
+ /// Represents a supervising controller pattern view contract.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.IView" />
public interface IMainView : IView
{
-
+ /// <summary>
+ /// Navigates to the specified studio module.
+ /// </summary>
+ /// <param name="module">The module.</param>
+ void NavigateToModule(IStudioModule module);
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
index df8b65fda..f48561e40 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
@@ -120,6 +120,9 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
+ <Compile Include="Notifications\TextInputBoxWindow.xaml.cs">
+ <DependentUpon>TextInputBoxWindow.xaml</DependentUpon>
+ </Compile>
<Compile Include="StudioApplication\DefaultStudioApplicationManager.cs" />
<Compile Include="Authentication\DefaultAuthenticationProvider.cs" />
<Compile Include="Modules\DefaultStudioModuleLoader.cs" />
@@ -157,6 +160,10 @@
<Compile Include="Views\ShutdownView.xaml.cs">
<DependentUpon>ShutdownView.xaml</DependentUpon>
</Compile>
+ <Compile Include="Windows\ExceptionResolutions.cs" />
+ <Compile Include="Windows\ExceptionWindow.xaml.cs">
+ <DependentUpon>ExceptionWindow.xaml</DependentUpon>
+ </Compile>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -172,6 +179,10 @@
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
+ <Page Include="Notifications\TextInputBoxWindow.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
<Page Include="Notifications\MessageBoxWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -208,6 +219,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="Windows\ExceptionWindow.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
@@ -241,14 +256,14 @@
<Resource Include="design.ico" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\..\SideChains\RealTimeGraphEx\RealTimeGraphEx.csproj">
+ <Project>{b9ae25d6-be35-492f-9079-21a7f3e6f7cc}</Project>
+ <Name>RealTimeGraphEx</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj">
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
- <ProjectReference Include="..\..\Tango.DAL.Observables\Tango.DAL.Observables.csproj">
- <Project>{0ecd6da8-7aa6-48d9-8b65-279d176ad9af}</Project>
- <Name>Tango.DAL.Observables</Name>
- </ProjectReference>
<ProjectReference Include="..\..\Tango.DAL.Remote\Tango.DAL.Remote.csproj">
<Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project>
<Name>Tango.DAL.Remote</Name>
@@ -277,6 +292,10 @@
<Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
<Name>Tango.Transport</Name>
</ProjectReference>
+ <ProjectReference Include="..\Modules\Tango.MachineStudio.DataCapture\Tango.MachineStudio.DataCapture.csproj">
+ <Project>{fc337a7f-1214-41d8-9992-78092a3b961e}</Project>
+ <Name>Tango.MachineStudio.DataCapture</Name>
+ </ProjectReference>
<ProjectReference Include="..\Modules\Tango.MachineStudio.DB\Tango.MachineStudio.DB.csproj">
<Project>{94f7acf8-55e1-4a02-b9bc-a818413fdbbf}</Project>
<Name>Tango.MachineStudio.DB</Name>
@@ -297,6 +316,10 @@
<Project>{12d0c43c-391f-4c74-92ab-82e9a9beeb9b}</Project>
<Name>Tango.MachineStudio.Synchronization</Name>
</ProjectReference>
+ <ProjectReference Include="..\Modules\Tango.MachineStudio.Technician\Tango.MachineStudio.Technician.csproj">
+ <Project>{5d39c1e1-3ecd-4634-bd1b-2bcf71c54a15}</Project>
+ <Name>Tango.MachineStudio.Technician</Name>
+ </ProjectReference>
<ProjectReference Include="..\Tango.MachineStudio.Common\Tango.MachineStudio.Common.csproj">
<Project>{cb0b0aa2-bb24-4bca-a720-45e397684e12}</Project>
<Name>Tango.MachineStudio.Common</Name>
@@ -312,12 +335,15 @@
<Resource Include="Images\account.png" />
</ItemGroup>
<ItemGroup>
- <Folder Include="Controls\" />
+ <Resource Include="Images\White-Abstract.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\external-bridge-tcp.png" />
<Resource Include="Images\external-bridge-usb.png" />
</ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\exception.png" />
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>$(TargetDir)linkgen.exe -s "$(TargetPath)" -d "$(TargetDir)Utilities\Machine Studio.lnk"
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
index 70912ba98..1907074c0 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
@@ -5,10 +5,12 @@ using System;
using Tango.Integration.Services;
using Tango.Logging;
using Tango.MachineStudio.Common.Authentication;
+using Tango.MachineStudio.Common.Diagnostics;
using Tango.MachineStudio.Common.Modules;
using Tango.MachineStudio.Common.Navigation;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Common.StudioApplication;
+using Tango.MachineStudio.Common.Video;
using Tango.MachineStudio.UI.Authentication;
using Tango.MachineStudio.UI.Modules;
using Tango.MachineStudio.UI.Navigation;
@@ -17,6 +19,7 @@ using Tango.MachineStudio.UI.StudioApplication;
using Tango.MachineStudio.UI.SupervisingController;
using Tango.MachineStudio.UI.ViewModels;
using Tango.MachineStudio.UI.Views;
+using Tango.Settings;
namespace Tango.MachineStudio.UI
{
@@ -50,6 +53,8 @@ namespace Tango.MachineStudio.UI
SimpleIoc.Default.Unregister<IStudioModuleLoader>();
SimpleIoc.Default.Unregister<IStudioApplicationManager>();
SimpleIoc.Default.Unregister<ExternalBridgeScanner>();
+ SimpleIoc.Default.Unregister<IVideoCaptureProvider>();
+ SimpleIoc.Default.Unregister<IDiagnosticsFrameProvider>();
SimpleIoc.Default.Register<INotificationProvider, DefaultNotificationProvider>();
SimpleIoc.Default.Register<IAuthenticationProvider, DefaultAuthenticationProvider>();
@@ -57,6 +62,8 @@ namespace Tango.MachineStudio.UI
SimpleIoc.Default.Register<IStudioModuleLoader, DefaultStudioModuleLoader>();
SimpleIoc.Default.Register<IStudioApplicationManager, DefaultStudioApplicationManager>();
SimpleIoc.Default.Register<ExternalBridgeScanner, ExternalBridgeScanner>();
+ SimpleIoc.Default.Register<IVideoCaptureProvider, DefaultVideoCaptureProvider>();
+ SimpleIoc.Default.Register<IDiagnosticsFrameProvider, DefaultDiagnosticsFrameProvider>();
SimpleIoc.Default.Register<MainViewVM>();
SimpleIoc.Default.Register<LoadingViewVM>();
@@ -65,9 +72,6 @@ namespace Tango.MachineStudio.UI
SimpleIoc.Default.Register<MachineConnectionViewVM>();
SimpleIoc.Default.Register<MachineLoginViewVM>();
- LogManager.RegisterLogger(new VSOutputLogger());
- LogManager.RegisterLogger(new FileLogger());
-
//Register View (Supervising Controller Pattern).
if (!ViewModelBase.IsInDesignModeStatic)
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
index f213af0d4..55a54e8aa 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
@@ -4,8 +4,8 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using Tango.Core.Threading;
-using Tango.DAL.Observables;
+using Tango.Core.Helpers;
+using Tango.Integration.Observables;
using Tango.MachineStudio.Common.Modules;
using Tango.MachineStudio.Common.Navigation;
using Tango.MachineStudio.Common.Notifications;
@@ -13,12 +13,22 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the Machine Studio loading view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class LoadingViewVM : ViewModel
{
private INotificationProvider _notificationProvider;
private INavigationManager _navigationManager;
private IStudioModuleLoader _studioModuleLoader;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="LoadingViewVM"/> class.
+ /// </summary>
+ /// <param name="navigationManager">The navigation manager.</param>
+ /// <param name="studioModuleLoader">The studio module loader.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
public LoadingViewVM(INavigationManager navigationManager, IStudioModuleLoader studioModuleLoader, INotificationProvider notificationProvider)
{
_navigationManager = navigationManager;
@@ -27,9 +37,12 @@ namespace Tango.MachineStudio.UI.ViewModels
Load();
}
+ /// <summary>
+ /// Load application modules.
+ /// </summary>
private void Load()
{
- StaThreadHelper.StartStaThread(() =>
+ ThreadsHelper.StartStaThread(() =>
{
try
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
index 6fe90fa99..c5936eea8 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoginViewVM.cs
@@ -16,6 +16,10 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the Machine Studio login view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel" />
public class LoginViewVM : ViewModel
{
private IAuthenticationProvider _authenticationProvider;
@@ -24,6 +28,9 @@ namespace Tango.MachineStudio.UI.ViewModels
private Rfc2898Cryptographer cryptographer;
private String _email;
+ /// <summary>
+ /// Gets or sets the email.
+ /// </summary>
[Required(ErrorMessage = "Email is required")]
[EmailAddress(ErrorMessage = "Please enter a valid email")]
public String Email
@@ -33,16 +40,26 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private bool _rememberMe;
-
+ /// <summary>
+ /// Gets or sets a value indicating whether to remember the last user email and password.
+ /// </summary>
public bool RememberMe
{
get { return _rememberMe; }
set { _rememberMe = value; RaisePropertyChangedAuto(); }
}
-
+ /// <summary>
+ /// Gets or sets the login command.
+ /// </summary>
public RelayCommand<String> LoginCommand { get; set; }
+ /// <summary>
+ /// Initializes a new instance of the <see cref="LoginViewVM"/> class.
+ /// </summary>
+ /// <param name="authenticationProvider">The authentication provider.</param>
+ /// <param name="navigationManager">The navigation manager.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
public LoginViewVM(IAuthenticationProvider authenticationProvider, INavigationManager navigationManager, INotificationProvider notificationProvider)
{
_notificationProvider = notificationProvider;
@@ -55,6 +72,10 @@ namespace Tango.MachineStudio.UI.ViewModels
RememberMe = SettingsManager.Default.MachineStudio.RememberMe;
}
+ /// <summary>
+ /// Logins the requested user.
+ /// </summary>
+ /// <param name="password">The password.</param>
private void Login(String password)
{
if (Validate())
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineConnectionViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineConnectionViewVM.cs
index b8b888e86..23be8d274 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineConnectionViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineConnectionViewVM.cs
@@ -10,10 +10,16 @@ using Tango.SharedUI;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the Machine Studio connection dialog, view model.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Notifications.DialogViewVM" />
public class MachineConnectionViewVM : DialogViewVM
{
private ExternalBridgeScanner _scanner;
-
+ /// <summary>
+ /// Gets or sets the machine scanner.
+ /// </summary>
public ExternalBridgeScanner Scanner
{
get { return _scanner; }
@@ -21,15 +27,24 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private IExternalBridgeClient _selectedMachine;
-
+ /// <summary>
+ /// Gets or sets the selected machine.
+ /// </summary>
public IExternalBridgeClient SelectedMachine
{
get { return _selectedMachine; }
set { _selectedMachine = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
}
+ /// <summary>
+ /// Gets or sets the connect command.
+ /// </summary>
public RelayCommand ConnectCommand { get; set; }
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineConnectionViewVM"/> class.
+ /// </summary>
+ /// <param name="scanner">The scanner.</param>
public MachineConnectionViewVM(ExternalBridgeScanner scanner)
{
Scanner = scanner;
@@ -37,6 +52,9 @@ namespace Tango.MachineStudio.UI.ViewModels
Scanner.Start();
}
+ /// <summary>
+ /// Connect to the currently selected machine.
+ /// </summary>
private void Connect()
{
if (SelectedMachine != null)
@@ -45,10 +63,12 @@ namespace Tango.MachineStudio.UI.ViewModels
}
}
+ /// <summary>
+ /// Called when the dialog has been shown.
+ /// </summary>
public override void OnShow()
{
base.OnShow();
-
Scanner.AvailableMachines.Clear();
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineLoginViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineLoginViewVM.cs
index a6ee9ee2a..20c2e3afb 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineLoginViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MachineLoginViewVM.cs
@@ -8,20 +8,40 @@ using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the machine login dialog, view model.
+ /// </summary>
+ /// <seealso cref="Tango.MachineStudio.Common.Notifications.DialogViewVM" />
public class MachineLoginViewVM : DialogViewVM
{
+ /// <summary>
+ /// Gets or sets the machine password.
+ /// </summary>
public String Password { get; set; }
+ /// <summary>
+ /// Gets or sets the login command.
+ /// </summary>
public RelayCommand<String> LoginCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the cancel command.
+ /// </summary>
public RelayCommand CancelCommand { get; set; }
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineLoginViewVM"/> class.
+ /// </summary>
public MachineLoginViewVM()
{
LoginCommand = new RelayCommand<string>(Login);
CancelCommand = new RelayCommand(Cancel);
}
+ /// <summary>
+ /// Invoked when user presses the login button.
+ /// </summary>
+ /// <param name="password">The password.</param>
private void Login(string password)
{
Password = password;
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
index b21b23935..679ba5ff3 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
@@ -1,4 +1,5 @@
-using System;
+using GalaSoft.MvvmLight.Ioc;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
@@ -7,6 +8,7 @@ using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
+using Tango.Integration.Services;
using Tango.Logging;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.Authentication;
@@ -22,12 +24,19 @@ using Tango.Transport.Adapters;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the Machine Studio main view, view model.
+ /// </summary>
+ /// <seealso cref="Tango.SharedUI.ViewModel{Tango.MachineStudio.UI.SupervisingController.IMainView}" />
public class MainViewVM : ViewModel<IMainView>
{
private IStudioModule _currentModule;
private INavigationManager _navigation;
private bool _isDisconnecting;
+ /// <summary>
+ /// Gets or sets the current loaded module.
+ /// </summary>
public IStudioModule CurrentModule
{
get { return _currentModule; }
@@ -35,33 +44,54 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private bool _isModuleLoaded;
-
+ /// <summary>
+ /// Gets or sets a value indicating whether any module is loaded at the moment.
+ /// </summary>
public bool IsModuleLoaded
{
get { return _isModuleLoaded; }
set { _isModuleLoaded = value; RaisePropertyChangedAuto(); }
}
-
private bool _isMenuOpened;
-
+ /// <summary>
+ /// Gets or sets a value indicating whether the side menu is opened.
+ /// </summary>
public bool IsMenuOpened
{
get { return _isMenuOpened; }
set { _isMenuOpened = value; RaisePropertyChangedAuto(); }
}
+ /// <summary>
+ /// Gets or sets the start module command.
+ /// </summary>
public RelayCommand<IStudioModule> StartModuleCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the home command.
+ /// </summary>
public RelayCommand HomeCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the connect command.
+ /// </summary>
public RelayCommand ConnectCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the disconnect command.
+ /// </summary>
public RelayCommand DisconnectCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the sign-out command.
+ /// </summary>
public RelayCommand SignoutCommand { get; set; }
private IAuthenticationProvider _authenticationProvider;
+ /// <summary>
+ /// Gets or sets the authentication provider.
+ /// </summary>
public IAuthenticationProvider AuthenticationProvider
{
get { return _authenticationProvider; }
@@ -69,7 +99,9 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private IStudioModuleLoader _studioModuleLoader;
-
+ /// <summary>
+ /// Gets or sets the studio module loader.
+ /// </summary>
public IStudioModuleLoader StudioModuleLoader
{
get { return _studioModuleLoader; }
@@ -77,7 +109,9 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private INotificationProvider _notificationProvider;
-
+ /// <summary>
+ /// Gets or sets the notification provider.
+ /// </summary>
public INotificationProvider NotificationProvider
{
get { return _notificationProvider; }
@@ -85,15 +119,24 @@ namespace Tango.MachineStudio.UI.ViewModels
}
private IStudioApplicationManager _applicationManager;
-
+ /// <summary>
+ /// Gets or sets the application manager.
+ /// </summary>
public IStudioApplicationManager ApplicationManager
{
get { return _applicationManager; }
set { _applicationManager = value; RaisePropertyChangedAuto(); }
}
-
-
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainViewVM"/> class.
+ /// </summary>
+ /// <param name="view">The view.</param>
+ /// <param name="authenticationProvider">The authentication provider.</param>
+ /// <param name="studioModuleLoader">The studio module loader.</param>
+ /// <param name="notificationProvider">The notification provider.</param>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="navigationManager">The navigation manager.</param>
public MainViewVM(
IMainView view,
IAuthenticationProvider authenticationProvider,
@@ -116,6 +159,9 @@ namespace Tango.MachineStudio.UI.ViewModels
DisconnectCommand = new RelayCommand(DisconnectFromMachine, (x) => ApplicationManager.IsMachineConnected && !_isDisconnecting);
}
+ /// <summary>
+ /// Disconnected from the current connected machine.
+ /// </summary>
private async void DisconnectFromMachine()
{
using (_notificationProvider.PushTaskItem("Disconnecting from machine..."))
@@ -129,6 +175,9 @@ namespace Tango.MachineStudio.UI.ViewModels
}
}
+ /// <summary>
+ /// Signs-out the current logged-in user.
+ /// </summary>
private void SignOut()
{
_authenticationProvider.Logout();
@@ -137,6 +186,9 @@ namespace Tango.MachineStudio.UI.ViewModels
IsMenuOpened = false;
}
+ /// <summary>
+ /// Opens the machine connection dialog to allow the user to scan and connect to remote machines view USB/TCP.
+ /// </summary>
private void ConnectToMachine()
{
_notificationProvider.ShowModalDialog<MachineConnectionViewVM>(async (x) =>
@@ -152,17 +204,17 @@ namespace Tango.MachineStudio.UI.ViewModels
}
}
- if (x.SelectedMachine.Type != Integration.Services.ExternalBridgeClientType.USB)
+ if (x.SelectedMachine.RequiresAuthentication)
{
_notificationProvider.ShowModalDialog<MachineLoginViewVM>(async (login) =>
{
- using (NotificationProvider.PushTaskItem("Connecting to machine " + x.SelectedMachine.SerialNumber + "..."))
+ using (NotificationProvider.PushTaskItem("Connecting to machine " + x.SelectedMachine.ToString() + "..."))
{
try
{
await x.SelectedMachine.Connect();
- var authenticated = await x.SelectedMachine.Authenticate(login.Password);
+ var authenticated = await x.SelectedMachine.As<IExternalBridgeSecureClient>().Authenticate(login.Password);
if (!authenticated)
{
_notificationProvider.ShowError("It seems like you are not authorized to access the selected machine.");
@@ -184,7 +236,7 @@ namespace Tango.MachineStudio.UI.ViewModels
}
else
{
- using (NotificationProvider.PushTaskItem("Connecting to machine " + x.SelectedMachine.Device + "..."))
+ using (NotificationProvider.PushTaskItem("Connecting to " + x.SelectedMachine.ToString() + "..."))
{
try
{
@@ -208,26 +260,44 @@ namespace Tango.MachineStudio.UI.ViewModels
});
}
+ /// <summary>
+ /// Navigates to the home screen.
+ /// </summary>
private void Home()
{
StartModule(null);
}
- private void StartModule(IStudioModule module)
+ /// <summary>
+ /// Starts the specified module.
+ /// </summary>
+ /// <param name="module">The module.</param>
+ internal void StartModule(IStudioModule module)
{
IsMenuOpened = false;
+ foreach (var m in StudioModuleLoader.AllModules.Where(x => x != module))
+ {
+ m.IsLoaded = false;
+ }
+
if (module != null)
{
CurrentModule = module;
+ CurrentModule.IsLoaded = true;
IsModuleLoaded = true;
+ View.NavigateToModule(module);
}
else
{
IsModuleLoaded = false;
+ View.NavigateToModule(null);
}
}
+ /// <summary>
+ /// Called when the <see cref="T:Tango.SharedUI.IView" /> is loaded and attached.
+ /// </summary>
protected override void OnViewAttached()
{
base.OnViewAttached();
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ShutdownViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ShutdownViewVM.cs
index c7a919a82..ed771f00a 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ShutdownViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ShutdownViewVM.cs
@@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace Tango.MachineStudio.UI.ViewModels
{
+ /// <summary>
+ /// Represents the Machine Studio shutdown view, view model.
+ /// </summary>
public class ShutdownViewVM
{
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml
index 459c8fde8..2478c1155 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml
@@ -6,7 +6,7 @@
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" Cursor="Wait" DataContext="{Binding LoadingViewVM, Source={StaticResource Locator}}" Background="White">
+ d:DesignHeight="720" d:DesignWidth="1280" Cursor="Wait" DataContext="{Binding LoadingViewVM, Source={StaticResource Locator}}" Background="Transparent">
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
index 1531370af..84ba597f2 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
@@ -7,7 +7,7 @@
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" DataContext="{Binding LoginViewVM, Source={StaticResource Locator}}" Background="White">
+ d:DesignHeight="720" d:DesignWidth="1280" DataContext="{Binding LoginViewVM, Source={StaticResource Locator}}" Background="Transparent">
<UserControl.Resources>
<rules:Required x:Key="Required"></rules:Required>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MachineConnectionView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MachineConnectionView.xaml
index 4208c2878..1626e67ef 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MachineConnectionView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MachineConnectionView.xaml
@@ -5,6 +5,7 @@
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:integration="clr-namespace:Tango.Integration.Services;assembly=Tango.Integration"
xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
@@ -43,7 +44,7 @@
</Grid.RowDefinitions>
<Grid>
- <TextBlock VerticalAlignment="Center" Margin="0 0 0 0" Text="Scanning for machine on your local network..."></TextBlock>
+ <TextBlock VerticalAlignment="Center" Margin="0 0 0 0" Text="Scanning for machines on your local environment..."></TextBlock>
<!--<Button Command="{Binding ScanCommand}" HorizontalAlignment="Right" Width="40" Padding="0" Style="{StaticResource MaterialDesignFlatButton}" Foreground="Black" ToolTip="Scan">
<materialDesign:PackIcon Kind="Refresh" Width="24" Height="24"></materialDesign:PackIcon>
@@ -51,21 +52,15 @@
</Grid>
<Grid Grid.Row="1">
- <ListBox ItemsSource="{Binding Scanner.AvailableMachines}" SelectedItem="{Binding SelectedMachine}" Margin="0 0 0 7" BorderThickness="1" BorderBrush="Gainsboro">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <Grid>
+ <ListBox ItemsSource="{Binding Scanner.AvailableMachines}" SelectedItem="{Binding SelectedMachine}" Margin="0 0 0 7" BorderThickness="1" BorderBrush="Gainsboro" HorizontalContentAlignment="Stretch">
+ <ListBox.Resources>
+ <DataTemplate DataType="{x:Type integration:ExternalBridgeTcpClient}">
+ <DockPanel>
+ <StackPanel Orientation="Vertical" VerticalAlignment="Center" DockPanel.Dock="Right" ToolTip="Allow incoming diagnostics data">
+ <ToggleButton IsChecked="{Binding EnableDiagnostics}" VerticalAlignment="Center"></ToggleButton>
+ <TextBlock VerticalAlignment="Center" FontSize="10">Diagnostics</TextBlock>
+ </StackPanel>
<StackPanel Orientation="Horizontal">
- <StackPanel.Style>
- <Style TargetType="StackPanel">
- <Setter Property="Visibility" Value="Visible"></Setter>
- <Style.Triggers>
- <DataTrigger Binding="{Binding Type}" Value="USB">
- <Setter Property="Visibility" Value="Collapsed"></Setter>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </StackPanel.Style>
<Image Source="/Images/external-bridge-tcp.png" Width="38" Height="38" RenderOptions.BitmapScalingMode="Fant"></Image>
<StackPanel Margin="10 0 0 0">
<TextBlock FontSize="11">
@@ -79,18 +74,15 @@
</TextBlock>
</StackPanel>
</StackPanel>
-
+ </DockPanel>
+ </DataTemplate>
+ <DataTemplate DataType="{x:Type integration:ExternalBridgeUsbClient}">
+ <DockPanel>
+ <StackPanel Orientation="Vertical" VerticalAlignment="Center" DockPanel.Dock="Right" ToolTip="Allow incoming diagnostics data">
+ <ToggleButton IsChecked="{Binding EnableDiagnostics}" VerticalAlignment="Center"></ToggleButton>
+ <TextBlock VerticalAlignment="Center" FontSize="10">Diagnostics</TextBlock>
+ </StackPanel>
<StackPanel Orientation="Horizontal">
- <StackPanel.Style>
- <Style TargetType="StackPanel">
- <Setter Property="Visibility" Value="Collapsed"></Setter>
- <Style.Triggers>
- <DataTrigger Binding="{Binding Type}" Value="USB">
- <Setter Property="Visibility" Value="Visible"></Setter>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </StackPanel.Style>
<Image Source="/Images/external-bridge-usb.png" Width="38" Height="38" RenderOptions.BitmapScalingMode="Fant"></Image>
<StackPanel Margin="10 0 0 0">
<TextBlock FontSize="11">
@@ -101,9 +93,9 @@
</TextBlock>
</StackPanel>
</StackPanel>
- </Grid>
+ </DockPanel>
</DataTemplate>
- </ListBox.ItemTemplate>
+ </ListBox.Resources>
</ListBox>
<mahapps:MetroProgressBar VerticalAlignment="Bottom" Height="1" IsIndeterminate="True"></mahapps:MetroProgressBar>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
index d7d0f8dc3..479052cc5 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
@@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
xmlns:dockablz="clr-namespace:Dragablz.Dockablz;assembly=Dragablz"
xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
@@ -12,7 +13,12 @@
xmlns:db="clr-namespace:Tango.MachineStudio.DB.Views;assembly=Tango.MachineStudio.DB"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1270" Background="White" DataContext="{Binding MainViewVM, Source={StaticResource Locator}}">
+ d:DesignHeight="720" d:DesignWidth="1270" Background="Transparent" DataContext="{Binding MainViewVM, Source={StaticResource Locator}}">
+
+ <UserControl.Resources>
+ <converters:StringEllipsisConverter x:Key="StringEllipsisConverter" />
+ </UserControl.Resources>
+
<Grid>
<Grid.Style>
<Style TargetType="Grid">
@@ -125,8 +131,23 @@
</StackPanel>
<Grid HorizontalAlignment="Right">
- <StackPanel Orientation="Horizontal">
- <Button Margin="10 0 0 0" Style="{StaticResource MaterialDesignFlatButton}" FontSize="12" ToolTip="Connect to machine on the local network" BorderThickness="0" Command="{Binding ConnectCommand}">
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
+ <Grid Margin="0 0 20 0">
+ <ItemsControl ItemsSource="{Binding NotificationProvider.BarItems}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <StackPanel Orientation="Horizontal" IsItemsHost="True" VerticalAlignment="Center"></StackPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <ContentControl Margin="0 0 10 0" Content="{Binding Element}" VerticalAlignment="Center"></ContentControl>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </Grid>
+
+ <Button VerticalAlignment="Center" Margin="10 0 0 0" Style="{StaticResource MaterialDesignFlatButton}" FontSize="12" ToolTip="Connect to machine on the local network" BorderThickness="0" Command="{Binding ConnectCommand}">
<!--<Button.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="White" Offset="0.4" />
@@ -134,21 +155,25 @@
</LinearGradientBrush>
</Button.Background>-->
<StackPanel Orientation="Horizontal">
- <TextBlock Text="Machine Connection" VerticalAlignment="Center" Foreground="White"></TextBlock>
- <materialDesign:PackIcon Margin="10 0 0 0" Width="16" Height="16">
- <materialDesign:PackIcon.Style>
- <Style TargetType="materialDesign:PackIcon">
- <Setter Property="Foreground" Value="#FF6767"></Setter>
- <Setter Property="Kind" Value="LanDisconnect"></Setter>
- <Style.Triggers>
- <DataTrigger Binding="{Binding ApplicationManager.IsMachineConnected,Mode=OneWay}" Value="True">
- <Setter Property="Foreground" Value="#03FF8E"></Setter>
- <Setter Property="Kind" Value="LanConnect"></Setter>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </materialDesign:PackIcon.Style>
- </materialDesign:PackIcon>
+ <Grid>
+ <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
+ <TextBlock Text="Machine Connection" VerticalAlignment="Center" Foreground="White"></TextBlock>
+ <materialDesign:PackIcon Margin="10 0 0 0" Width="24" Height="24">
+ <materialDesign:PackIcon.Style>
+ <Style TargetType="materialDesign:PackIcon">
+ <Setter Property="Foreground" Value="#333333"></Setter>
+ <Setter Property="Kind" Value="LanDisconnect"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding ApplicationManager.IsMachineConnected,Mode=OneWay}" Value="True">
+ <Setter Property="Foreground" Value="#03FF8E"></Setter>
+ <Setter Property="Kind" Value="LanConnect"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </materialDesign:PackIcon.Style>
+ </materialDesign:PackIcon>
+ </StackPanel>
+ </Grid>
</StackPanel>
</Button>
</StackPanel>
@@ -165,90 +190,66 @@
</Grid.RowDefinitions>
<Grid Grid.Row="1">
- <Grid.RowDefinitions>
- <RowDefinition Height="150"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <Grid>
- <StackPanel Margin="30 20" HorizontalAlignment="Left">
- <TextBlock Style="{StaticResource MaterialDesignDisplay1TextBlock}">Welcome to Machine Studio</TextBlock>
- <TextBlock HorizontalAlignment="Right" Margin="0 5 -130 0" FontStyle="Italic" Style="{StaticResource MaterialDesignSubheadingTextBlock}" Foreground="{StaticResource AccentColorBrush}">Select Your Studio Module...</TextBlock>
- </StackPanel>
- </Grid>
- <ItemsControl ItemsSource="{Binding StudioModuleLoader.UserModules}" Grid.Row="2" Margin="10">
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <WrapPanel IsItemsHost="True"></WrapPanel>
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
-
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <materialDesign:Card Width="300" Margin="10" Height="400">
- <Grid >
- <Grid.RowDefinitions>
- <RowDefinition Height="180" />
- <RowDefinition Height="*" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Image Source="{Binding Image,Mode=OneWay}" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant" />
- <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.StartModuleCommand}" CommandParameter="{Binding}" Grid.Row="0" Margin="0,0,20,-35" HorizontalAlignment="Right" Width="70" Height="70" VerticalAlignment="Bottom" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" ToolTip="Start This Module">
- <materialDesign:PackIcon Kind="Play" Width="30" Height="30" />
- </Button>
- <StackPanel Grid.Row="1" Margin="8,24,8,0">
- <TextBlock FontWeight="Bold" FontSize="20" Text="{Binding Name,Mode=OneWay}"></TextBlock>
- <TextBlock VerticalAlignment="Center" Margin="0 5 0 0" FontSize="14" TextWrapping="Wrap" Text="{Binding Description,Mode=OneWay}"></TextBlock>
- </StackPanel>
- <StackPanel Grid.Row="2" Margin="8" HorizontalAlignment="Right" Orientation="Horizontal">
- <materialDesign:PopupBox Padding="2,0,2,0" Style="{StaticResource MaterialDesignToolPopupBox}">
- <StackPanel>
- <Button Content="More" />
- <Button Content="Options" />
- </StackPanel>
- </materialDesign:PopupBox>
+ <controls:MultiTransitionControl x:Name="TransitionControl" AlwaysFade="True" TransitionType="Zoom">
+ <controls:MultiTransitionControl.Controls>
+ <ContentControl Tag="Home">
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="150"/>
+ <RowDefinition Height="*"/>
+ </Grid.RowDefinitions>
+ <Grid>
+ <StackPanel Margin="30 20" HorizontalAlignment="Left">
+ <TextBlock Style="{StaticResource MaterialDesignDisplay1TextBlock}">Welcome to Machine Studio</TextBlock>
+ <TextBlock HorizontalAlignment="Right" Margin="0 5 -130 0" FontStyle="Italic" Style="{StaticResource MaterialDesignSubheadingTextBlock}" Foreground="{StaticResource AccentColorBrush}">Select Your Studio Module...</TextBlock>
</StackPanel>
</Grid>
- </materialDesign:Card>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- </Grid>
- <Grid Grid.Row="1" RenderTransformOrigin="0.5,0.5">
- <Grid.Style>
- <Style TargetType="Grid">
- <Setter Property="RenderTransform">
- <Setter.Value>
- <ScaleTransform ScaleX="0" ScaleY="0"></ScaleTransform>
- </Setter.Value>
- </Setter>
- <Setter Property="Opacity" Value="0"></Setter>
+ <Grid Grid.Row="2">
+ <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
+ <ItemsControl ItemsSource="{Binding StudioModuleLoader.UserModules}" Margin="10">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel IsItemsHost="True"></WrapPanel>
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
- <Style.Triggers>
- <DataTrigger Binding="{Binding IsModuleLoaded}" Value="False">
- <DataTrigger.EnterActions>
- <BeginStoryboard>
- <Storyboard>
- <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="0" Duration="00:00:0.5"></DoubleAnimation>
- <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="0" Duration="00:00:0.5"></DoubleAnimation>
- <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0" Duration="00:00:0.5"></DoubleAnimation>
- </Storyboard>
- </BeginStoryboard>
- </DataTrigger.EnterActions>
- <DataTrigger.ExitActions>
- <BeginStoryboard>
- <Storyboard>
- <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="00:00:0.5"></DoubleAnimation>
- <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1" Duration="00:00:0.5"></DoubleAnimation>
- <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="00:00:0.5"></DoubleAnimation>
- </Storyboard>
- </BeginStoryboard>
- </DataTrigger.ExitActions>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Style>
- <ContentPresenter Content="{Binding CurrentModule.MainView}"/>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <materialDesign:Card Width="300" Margin="10" Height="400">
+ <Grid >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="180" />
+ <RowDefinition Height="*" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Image Source="{Binding Image,Mode=OneWay}" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant" />
+ <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.StartModuleCommand}" CommandParameter="{Binding}" Grid.Row="0" Margin="0,0,20,-35" HorizontalAlignment="Right" Width="70" Height="70" VerticalAlignment="Bottom" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" ToolTip="Start This Module">
+ <materialDesign:PackIcon Kind="Play" Width="30" Height="30" />
+ </Button>
+ <StackPanel Grid.Row="1" Margin="8,24,8,0">
+ <TextBlock FontWeight="Bold" FontSize="20" Text="{Binding Name,Mode=OneWay}"></TextBlock>
+ <TextBlock VerticalAlignment="Center" Margin="0 5 0 0" FontSize="14" TextWrapping="Wrap" Text="{Binding Description,Mode=OneWay}"></TextBlock>
+ </StackPanel>
+ <StackPanel Grid.Row="2" Margin="8" HorizontalAlignment="Right" Orientation="Horizontal">
+ <materialDesign:PopupBox Padding="2,0,2,0" Style="{StaticResource MaterialDesignToolPopupBox}">
+ <StackPanel>
+ <Button Content="More" />
+ <Button Content="Options" />
+ </StackPanel>
+ </materialDesign:PopupBox>
+ </StackPanel>
+ </Grid>
+ </materialDesign:Card>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </ScrollViewer>
+ </Grid>
+ </Grid>
+ </ContentControl>
+ </controls:MultiTransitionControl.Controls>
+ </controls:MultiTransitionControl>
</Grid>
</Grid>
@@ -289,7 +290,7 @@
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="20 0 0 0">
<mahapps:ProgressRing Width="24" Height="24" Foreground="White"></mahapps:ProgressRing>
- <TextBlock Text="{Binding NotificationProvider.CurrentTaskItem.Message}" Foreground="White" VerticalAlignment="Center" Margin="10 0 0 0"></TextBlock>
+ <TextBlock Text="{Binding NotificationProvider.CurrentTaskItem.Message,Converter={StaticResource StringEllipsisConverter},ConverterParameter=35}" Foreground="White" VerticalAlignment="Center" Margin="10 0 0 0" TextWrapping="Wrap"></TextBlock>
</StackPanel>
</Border>
</Grid>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
index f52393e1c..e6e1557f3 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
@@ -14,11 +14,17 @@ using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using Tango.MachineStudio.Common.Modules;
using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.UI.Modules;
using Tango.MachineStudio.UI.Notifications;
using Tango.MachineStudio.UI.SupervisingController;
using Tango.SharedUI;
using Tango.SharedUI.Controls;
+using Tango.MachineStudio.Common;
+using System.Threading;
+using Tango.Core.Helpers;
+using Tango.SharedUI.Helpers;
namespace Tango.MachineStudio.UI.Views
{
@@ -27,9 +33,63 @@ namespace Tango.MachineStudio.UI.Views
/// </summary>
public partial class MainView : View, IMainView
{
+ private DefaultStudioModuleLoader _loader;
+
public MainView() : base()
{
InitializeComponent();
+
+ _loader = ServiceLocator.Current.GetInstance<IStudioModuleLoader>() as DefaultStudioModuleLoader;
+ _loader.ModulesLoaded += Loader_ModulesLoaded;
+ }
+
+ public void NavigateToModule(IStudioModule module)
+ {
+ TransitionControl.AutoNavigate(module != null ? module.Name : "Home");
+ }
+
+ private void Loader_ModulesLoaded(object sender, EventArgs e)
+ {
+ TransitionControl.Controls.RemoveAll((x) => x.Tag.ToString() != "Home");
+
+ Task.Factory.StartNew(() =>
+ {
+ var item = ServiceLocator.Current.GetInstance<INotificationProvider>().PushTaskItem("Loading Modules...");
+
+ var modules = _loader.UserModules.ToList();
+
+ ThreadsHelper.InvokeUINow(() =>
+ {
+ _loader.UserModules.Clear();
+ });
+
+ Thread.Sleep(1500);
+
+ foreach (var module in modules)
+ {
+ ThreadsHelper.InvokeUI(() =>
+ {
+ TransitionControl.Controls.Add(new ContentControl()
+ {
+ Tag = module.Name,
+ Content = module.MainView
+ });
+
+ _loader.UserModules.Add(module);
+ });
+
+ UIHelper.DoEvents();
+
+ Thread.Sleep(100);
+ }
+
+ ThreadsHelper.InvokeUI(() =>
+ {
+ TransitionControl.RefreshControls();
+ });
+
+ item.Pop();
+ });
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ShutdownView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ShutdownView.xaml
index 487dfe1f8..dd86238ce 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ShutdownView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ShutdownView.xaml
@@ -6,7 +6,7 @@
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
- d:DesignHeight="720" d:DesignWidth="1280" Cursor="Wait" Background="White" DataContext="{Binding ShutdownViewVM, Source={StaticResource Locator}}">
+ d:DesignHeight="720" d:DesignWidth="1280" Cursor="Wait" Background="Transparent" DataContext="{Binding ShutdownViewVM, Source={StaticResource Locator}}">
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionResolutions.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionResolutions.cs
new file mode 100644
index 000000000..2e7327559
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionResolutions.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.UI.Windows
+{
+ public enum ExceptionResolutions
+ {
+ Shutdown,
+ Restart,
+ Ignore
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml
new file mode 100644
index 000000000..c08a08842
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml
@@ -0,0 +1,61 @@
+<Window x:Class="Tango.MachineStudio.UI.Windows.ExceptionWindow"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:local="clr-namespace:Tango.MachineStudio.UI.Windows"
+ mc:Ignorable="d"
+ WindowStyle="None" ResizeMode="NoResize" Topmost="True" AllowsTransparency="True" WindowStartupLocation="CenterScreen" d:DesignHeight="300" d:DesignWidth="300" Width="610" Height="410" Background="Transparent" d:DataContext="{d:DesignInstance Type=local:ExceptionWindow, IsDesignTimeCreatable=False}">
+ <Grid>
+ <Border BorderThickness="1" BorderBrush="DodgerBlue" Background="White" Margin="10" CornerRadius="10">
+ <Border.Effect>
+ <DropShadowEffect ShadowDepth="0" BlurRadius="10" />
+ </Border.Effect>
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="80"/>
+ <RowDefinition Height="1*"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <StackPanel Orientation="Horizontal" Margin="10">
+ <Image Source="/Images/exception.png" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Text="Machine Studio Error" VerticalAlignment="Center" Margin="10 0 0 0" FontSize="20"></TextBlock>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Row="1" Margin="10 0 10 10">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="1*"/>
+ <RowDefinition Height="50"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30"/>
+ <RowDefinition Height="223*"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <TextBlock TextWrapping="Wrap" VerticalAlignment="Center" Margin="0 0 0 0">
+ <Run>Machine Studio encountered an unexpected error. It is recommended to restart the application in order to resolve the issue.</Run>
+ </TextBlock>
+ </Grid>
+
+ <Grid Grid.Row="1" Margin="0 10 0 0">
+ <TextBox Style="{x:Null}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" BorderBrush="#515151" IsReadOnly="True" AcceptsReturn="True" Foreground="#FF5C5C" Padding="2" TextWrapping="Wrap" Text="{Binding Exception}"></TextBox>
+ </Grid>
+ </Grid>
+
+ <Grid Grid.Row="1">
+ <Button HorizontalAlignment="Left" Width="140" Command="{Binding ResolveCommand}" CommandParameter="{x:Static local:ExceptionResolutions.Ignore}">Ignore</Button>
+ <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
+ <Button Margin="5 0 0 0" Width="140" Command="{Binding ResolveCommand}" CommandParameter="{x:Static local:ExceptionResolutions.Shutdown}">Shutdown</Button>
+ <Button Margin="5 0 0 0" Width="140" Command="{Binding ResolveCommand}" CommandParameter="{x:Static local:ExceptionResolutions.Restart}">Restart</Button>
+ </StackPanel>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Border>
+ </Grid>
+</Window>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml.cs
new file mode 100644
index 000000000..0f74fee17
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Windows/ExceptionWindow.xaml.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using Tango.Core.Commands;
+using Tango.MachineStudio.UI.ViewModels;
+
+namespace Tango.MachineStudio.UI.Windows
+{
+ /// <summary>
+ /// Interaction logic for ExceptionWindow.xaml
+ /// </summary>
+ public partial class ExceptionWindow : Window
+ {
+ public ExceptionResolutions Resolution { get; set; }
+
+ public String Exception { get; set; }
+
+ public RelayCommand<ExceptionResolutions> ResolveCommand { get; set; }
+
+ public ExceptionWindow()
+ {
+ InitializeComponent();
+ DataContext = this;
+ }
+
+ public ExceptionWindow(Exception ex) : this()
+ {
+ Exception = ex.FlattenException();
+ ResolveCommand = new RelayCommand<ExceptionResolutions>(Resolve);
+ }
+
+ private void Resolve(ExceptionResolutions resolution)
+ {
+ Resolution = resolution;
+ Close();
+ }
+ }
+}