Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f46e5a9a5 | |||
| 1c0f161640 | |||
| 7a66c3d63d | |||
| 8e3f3ec5e0 | |||
| cf96c67a3c | |||
| ae8f931372 | |||
| 20d9bf716d | |||
| 2f6f308f19 | |||
| 7fd2b6ca30 | |||
| aff9643216 | |||
| 465b09c176 | |||
| 1efde033b2 | |||
| 4a609bc35b | |||
| 88aa48a3d8 | |||
| b280dca20f | |||
| a6d6041b06 | |||
| 46b7b02da9 | |||
| 98d3798824 | |||
| dd7e9b9e19 | |||
| 550b448dc2 | |||
| afaa8f3576 | |||
| 328d2ed176 | |||
| 9bd1faf083 | |||
| 6526a20d5c | |||
| 9f4adce366 | |||
| 7d29511fdb | |||
| e28b736ebf | |||
| 383b5417d4 | |||
| 3f9b2a8c8e | |||
| 382d961761 | |||
| ae3294ca46 | |||
| 1f75da9bef | |||
| ed8400619c | |||
| 67fcba0053 | |||
| a7548a6e78 | |||
| 90fe35fc1c | |||
| 4737d22a2f | |||
| 7a9dca8807 | |||
| 2dfc9e293f | |||
| 3cca07422c | |||
| af4870d99d | |||
| 7b6ee330bb | |||
| 8542b6c565 | |||
| 3c65bced53 | |||
| 95d29cc716 | |||
| bcde0c8d86 | |||
| 76deabb93b | |||
| bfc99fc826 | |||
| cb28589f79 | |||
| 8cae6edff2 | |||
| 34a71b5784 | |||
| 455ddd660c | |||
| bbada3a929 | |||
| 0a00ba3eae | |||
| 7a3a068908 | |||
| 2a3de715da | |||
| 002b235d76 | |||
| b135f017d5 | |||
| 32e0c34945 | |||
| f32d0c0daf | |||
| 014f63bd2b | |||
| a6e58365dd | |||
| 7481d3bf28 | |||
| c036cd30e2 | |||
| 682efe1928 | |||
| d511b49c64 | |||
| bb7ef476ed | |||
| 393da8156b | |||
| 575b74c676 | |||
| 9f27a7b5ce | |||
| 12ee118e72 | |||
| 00994f993b | |||
| 581c6d44fe | |||
| a75edd650e | |||
| eea8a2fa5d | |||
| 14c9fb628b | |||
| 18530ea7b3 | |||
| 04447282ea | |||
| 582a4455e0 | |||
| 43fa8448d2 |
@@ -38,12 +38,12 @@ namespace Active_Client.Browser_Tools
|
||||
|
||||
private static readonly string[] _validExtensions = {".json", ".rcp", ".tpl" };
|
||||
//private static readonly string[] _validExtensions = { "", ".txt", ".cnc", ".cn", ".cno", ".ini", ".mpf", ".spf", ".tap", ".anc", ".iso" };
|
||||
private static readonly string[] _validImages = { ".jpg", ".jpeg", ".png" };
|
||||
private static readonly string[] _validImages = { ".jpg", ".jpeg", ".png", ".svg" };
|
||||
private static string jobPath = "";
|
||||
private static Dictionary<string, IntPtr> _editorOpened = new Dictionary<string, IntPtr>();
|
||||
private static EditorVar _currentEditorObject = new EditorVar();
|
||||
public static string RECENT_FOLDER_KEY = "RECENT";
|
||||
private const string THERMO_RECIPE_PATH = @"C:\CMS\Recipes";
|
||||
private const string THERMO_RECIPE_PATH = @"C:\CMS\Recipe";
|
||||
|
||||
public static FileSystemWatcher watcher = null;
|
||||
public static DateTime _lastTimeFileWatcherEventRaised = DateTime.Now;
|
||||
@@ -80,6 +80,11 @@ namespace Active_Client.Browser_Tools
|
||||
AddFunction("getFileList").Execute += getFileList;
|
||||
AddFunction("getProgramInfo").Execute += getProgramInfo;
|
||||
AddFunction("editProgram").Execute += editProgram;
|
||||
AddFunction("deleteFile").Execute += deleteFile;
|
||||
AddFunction("deleteFolder").Execute += deleteFolder;
|
||||
AddFunction("createFolder").Execute += createFolder;
|
||||
|
||||
|
||||
|
||||
AddFunction("uploadAndActivateProgram").Execute += uploadAndActivateProgram;
|
||||
AddFunction("uploadAndAddToQueue").Execute += uploadAndAddToQueue;
|
||||
@@ -360,6 +365,7 @@ namespace Active_Client.Browser_Tools
|
||||
List<Drive> drivelist = new List<Drive>();
|
||||
|
||||
// USB & HD Drives
|
||||
/*
|
||||
foreach (var drive in DriveInfo.GetDrives())
|
||||
{
|
||||
if (drive.IsReady)
|
||||
@@ -376,7 +382,7 @@ namespace Active_Client.Browser_Tools
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Desktop folder
|
||||
drivelist.Add(new Drive()
|
||||
{
|
||||
@@ -384,6 +390,7 @@ namespace Active_Client.Browser_Tools
|
||||
Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\",
|
||||
Type = "SPFO"
|
||||
});
|
||||
*/
|
||||
|
||||
if (Directory.Exists(THERMO_RECIPE_PATH))
|
||||
{
|
||||
@@ -394,7 +401,7 @@ namespace Active_Client.Browser_Tools
|
||||
Type = "SPFO"
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
try
|
||||
{
|
||||
// Network Folders
|
||||
@@ -416,7 +423,7 @@ namespace Active_Client.Browser_Tools
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(drivelist));
|
||||
}
|
||||
@@ -485,6 +492,85 @@ namespace Active_Client.Browser_Tools
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(filelist));
|
||||
}
|
||||
|
||||
public void deleteFile(object sender, CfrV8HandlerExecuteEventArgs e)
|
||||
{
|
||||
if (e.Arguments.Count() == 0)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("error_arguments_not_ok")));
|
||||
return;
|
||||
}
|
||||
|
||||
// Get path
|
||||
string p = e.Arguments[0].StringValue;
|
||||
FileAttributes attr = File.GetAttributes(p);
|
||||
if (!File.Exists(p) || attr.HasFlag(FileAttributes.Directory))
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("file_not_found")));
|
||||
return;
|
||||
}
|
||||
if (attr.HasFlag(FileAttributes.ReadOnly))
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("file_not_editable")));
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
File.Delete(p);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_file")));
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteFolder(object sender, CfrV8HandlerExecuteEventArgs e)
|
||||
{
|
||||
if (e.Arguments.Count() == 0)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("error_arguments_not_ok")));
|
||||
return;
|
||||
}
|
||||
|
||||
// Get path
|
||||
string p = e.Arguments[0].StringValue;
|
||||
FileAttributes attr = File.GetAttributes(p);
|
||||
if (!Directory.Exists(p) || !attr.HasFlag(FileAttributes.Directory))
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("directory_not_found")));
|
||||
return;
|
||||
}
|
||||
if (attr.HasFlag(FileAttributes.ReadOnly))
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("directory_not_editable")));
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
Directory.Delete(p,true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_directory")));
|
||||
}
|
||||
}
|
||||
|
||||
public void createFolder(object sender, CfrV8HandlerExecuteEventArgs e)
|
||||
{
|
||||
if (e.Arguments.Count() == 0)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("error_arguments_not_ok")));
|
||||
return;
|
||||
}
|
||||
string path = e.Arguments[0].StringValue;
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("cannot_delete_directory")));
|
||||
}
|
||||
}
|
||||
// Upload and activate the program
|
||||
public async void uploadAndActivateProgram(object sender, CfrV8HandlerExecuteEventArgs e)
|
||||
{
|
||||
@@ -671,8 +757,7 @@ namespace Active_Client.Browser_Tools
|
||||
// Read info of a file
|
||||
public void getProgramInfo(object sender, CfrV8HandlerExecuteEventArgs e)
|
||||
{
|
||||
string line, imagePath, imageDirectory;
|
||||
int counter = 0;
|
||||
string imagePath, imageDirectory;
|
||||
|
||||
if (e.Arguments.Count() == 0)
|
||||
{
|
||||
|
||||
@@ -165,7 +165,7 @@ namespace Active_Client.View
|
||||
public void sendClose()
|
||||
{
|
||||
//Close Virtual Keyboard Runtime
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10)
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard)
|
||||
NcWindow.closeVirtualKeyboard();
|
||||
|
||||
//Close the NC HMI && Stop Following Nc
|
||||
@@ -259,7 +259,7 @@ namespace Active_Client.View
|
||||
Browser.DisplayHandler.OnConsoleMessage += BrowserConsoleMessage;
|
||||
Browser.DownloadHandler.OnBeforeDownload += BeforeDownload;
|
||||
//Filter only < Win_10 Platform
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10)
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard)
|
||||
ChromiumWebBrowser.RemoteProcessCreated += (e) => { e.RenderProcessHandler.OnFocusedNodeChanged += BrowserNodeChanged; };
|
||||
}
|
||||
|
||||
|
||||
@@ -1047,7 +1047,7 @@ namespace Active_Client.View
|
||||
if (!IsIconic(MainViewHandle))
|
||||
{
|
||||
//Show Virtual keyboard
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10)
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard)
|
||||
reOpenVirtualKeyboard();
|
||||
}
|
||||
}
|
||||
@@ -1069,7 +1069,7 @@ namespace Active_Client.View
|
||||
//SetForegroundWindow(hwnd);
|
||||
|
||||
//Hide Virtual keyboard
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10 && KeyboardPID != 0 && ActualPID != KeyboardPID)
|
||||
if (Config.ClientConfig.ShowVirtualKeyboard && KeyboardPID != 0 && ActualPID != KeyboardPID)
|
||||
closeVirtualKeyboard();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<xs:element name="inputsOperator">
|
||||
<xs:complexType>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="realValueModal" type="valuesType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="showValModal" type="showValType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="buttonsListModal" type="buttonsType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="simpleModal" type="modalType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:complexType name="valuesType">
|
||||
<xs:all>
|
||||
<xs:element name="id" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="showValType">
|
||||
<xs:all>
|
||||
<xs:element name="id" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="buttons">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="button">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:int"></xs:element>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="buttonsType">
|
||||
<xs:all>
|
||||
<xs:element name="id" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="buttons">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="button">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:int"></xs:element>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="modalType">
|
||||
<xs:all>
|
||||
<xs:element name="id" minOccurs='1' maxOccurs='1'/>
|
||||
<xs:element name="title" type="translatedText" minOccurs='1' maxOccurs='1'/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- Translations field Type -->
|
||||
<xs:complexType name="translatedText">
|
||||
<xs:sequence>
|
||||
<xs:element name="lang" type="langType" minOccurs="0" maxOccurs="unbounded">
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- lang field -->
|
||||
<xs:complexType name="langType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="langKey" use="required" type="xs:string" />
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<inputsOperator>
|
||||
<buttonsListModal>
|
||||
<id>1</id>
|
||||
<title>
|
||||
<lang langKey="it">Hai rimosso manualmente anche il pezzo lavorato ?</lang>
|
||||
<lang langKey="en">Have you also manually removed the workpiece ?</lang>
|
||||
</title>
|
||||
<buttons>
|
||||
<button>
|
||||
<value>0</value>
|
||||
<title>
|
||||
<lang langKey="it">No</lang>
|
||||
<lang langKey="en">No</lang>
|
||||
</title>
|
||||
</button>
|
||||
<button>
|
||||
<value>1</value>
|
||||
<title>
|
||||
<lang langKey="it">Si</lang>
|
||||
<lang langKey="en">Yes</lang>
|
||||
</title>
|
||||
</button>
|
||||
</buttons>
|
||||
</buttonsListModal>
|
||||
<simpleModal>
|
||||
<id>2</id>
|
||||
<title>
|
||||
<lang langKey="it">DUE Hai rimosso manualmente anche il pezzo lavorato ?</lang>
|
||||
<lang langKey="en">DUE Have you also manually removed the workpiece ?</lang>
|
||||
</title>
|
||||
</simpleModal>
|
||||
<realValueModal>
|
||||
<id>10</id>
|
||||
<title>
|
||||
<lang langKey="en">External water</lang>
|
||||
<lang langKey="it">Acqua esterna</lang>
|
||||
</title>
|
||||
</realValueModal>
|
||||
<realValueModal>
|
||||
<id>11</id>
|
||||
<title>
|
||||
<lang langKey="en">External water</lang>
|
||||
<lang langKey="it">Acqua esterna</lang>
|
||||
</title>
|
||||
</realValueModal>
|
||||
<buttonsListModal>
|
||||
<id>6</id>
|
||||
<title>
|
||||
<lang langKey="en">External water</lang>
|
||||
<lang langKey="it">Acqua esterna</lang>
|
||||
</title>
|
||||
<buttons>
|
||||
<button>
|
||||
<value>3</value>
|
||||
<title>
|
||||
<lang langKey="en">External water</lang>
|
||||
<lang langKey="it">Acqua esterna</lang>
|
||||
</title>
|
||||
</button>
|
||||
<button>
|
||||
<value>4</value>
|
||||
<title>
|
||||
<lang langKey="en">External water</lang>
|
||||
<lang langKey="it">Acqua esterna</lang>
|
||||
</title>
|
||||
</button>
|
||||
</buttons>
|
||||
</buttonsListModal>
|
||||
</inputsOperator>
|
||||
@@ -1,9 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<xs:element name="recipe">
|
||||
<!-- Heads -->
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<!-- Heads -->
|
||||
<xs:element name="parameter" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
|
||||
@@ -1,64 +1,98 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<serverConfig>
|
||||
<ncConfig>
|
||||
<ncVendor>S7NET</ncVendor> <!-- NO_NC/DEMO/FANUC/SIEMENS/OSAI/S7NET -->
|
||||
<showNcHMI>false</showNcHMI>
|
||||
<ncIpAddress>192.168.0.102</ncIpAddress>
|
||||
<ncPort>102</ncPort>
|
||||
<machineModel>Thermo 2020</machineModel>
|
||||
<sharedPath>C:\PartPrg\</sharedPath>
|
||||
<sharedName>//PARTPRG:/</sharedName>
|
||||
<installationDate>01/06/2020</installationDate>
|
||||
<mgiOption>false</mgiOption>
|
||||
<siemensKeyboardOption>false</siemensKeyboardOption>
|
||||
<machineNumberHasLetters>false</machineNumberHasLetters>
|
||||
</ncConfig>
|
||||
<softwareProdConfig>
|
||||
<enabled>false</enabled>
|
||||
<path>C:\Program Files\Notepad++\notepad++.exe</path>
|
||||
</softwareProdConfig>
|
||||
<serverConfig>
|
||||
<serverPort>9000</serverPort>
|
||||
<serverAddress>*</serverAddress>
|
||||
<language>en</language>
|
||||
<enableDirectoryBrowsing>true</enableDirectoryBrowsing>
|
||||
<databaseAddress>localhost</databaseAddress>
|
||||
<autoOpenCmsClient>false</autoOpenCmsClient>
|
||||
<textEditorPath>C:\Windows\System32\notepad.exe</textEditorPath>
|
||||
<MTCFolderPath>C:\CMS\MTC\ADAPTER\</MTCFolderPath>
|
||||
<MTCApplicationName>SCMA</MTCApplicationName>
|
||||
<CMSConnectReady>false</CMSConnectReady>
|
||||
<maxAlarmsRows>50000</maxAlarmsRows>
|
||||
<alarmToDelete>5000</alarmToDelete>
|
||||
</serverConfig>
|
||||
<extSoftwares>
|
||||
<software>
|
||||
<longName>Calculator</longName>
|
||||
<shortName>CAL</shortName>
|
||||
<path>C:\Windows\System32\calc.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>true</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>NotePad</longName>
|
||||
<shortName>NP</shortName>
|
||||
<path>C:\Windows\System32\notepad.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>true</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>MsPaint</longName>
|
||||
<shortName>PA</shortName>
|
||||
<path>C:\Windows\System32\mspaint.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>false</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>NotePad2</longName>
|
||||
<shortName>NP2</shortName>
|
||||
<path>C:\Windows\System32\notepad.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>false</inMainMenuBar>
|
||||
</software>
|
||||
<ncConfig>
|
||||
<ncVendor>S7NET</ncVendor>
|
||||
<!-- NO_NC/DEMO/FANUC/SIEMENS/OSAI/S7NET -->
|
||||
<showNcHMI>false</showNcHMI>
|
||||
<ncIpAddress>192.168.0.102</ncIpAddress>
|
||||
<ncPort>102</ncPort>
|
||||
<machineModel>Thermo 2020</machineModel>
|
||||
<sharedPath>C:\CMS\Recipes\</sharedPath>
|
||||
<sharedName>//PARTPRG:/</sharedName>
|
||||
<installationDate>01/06/2020</installationDate>
|
||||
<mgiOption>false</mgiOption>
|
||||
<siemensKeyboardOption>false</siemensKeyboardOption>
|
||||
<machineNumberHasLetters>false</machineNumberHasLetters>
|
||||
</ncConfig>
|
||||
<softwareProdConfig>
|
||||
<enabled>false</enabled>
|
||||
<path>C:\Program Files\Notepad++\notepad++.exe</path>
|
||||
</softwareProdConfig>
|
||||
<serverConfig>
|
||||
<serverPort>9000</serverPort>
|
||||
<serverAddress>*</serverAddress>
|
||||
<language>en</language>
|
||||
<enableDirectoryBrowsing>true</enableDirectoryBrowsing>
|
||||
<databaseAddress>localhost</databaseAddress>
|
||||
<autoOpenCmsClient>false</autoOpenCmsClient>
|
||||
<textEditorPath>C:\Windows\System32\notepad.exe</textEditorPath>
|
||||
<MTCFolderPath>C:\CMS\MTC\ADAPTER\</MTCFolderPath>
|
||||
<MTCApplicationName>SCMA</MTCApplicationName>
|
||||
<CMSConnectReady>false</CMSConnectReady>
|
||||
<maxAlarmsRows>50000</maxAlarmsRows>
|
||||
<alarmToDelete>5000</alarmToDelete>
|
||||
</serverConfig>
|
||||
<extSoftwares>
|
||||
<software>
|
||||
<longName>Calculator</longName>
|
||||
<shortName>CAL</shortName>
|
||||
<path>C:\Windows\System32\calc.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>true</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>NotePad</longName>
|
||||
<shortName>NP</shortName>
|
||||
<path>C:\Windows\System32\notepad.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>true</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>MsPaint</longName>
|
||||
<shortName>PA</shortName>
|
||||
<path>C:\Windows\System32\mspaint.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>false</inMainMenuBar>
|
||||
</software>
|
||||
<software>
|
||||
<longName>NotePad2</longName>
|
||||
<shortName>NP2</shortName>
|
||||
<path>C:\Windows\System32\notepad.exe</path>
|
||||
<arguments></arguments>
|
||||
<inMainMenuBar>false</inMainMenuBar>
|
||||
</software>
|
||||
</extSoftwares>
|
||||
<additionalParameters>
|
||||
<entry>
|
||||
<key>warmerPlanSizeX</key>
|
||||
<value>1500</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>warmerPlanSizeY</key>
|
||||
<value>1200</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>resistSizeX</key>
|
||||
<value>200</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>resistSizeY</key>
|
||||
<value>100</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>warmerAutocompStartValue</key>
|
||||
<value>30</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key>warmerAutocompStep</key>
|
||||
<value>5</value>
|
||||
</entry>
|
||||
</additionalParameters>
|
||||
<unitOfMeasures>
|
||||
<unitOfMeasure id="0" value="" />
|
||||
<unitOfMeasure id="1" value="m" />
|
||||
<unitOfMeasure id="2" value="l" />
|
||||
<unitOfMeasure id="3" value="°c" />
|
||||
<unitOfMeasure id="4" value="m/s" />
|
||||
</unitOfMeasures>
|
||||
</serverConfig>
|
||||
@@ -63,10 +63,42 @@
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="additionalParameters" >
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="key" type="xs:string" />
|
||||
<xs:element name="value" type="xs:string" />
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="unitOfMeasures">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="unitOfMeasure" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:complexContent>
|
||||
<xs:extension base="umType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:complexType name="umType">
|
||||
<xs:attribute name="id" type="xs:integer" use="required">
|
||||
</xs:attribute>
|
||||
<xs:attribute name="value" type="xs:string" use="required">
|
||||
</xs:attribute>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="ncType" final="restriction" >
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="DEMO" />
|
||||
|
||||
@@ -11,6 +11,8 @@ namespace Thermo.Active.Config
|
||||
public static ServerConfigModel ServerStartupConfig;
|
||||
public static NcConfigModel NcConfig;
|
||||
public static List<ExtSoftwareModel> ExtSoftwaresConfig;
|
||||
public static Dictionary<string, string> AdditionalParametersConfig;
|
||||
public static Dictionary<int, string> UnitMeasuresConfig;
|
||||
public static SoftwareProdConfigModel SoftwareProdConfig;
|
||||
public static MachineModel MachineConfig;
|
||||
public static List<MaintenanceConfigModel> MaintenancesConfig;
|
||||
@@ -51,10 +53,9 @@ namespace Thermo.Active.Config
|
||||
public static List<ScadaSchemaModel> SubscribedScada = new List<ScadaSchemaModel>();
|
||||
|
||||
public static List<string> MacrosConfig;
|
||||
|
||||
public static List<InputOperatorConfigModel> InputsOperatorConfig;
|
||||
public static string CMSMainProgramContent;
|
||||
|
||||
|
||||
// Thermo
|
||||
public static List<ThermoProdConfigModel> ThermoProdConfig;
|
||||
public static List<RecipeConfigModel> RecipeConfig;
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace Thermo.Active.Config
|
||||
// ReadCMSConnectConfig();
|
||||
ReadMacros();
|
||||
ReadScadaFile();
|
||||
ReadM156();
|
||||
}
|
||||
catch (XmlException ex)
|
||||
{
|
||||
@@ -254,6 +255,49 @@ namespace Thermo.Active.Config
|
||||
}
|
||||
}
|
||||
|
||||
private static void ReadM156()
|
||||
{
|
||||
// Get Areas file handler
|
||||
XDocument xmlConfigFile = GetXmlHandlerWithValidator(M156_CONFIG_SCHEMA_PATH, M156_CONFIG_PATH);
|
||||
|
||||
InputsOperatorConfig = xmlConfigFile
|
||||
.Descendants("inputsOperator")
|
||||
.Elements()
|
||||
.Select(x => new InputOperatorConfigModel()
|
||||
{
|
||||
Id = Convert.ToInt32(x.Element("id").Value),
|
||||
Messages = x.Element("title").Elements().ToDictionary( // Read localized names and convert into a dictionary
|
||||
y => y.Attribute("langKey").Value, y => y.Value
|
||||
),
|
||||
Buttons = x.Element("buttons")?.Elements().ToDictionary( // Read buttons data and convert into a dictionary
|
||||
y => Convert.ToByte(y.Element("value").Value),
|
||||
y => y.Element("title").Elements().ToDictionary( // Read localized names and convert into a dictionary
|
||||
z => z.Attribute("langKey").Value,
|
||||
z => z.Value
|
||||
)
|
||||
),
|
||||
Type = GetInputOperatoType(x.Name.ToString())
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
|
||||
public static string GetInputOperatoType(string tagName)
|
||||
{
|
||||
switch (tagName)
|
||||
{
|
||||
case "modalValue":
|
||||
return "REAL";
|
||||
case "buttonsListModal":
|
||||
return "MULTIPLE_BUTTONS";
|
||||
case "showValModal":
|
||||
return "SHOW_VAL";
|
||||
case "simpleModal":
|
||||
return "MODAL";
|
||||
default:
|
||||
return "REAL";
|
||||
}
|
||||
}
|
||||
|
||||
#region Read config from file from configuration
|
||||
|
||||
@@ -326,6 +370,20 @@ namespace Thermo.Active.Config
|
||||
InMainMenuBar = Convert.ToBoolean(x.Element("inMainMenuBar").Value),
|
||||
Id = softwareId++.ToString()
|
||||
}).ToList();
|
||||
|
||||
// carico additionals parameters
|
||||
AdditionalParametersConfig = xmlConfigFile
|
||||
.Descendants("additionalParameters")
|
||||
.Elements("entry")
|
||||
.Select(x => new KeyValuePair<string,string>(x.Element("key").Value,x.Element("value").Value))
|
||||
.ToDictionary(x => x.Key, x => x.Value);
|
||||
|
||||
// carico unità di misura...
|
||||
UnitMeasuresConfig = xmlConfigFile
|
||||
.Descendants("unitOfMeasures")
|
||||
.Elements("unitOfMeasure")
|
||||
.Select(x => new KeyValuePair<int, string>(Convert.ToInt32(x.Attribute("id").Value), x.Attribute("value").Value))
|
||||
.ToDictionary(x => x.Key, x => x.Value);
|
||||
}
|
||||
|
||||
private static void ReadAreaConfig()
|
||||
@@ -628,7 +686,6 @@ namespace Thermo.Active.Config
|
||||
NumDec = Convert.ToInt32(x.Element("numDec").Value),
|
||||
MinVal = Convert.ToInt32(x.Element("minVal").Value),
|
||||
MaxVal = Convert.ToInt32(x.Element("maxVal").Value),
|
||||
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
<Content Include="Config\axesConfig.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Config\inputOperatorConfig.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Config\macrosConfig.xml">
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
@@ -200,6 +203,10 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Config\inputOperatorConfigValidator.xsd">
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<None Include="Config\Recipes\template.tpl">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
||||
@@ -687,7 +687,7 @@ public static class ThreadsFunctions
|
||||
//Update thread timer
|
||||
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
|
||||
// Wait 500 ms
|
||||
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
|
||||
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
|
||||
}
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
@@ -729,7 +729,7 @@ public static class ThreadsFunctions
|
||||
//Update thread timer
|
||||
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
|
||||
// Wait
|
||||
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
|
||||
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
|
||||
}
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
@@ -771,7 +771,7 @@ public static class ThreadsFunctions
|
||||
//Update thread timer
|
||||
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
|
||||
// Wait
|
||||
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
|
||||
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
|
||||
}
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
@@ -957,6 +957,54 @@ public static class ThreadsFunctions
|
||||
ncAdapter.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReadMComandsData()
|
||||
{
|
||||
NcAdapter ncAdapter = new NcAdapter();
|
||||
Stopwatch sw = new Stopwatch();
|
||||
|
||||
try
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
if (libraryError.errorCode != 0)
|
||||
ManageLibraryError(libraryError);
|
||||
|
||||
while (true)
|
||||
{
|
||||
sw.Restart();
|
||||
|
||||
if (ncAdapter.numericalControl.NC_IsConnected())
|
||||
{
|
||||
// solo x S7Net...
|
||||
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
|
||||
{
|
||||
libraryError = ncAdapter.GetM156Data(out List<DTOM156InputModel> m156Data);
|
||||
if (libraryError.IsError())
|
||||
ManageLibraryError(libraryError);
|
||||
else
|
||||
MessageServices.Current.Publish(SEND_M156_DATA, null, m156Data);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
RestoreConnection();
|
||||
|
||||
sw.Stop();
|
||||
|
||||
//Update thread timer
|
||||
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
|
||||
|
||||
// Wait
|
||||
Thread.Sleep(CalcSleepTime(200, (int)sw.ElapsedMilliseconds));
|
||||
}
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
{
|
||||
ncAdapter.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReadM154Data()
|
||||
{
|
||||
NcAdapter ncAdapter = new NcAdapter();
|
||||
|
||||
@@ -35,7 +35,9 @@ namespace Thermo.Active.Core
|
||||
ThreadsFunctions.ReadAreaData,
|
||||
ThreadsFunctions.ReadModulesData,
|
||||
ThreadsFunctions.ReadScadaData,
|
||||
ThreadsFunctions.ReadMComandsData,
|
||||
ThreadsFunctions.ReadM154Data // levare?
|
||||
|
||||
};
|
||||
private static Action ThreadSetupCmsConnect = ThreadsFunctions.SetupCmsConnect;
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Thermo.Active.Model.ConfigModels
|
||||
{
|
||||
public class InputOperatorConfigModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public Dictionary<string, string> Messages { get; set; }
|
||||
public Dictionary<byte, Dictionary<string, string>> Buttons { get; set; }
|
||||
public string Type { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -222,9 +222,8 @@ namespace Thermo.Active.Model
|
||||
|
||||
public const int numRecProdPanelGraph = 30;
|
||||
public const string CONFIG_DIRECTORY = "Config\\";
|
||||
public const string RECIPE_DIRECTORY = "Recipes\\";
|
||||
public const string RECIPE_TEMPLATE_PATH = CONFIG_DIRECTORY + RECIPE_DIRECTORY + "template.tpl";
|
||||
public const string LIVE_RECIPE_PATH = TEMP_FOLDER + RECIPE_DIRECTORY + "current.rcp";
|
||||
public const string RECIPE_TEMPLATE_PATH = CONFIG_DIRECTORY + "Recipes\\template.tpl";
|
||||
public const string LIVE_RECIPE_PATH = TEMP_FOLDER + "Recipes\\current.rcp";
|
||||
public const string RESOURCE_DIRECTORY = @"Thermo.Active.Config.Config.";
|
||||
public const string SERVER_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + @"serverConfigValidator.xsd";
|
||||
public const string SERVER_CONFIG_PATH = CONFIG_DIRECTORY + "serverConfig.xml";
|
||||
@@ -232,6 +231,9 @@ namespace Thermo.Active.Model
|
||||
public const string AREAS_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + "areasConfigValidator.xsd";
|
||||
public const string AREAS_CONFIG_PATH = CONFIG_DIRECTORY + "areasConfig.xml";
|
||||
|
||||
public const string M156_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + "inputOperatorConfigValidator.xsd";
|
||||
public const string M156_CONFIG_PATH = CONFIG_DIRECTORY + "inputOperatorConfig.xml";
|
||||
|
||||
public const string MAINTENANCES_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + "maintenancesConfigValidator.xsd";
|
||||
public const string CUSTOMER_CONTACTS_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + "customerContactConfigValidator.xsd";
|
||||
public const string MAINTENANCES_CONFIG_PATH = CONFIG_DIRECTORY + "maintenancesConfig.xml";
|
||||
@@ -309,6 +311,7 @@ namespace Thermo.Active.Model
|
||||
public const string SEND_ACTIVE_PROGRAM_DATA = "SEND_ACTIVE_PROGRAM_DATA";
|
||||
public const string SEND_QUEUE_DATA = "SEND_QUEUE_DATA";
|
||||
public const string SEND_M155_DATA = "SEND_M155_DATA";
|
||||
public const string SEND_M156_DATA = "SEND_M156_DATA";
|
||||
public const string SEND_SCADA_DATA = "SEND_SCADA_DATA";
|
||||
|
||||
// MVVM Messages for Thermo active specs
|
||||
|
||||
@@ -20,6 +20,7 @@ namespace Thermo.Active.Model.DTOModels
|
||||
public bool SiemensKeyboardOption { get; set; }
|
||||
|
||||
public List<ExtSoftwareModel> ExtSoftwares { get; set; }
|
||||
public Dictionary<string, string> AdditionalParameters { get; set; }
|
||||
|
||||
public CultureInfo DefaultLanguage
|
||||
{
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static CMS_CORE_Library.Models.DataStructures;
|
||||
|
||||
namespace Thermo.Active.Model.DTOModels
|
||||
{
|
||||
public class DTOM156InputModel : M156InputIsNeededModel
|
||||
{
|
||||
public Dictionary<byte, string> Buttons;
|
||||
public string Type;
|
||||
public bool isM156 = true;
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (!(obj is DTOM156InputModel item))
|
||||
return false;
|
||||
|
||||
if (Process != item.Process)
|
||||
return false;
|
||||
|
||||
if (Type != item.Type)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,10 @@ namespace Thermo.Active.Model.DTOModels.ThRecipe
|
||||
/// </summary>
|
||||
public string RecipeName = "current.json";
|
||||
/// <summary>
|
||||
/// Current DIR of loaded recipe
|
||||
/// </summary>
|
||||
public string RecipeDir = "";
|
||||
/// <summary>
|
||||
/// User that made last save
|
||||
/// </summary>
|
||||
public string UserSave = "";
|
||||
@@ -35,7 +39,9 @@ namespace Thermo.Active.Model.DTOModels.ThRecipe
|
||||
/// Note ricetta
|
||||
/// </summary>
|
||||
public string recipeNotes = "";
|
||||
/// <summary>
|
||||
/// Verifica se sia cambiata da versione letta
|
||||
/// </summary>
|
||||
public bool hasChanged = false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
<Compile Include="ConfigModels\AlarmsConfigModel.cs" />
|
||||
<Compile Include="ConfigModels\CmsConnectConfigModel.cs" />
|
||||
<Compile Include="ConfigModels\ExtSoftwareModel.cs" />
|
||||
<Compile Include="ConfigModels\InputOperatorConfigModel.cs" />
|
||||
<Compile Include="ConfigModels\ThermoProdConfigModel.cs" />
|
||||
<Compile Include="ConfigModels\ModBlockConfigModel.cs" />
|
||||
<Compile Include="ConfigModels\RiskConfigModel.cs" />
|
||||
@@ -106,6 +107,7 @@
|
||||
<Compile Include="DTOModels\DTOAxesModel.cs" />
|
||||
<Compile Include="DTOModels\DTOAxisNameModel.cs" />
|
||||
<Compile Include="DTOModels\DTOClientConfigurationModel.cs" />
|
||||
<Compile Include="DTOModels\DTOM156InputModel.cs" />
|
||||
<Compile Include="DTOModels\ThModules\DTOModulesBlock.cs" />
|
||||
<Compile Include="DTOModels\ThProd\DTOProdInfo.cs" />
|
||||
<Compile Include="DTOModels\ThProd\DTOThermoPanelProd.cs" />
|
||||
|
||||
@@ -1270,6 +1270,45 @@ namespace Thermo.Active.NC
|
||||
return numericalControl.PLC_RM154Data(ref data, ref MTCStatus);
|
||||
}
|
||||
|
||||
public CmsError GetM156Data(out List<DTOM156InputModel> data)
|
||||
{
|
||||
data = new List<DTOM156InputModel>();
|
||||
List<M156InputIsNeededModel> ncData = new List<M156InputIsNeededModel>();
|
||||
CmsError cmsError = numericalControl.PLC_RM156Data(ref ncData);
|
||||
if (cmsError.IsError())
|
||||
return cmsError;
|
||||
|
||||
if (ncData.Count() > 0)
|
||||
{
|
||||
foreach (var m156Message in ncData)
|
||||
{
|
||||
var inp = InputsOperatorConfig.Where(x => m156Message.Id == x.Id).FirstOrDefault();
|
||||
|
||||
if (inp != null)
|
||||
{
|
||||
var buttons = inp.Buttons?.ToDictionary(x => x.Key, x => x.Key.ToString());
|
||||
data.Add(new DTOM156InputModel()
|
||||
{
|
||||
Id = inp.Id,
|
||||
isM156 = true,
|
||||
Buttons = buttons,
|
||||
Type = inp.Type,
|
||||
Process = m156Message.Process,
|
||||
Value = m156Message.Value
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
public CmsError WriteM156Data(int process, double responseValue)
|
||||
{
|
||||
return numericalControl.PLC_WM156Response(process, responseValue);
|
||||
}
|
||||
|
||||
|
||||
public CmsError WriteM154Ack(int processId)
|
||||
{
|
||||
return numericalControl.PLC_W154ManageAck(processId);
|
||||
@@ -1425,7 +1464,16 @@ namespace Thermo.Active.NC
|
||||
else
|
||||
{
|
||||
// confronto ultimo pezzo --> se diverso sono cambiati
|
||||
dataChanged = (LastProdPanelData.NumDone != lastProdInfoData.NumDone);
|
||||
bool changeSetpoint = true;
|
||||
if (lastRecipe != null)
|
||||
{
|
||||
if (lastRecipe.ContainsKey("pyrometer_pyrometer_setpoint"))
|
||||
{
|
||||
changeSetpoint = LastProdPanelData.TempSetpoint != lastRecipe["pyrometer_pyrometer_setpoint"].SetpointPLC;
|
||||
}
|
||||
}
|
||||
bool changeNumPz = LastProdPanelData.NumDone != lastProdInfoData.NumDone;
|
||||
dataChanged = changeNumPz || changeSetpoint;
|
||||
}
|
||||
}
|
||||
if (dataChanged)
|
||||
@@ -1440,10 +1488,24 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
currentProdPanel.LastCadenza = Math.Round((double)3600000 / lastProdInfoData.TimeCycleGross, 2);
|
||||
}
|
||||
// se il valore SALVATO è > 3 * valore rilevato --> uso SOLO ultimo
|
||||
if (lastCycle > 3 * currentProdPanel.LastCadenza)
|
||||
{
|
||||
lastCycle = currentProdPanel.LastCadenza;
|
||||
}
|
||||
// altrimenti EWMA da parametro calcolato standard, default 50%
|
||||
else
|
||||
{
|
||||
//lastCycle = 0.5 * lastCycle + 0.5 * lastDuration;
|
||||
lastCycle = ewmaLambda * currentProdPanel.LastCadenza + (1 - ewmaLambda) * lastCycle;
|
||||
}
|
||||
// salvo anche nei live data della ricetta...
|
||||
RecipeLiveData.TC_last = lastCycle;
|
||||
|
||||
// stima durata da pz fatti...
|
||||
//currentProdPanel.StimaDurata = Math.Round((currentProdPanel.NumTarget - currentProdPanel.NumDone) * currentProdPanel.LastTCiclo, 2);
|
||||
// 2020.09.03 uso dati da ricetta corrente... stimata con EWMA
|
||||
currentProdPanel.StimaDurata = Math.Round((currentProdPanel.NumTarget - currentProdPanel.NumDone) * RecipeLiveData.TC_last, 2);
|
||||
// 2020.09.03 uso dati da ricetta corrente... stimata con EWMA, in SECONDI!
|
||||
currentProdPanel.StimaDurata = Math.Round((currentProdPanel.NumTarget - currentProdPanel.NumDone) * lastCycle, 2);
|
||||
// se stima negativa (+ pezzi di quanti richiesti...) --> ZERO!
|
||||
currentProdPanel.StimaDurata = currentProdPanel.StimaDurata < 0 ? 0 : currentProdPanel.StimaDurata;
|
||||
}
|
||||
@@ -1498,6 +1560,7 @@ namespace Thermo.Active.NC
|
||||
try
|
||||
{
|
||||
currentProdPanel.InizioProd = prodInfoFirst.FirstOrDefault().DtEvent;
|
||||
lottoStart = currentProdPanel.InizioProd;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
@@ -1773,7 +1836,7 @@ namespace Thermo.Active.NC
|
||||
Id = item.Id,
|
||||
Range = currRange,
|
||||
Status = currStatus,
|
||||
UnitMeasure = "",
|
||||
UnitMeasure = getUM(paramPLC.UnitMeasure),
|
||||
ValueAct = paramPLC.ValueAct / item.ScaleFactor,
|
||||
SetpointHMI = paramPLC.SetpointHMI / item.ScaleFactor,
|
||||
SetpointPLC = paramPLC.SetpointPLC / item.ScaleFactor,
|
||||
@@ -1821,6 +1884,19 @@ namespace Thermo.Active.NC
|
||||
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
protected string getUM(int um)
|
||||
{
|
||||
// default: no translation...
|
||||
string answ = $"{um}";
|
||||
// cerco in dictionary...
|
||||
if (UnitMeasuresConfig.ContainsKey(um))
|
||||
{
|
||||
answ = UnitMeasuresConfig[um];
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recipe Parameters write to PLC (only SetpointHMI)
|
||||
/// </summary>
|
||||
@@ -2320,6 +2396,46 @@ namespace Thermo.Active.NC
|
||||
return libraryError;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Comparazione elenco parametri della ricetta
|
||||
/// </summary>
|
||||
/// <param name="dictSource"></param>
|
||||
/// <param name="dictDest"></param>
|
||||
/// <param name="isEqual"></param>
|
||||
/// <returns></returns>
|
||||
public CmsError paramsComparer(Dictionary<string, double> dictSource, Dictionary<string, double> dictDest, out bool isEqual)
|
||||
{
|
||||
CmsError libraryError = NO_ERROR;
|
||||
// inizio dal count
|
||||
isEqual = dictSource.Count == dictDest.Count;
|
||||
// se uguale conteggio procedo...
|
||||
if (isEqual)
|
||||
{
|
||||
foreach (var pair in dictSource)
|
||||
{
|
||||
double value;
|
||||
if (dictDest.TryGetValue(pair.Key, out value))
|
||||
{
|
||||
// Require value be equal.
|
||||
if (value != pair.Value)
|
||||
{
|
||||
isEqual = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Require key be present.
|
||||
isEqual = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// return ok!
|
||||
return libraryError;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Legge tutti i parametri della ricetta e calcolo la overview dei vari steps
|
||||
/// </summary>
|
||||
|
||||
@@ -611,7 +611,9 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
try
|
||||
{
|
||||
ReadLiveData();
|
||||
RecipeLiveData = readLiveData();
|
||||
// salva current
|
||||
SaveRecipeCurrent();
|
||||
}
|
||||
catch (XmlException ex)
|
||||
{
|
||||
@@ -632,9 +634,9 @@ namespace Thermo.Active.NC
|
||||
/// <summary>
|
||||
/// Try to load live data from json persistence file
|
||||
/// </summary>
|
||||
public static bool ReadLiveData()
|
||||
public static LiveData readLiveData()
|
||||
{
|
||||
bool answ = false;
|
||||
LiveData answ = null;
|
||||
if (File.Exists(LIVE_RECIPE_PATH))
|
||||
{
|
||||
// load all text data
|
||||
@@ -642,11 +644,10 @@ namespace Thermo.Active.NC
|
||||
try
|
||||
{
|
||||
// deserialize to object
|
||||
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
answ = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
answ = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -655,18 +656,15 @@ namespace Thermo.Active.NC
|
||||
try
|
||||
{
|
||||
// deserialize to object
|
||||
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
answ = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
// from template --> reset (if present) overview data...
|
||||
foreach (var item in RecipeLiveData.RecipeOverview)
|
||||
{
|
||||
RecipeLiveData.RecipeOverview[item.Key] = RecipeCatStatus.Unchanged;
|
||||
answ.RecipeOverview[item.Key] = RecipeCatStatus.Unchanged;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
// salva current
|
||||
SaveRecipeCurrent();
|
||||
answ = true;
|
||||
}
|
||||
// rendo se fatto
|
||||
return answ;
|
||||
@@ -674,9 +672,9 @@ namespace Thermo.Active.NC
|
||||
/// <summary>
|
||||
/// Try to load selected recipe to live data (memory and json persistence file)
|
||||
/// </summary>
|
||||
public static bool LoadRecipe(string filePath)
|
||||
public static LiveData LoadRecipe(string filePath)
|
||||
{
|
||||
bool answ = false;
|
||||
LiveData answ = null;
|
||||
// check file extension: accetta json / rcp / tpl
|
||||
if (!(filePath.EndsWith(".json") || filePath.EndsWith(".rcp") || filePath.EndsWith(".tpl")))
|
||||
{
|
||||
@@ -689,27 +687,27 @@ namespace Thermo.Active.NC
|
||||
if (!Path.IsPathRooted(filePath))
|
||||
{
|
||||
// controllo se ha path della recipe directory
|
||||
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
|
||||
if (!filePath.Contains(NcConfig.SharedPath) && filePath != RECIPE_TEMPLATE_PATH)
|
||||
{
|
||||
// aggiungo base path!
|
||||
filePath = RECIPE_DIRECTORY + filePath;
|
||||
filePath = NcConfig.SharedPath + filePath;
|
||||
}
|
||||
}
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
answ = true;
|
||||
|
||||
// load all text data
|
||||
var rawData = File.ReadAllText(filePath);
|
||||
try
|
||||
{
|
||||
// deserialize to object
|
||||
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
answ = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
// fix directory se mancasse
|
||||
answ.RecipeDir = $"{Path.GetDirectoryName(filePath)}\\";
|
||||
// fix Modifica dati
|
||||
answ.hasChanged = false;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
// update current live data!
|
||||
SaveRecipeCurrent();
|
||||
}
|
||||
// rendo se fatto
|
||||
return answ;
|
||||
@@ -731,6 +729,10 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
// deserialize to object
|
||||
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
|
||||
// fix directory default
|
||||
RecipeLiveData.RecipeDir = NcConfig.SharedPath;
|
||||
// fix Modifica dati
|
||||
RecipeLiveData.hasChanged = false;
|
||||
// from template --> reset (if present) overview data...
|
||||
if (RecipeLiveData.RecipeOverview != null)
|
||||
{
|
||||
@@ -758,16 +760,18 @@ namespace Thermo.Active.NC
|
||||
bool answ = false;
|
||||
try
|
||||
{
|
||||
answ = true;
|
||||
// indico che ora è OK x salvataggio...
|
||||
RecipeLiveData.hasChanged = false;
|
||||
// serialize
|
||||
string rawData = JsonConvert.SerializeObject(RecipeLiveData, Newtonsoft.Json.Formatting.Indented);
|
||||
// save live!
|
||||
var dir = Path.GetDirectoryName(LIVE_RECIPE_PATH);
|
||||
var dir = $"{Path.GetDirectoryName(LIVE_RECIPE_PATH)}\\";
|
||||
if (!Directory.Exists(dir))
|
||||
{
|
||||
Directory.CreateDirectory(dir);
|
||||
}
|
||||
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
|
||||
answ = true;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
@@ -786,31 +790,38 @@ namespace Thermo.Active.NC
|
||||
try
|
||||
{
|
||||
// save live!
|
||||
var dir = Path.GetDirectoryName(RECIPE_DIRECTORY);
|
||||
var dir = $"{Path.GetDirectoryName(NcConfig.SharedPath)}\\";
|
||||
if (!Directory.Exists(dir))
|
||||
{
|
||||
Directory.CreateDirectory(dir);
|
||||
}
|
||||
|
||||
// se non ho name valido --> FIX come svg...
|
||||
if (!filePath.EndsWith(".svg"))
|
||||
{
|
||||
filePath = RecipeLiveData.RecipeName.Replace(".rcp", ".svg");
|
||||
}
|
||||
// Delete previous image
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
File.Delete(filePath);
|
||||
}
|
||||
|
||||
if (!Path.IsPathRooted(filePath))
|
||||
{
|
||||
// aggiungo base path!
|
||||
filePath = RECIPE_DIRECTORY + filePath;
|
||||
// aggiungo base path! se ho path della ricetta corrente uso quella...
|
||||
string currPath = RecipeLiveData.RecipeDir;
|
||||
if (!string.IsNullOrEmpty(currPath))
|
||||
{
|
||||
currPath = NcConfig.SharedPath;
|
||||
}
|
||||
filePath = $"{currPath}{filePath}";
|
||||
}
|
||||
|
||||
// Save NEW image
|
||||
File.WriteAllBytes(filePath, fileData);
|
||||
imageUploaded = true;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
|
||||
|
||||
return imageUploaded;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -820,6 +831,7 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
// duplicate data...
|
||||
LiveData data2save = RecipeLiveData;
|
||||
data2save.RecipeDir = NcConfig.SharedPath;
|
||||
// template --> reset overview data...
|
||||
data2save.RecipeOverview = new Dictionary<RecipeSection, RecipeCatStatus>();
|
||||
return SaveRecipe(RECIPE_TEMPLATE_PATH, data2save);
|
||||
@@ -839,24 +851,25 @@ namespace Thermo.Active.NC
|
||||
// default: ricetta!
|
||||
filePath += ".rcp";
|
||||
}
|
||||
string fileName = Path.GetFileName(filePath);
|
||||
|
||||
// fix name!
|
||||
currRecipe.RecipeName = fileName;
|
||||
// serialize
|
||||
string rawData = JsonConvert.SerializeObject(currRecipe, Newtonsoft.Json.Formatting.Indented);
|
||||
// save live!
|
||||
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
|
||||
// verifica path
|
||||
if (!Path.IsPathRooted(filePath))
|
||||
{
|
||||
// controllo se ha path della recipe directory
|
||||
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
|
||||
if (!filePath.Contains(NcConfig.SharedPath) && filePath != RECIPE_TEMPLATE_PATH)
|
||||
{
|
||||
// aggiungo base path!
|
||||
filePath = RECIPE_DIRECTORY + filePath;
|
||||
filePath = NcConfig.SharedPath + filePath;
|
||||
}
|
||||
}
|
||||
|
||||
// fix name, path, modifica!
|
||||
currRecipe.RecipeName = Path.GetFileName(filePath);
|
||||
currRecipe.RecipeDir = $"{Path.GetDirectoryName(filePath)}\\";
|
||||
currRecipe.hasChanged = false;
|
||||
// serialize
|
||||
string rawData = JsonConvert.SerializeObject(currRecipe, Newtonsoft.Json.Formatting.Indented);
|
||||
// save live!
|
||||
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
|
||||
// save!
|
||||
File.WriteAllText(filePath, rawData);
|
||||
}
|
||||
|
||||
@@ -183,6 +183,19 @@ namespace Thermo.Active.Controllers.SignalR
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
[SignalRAuthorize(FunctionAccess = GENERAL, Action = ACTIONS.WRITE)]
|
||||
public void WriteM156Response(int process, double responseVal)
|
||||
{
|
||||
using (NcAdapter ncAdapter = new NcAdapter())
|
||||
{
|
||||
ncAdapter.Connect();
|
||||
CmsError cmsError = ncAdapter.WriteM156Data(process, responseVal);
|
||||
if (cmsError.IsError())
|
||||
throw new HubException(cmsError.localizationKey);
|
||||
}
|
||||
}
|
||||
|
||||
[SignalRAuthorize(FunctionAccess = GENERAL, Action = ACTIONS.WRITE)]
|
||||
public void WriteScadaValue(string memIndex, SCADA_MEM_TYPE memType, object value)
|
||||
{
|
||||
|
||||
@@ -45,6 +45,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
ProdEnabled = SoftwareProdConfig.Enabled,
|
||||
ProdPath = SoftwareProdConfig.Path,
|
||||
ExtSoftwares = ExtSoftwaresConfig,
|
||||
AdditionalParameters = AdditionalParametersConfig,
|
||||
Autorun = ServerStartupConfig.AutoOpenCmsClient,
|
||||
EditorPath = ServerStartupConfig.TextEditorPath,
|
||||
MgiOption = NcConfig.MgiOption,
|
||||
|
||||
@@ -55,10 +55,10 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
Dictionary<string, string> alarmsNames = GetPlcAlarmsTranslations(language);
|
||||
Dictionary<string, string> headsNames = GetLocalizedHeadsNames(language);
|
||||
|
||||
// scada
|
||||
Dictionary<string, string> scadaTranslations = GetScadaTranslations(language);
|
||||
Dictionary<string, string> m156Translations = GetM156Translations(language);
|
||||
|
||||
// THermo (modules and recipe enums) translations
|
||||
// Thermo (modules and recipe enums) translations
|
||||
Dictionary<string, string> thermoTranslations = GetThermoTranslations(language);
|
||||
|
||||
|
||||
@@ -72,7 +72,9 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
translations = translations.Concat(headsNames).ToDictionary(x => x.Key, x => x.Value);
|
||||
// Scada
|
||||
translations = translations.Concat(scadaTranslations).ToDictionary(x => x.Key, x => x.Value);
|
||||
// Scada
|
||||
// M156
|
||||
translations = translations.Concat(m156Translations).ToDictionary(x => x.Key, x => x.Value);
|
||||
// Thermo
|
||||
translations = translations.Concat(thermoTranslations).ToDictionary(x => x.Key, x => x.Value);
|
||||
|
||||
if (translations == null)
|
||||
@@ -210,5 +212,31 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
return translatedNames;
|
||||
}
|
||||
|
||||
public static Dictionary<string, string> GetM156Translations(string language)
|
||||
{
|
||||
Dictionary<string, string> translatedNames = new Dictionary<string, string>();
|
||||
|
||||
foreach (var input in InputsOperatorConfig)
|
||||
{
|
||||
translatedNames.Add(
|
||||
"m156_title_" + input.Id,
|
||||
GetValueFromLocalizationList(input.Messages, language, "Title_" + input.Id)
|
||||
);
|
||||
|
||||
if (input.Buttons != null && input.Buttons.Count() > 0)
|
||||
foreach (var button in input.Buttons)
|
||||
{
|
||||
// Add translated button text to the list
|
||||
// Buttons have a Dictionary<string, string> with the translations
|
||||
translatedNames.Add(
|
||||
"m156_" + input.Id + "_button_" + button.Key,
|
||||
GetValueFromLocalizationList(button.Value, language, "Button_" + button.Key)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return translatedNames;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,6 +70,16 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
return Ok(currRecipe);
|
||||
}
|
||||
[Route("recipeNotes"), HttpGet]
|
||||
public IHttpActionResult GetRecipeNotes()
|
||||
{
|
||||
return Ok(NcAdapter.RecipeLiveData.recipeNotes);
|
||||
}
|
||||
[Route("recipeChanged"), HttpGet]
|
||||
public IHttpActionResult GetChanged()
|
||||
{
|
||||
return Ok(NcAdapter.RecipeLiveData.hasChanged);
|
||||
}
|
||||
|
||||
[Route("update"), HttpPut]
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
@@ -77,7 +87,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
{
|
||||
if (parametersList != null)
|
||||
{
|
||||
if (NcFileAdapter.RecipeLiveData != null)
|
||||
if (NcAdapter.RecipeLiveData != null)
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
@@ -119,6 +129,8 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
if (updtRecipe.Count > 0)
|
||||
{
|
||||
// salvo che la ricetta è cambiata
|
||||
NcAdapter.RecipeLiveData.hasChanged = true;
|
||||
// scrivo sul PLC con i parametri specificati x ritardo/raggruppamento
|
||||
ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite);
|
||||
}
|
||||
@@ -148,7 +160,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
public IHttpActionResult ConfirmEdit(RecipeSection section)
|
||||
{
|
||||
if (NcFileAdapter.RecipeLiveData != null)
|
||||
if (NcAdapter.RecipeLiveData != null)
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
@@ -211,7 +223,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
public IHttpActionResult CancelEdit()
|
||||
{
|
||||
if (NcFileAdapter.RecipeLiveData != null)
|
||||
if (NcAdapter.RecipeLiveData != null)
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
@@ -231,6 +243,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
// recupero i dati LIVE dei parametri HMI della ricetta...
|
||||
libraryError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
||||
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}");
|
||||
@@ -267,13 +280,18 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
{
|
||||
|
||||
// chiamo metodo di lettura...
|
||||
bool fatto = NcFileAdapter.LoadRecipe(newName);
|
||||
if (!fatto)
|
||||
var dataRead = NcFileAdapter.LoadRecipe(newName);
|
||||
if (dataRead == null)
|
||||
{
|
||||
ThermoActiveLogger.LogError($"LoadRecipe error");
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
// salvo in memoria ricetta live
|
||||
NcAdapter.RecipeLiveData = dataRead;
|
||||
// update current live data!
|
||||
NcFileAdapter.SaveRecipeCurrent();
|
||||
|
||||
CmsError libraryError = WriteCurrentRecipeToPlc();
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
@@ -330,7 +348,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
using (UsersController usersController = new UsersController())
|
||||
{
|
||||
var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value));
|
||||
NcFileAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
}
|
||||
|
||||
// recupero i dati LIVE dei parametri HMI della ricetta...
|
||||
@@ -368,7 +386,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
using (UsersController usersController = new UsersController())
|
||||
{
|
||||
var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value));
|
||||
NcFileAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
}
|
||||
|
||||
// recupero i dati LIVE dei parametri HMI della ricetta...
|
||||
@@ -386,9 +404,9 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
}
|
||||
|
||||
// ora salvo ANCHE i dati live...
|
||||
NcFileAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
NcAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
// e salvo su disco
|
||||
NcFileAdapter.SaveRecipe(newName, NcFileAdapter.RecipeLiveData);
|
||||
NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData);
|
||||
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
@@ -426,7 +444,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
}
|
||||
|
||||
// ora salvo nei dati live...
|
||||
NcFileAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
NcAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
|
||||
// carico i dati dei riscaldi...
|
||||
var currChSet = new Dictionary<int, int>();
|
||||
@@ -434,7 +452,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
{
|
||||
currChSet.Add(item.Key, item.Value.SetpointHMI);
|
||||
}
|
||||
NcFileAdapter.RecipeLiveData.ChannelSetpoints = currChSet;
|
||||
NcAdapter.RecipeLiveData.ChannelSetpoints = currChSet;
|
||||
|
||||
|
||||
// e salvo su disco
|
||||
@@ -479,10 +497,10 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
// salvo note...
|
||||
if (!string.IsNullOrEmpty(recipeNotes))
|
||||
{
|
||||
NcFileAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
}
|
||||
// e salvo su disco
|
||||
NcFileAdapter.SaveRecipe(NcFileAdapter.RecipeLiveData.RecipeName, NcFileAdapter.RecipeLiveData);
|
||||
NcFileAdapter.SaveRecipe(NcAdapter.RecipeLiveData.RecipeName, NcAdapter.RecipeLiveData);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
@@ -500,13 +518,13 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
using (UsersController usersController = new UsersController())
|
||||
{
|
||||
var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value));
|
||||
NcFileAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString();
|
||||
}
|
||||
|
||||
// salvo note...
|
||||
if (!string.IsNullOrEmpty(recipeNotes))
|
||||
{
|
||||
NcFileAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
}
|
||||
|
||||
bool imageUploaded = false;
|
||||
@@ -545,15 +563,17 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
currParams.Add(item.Key, item.Value.SetpointPLC);
|
||||
}
|
||||
// salvo parametri
|
||||
NcFileAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
NcAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
|
||||
// ora salvo il dato del TC stimato se presente
|
||||
if (estimTimeSec > 0)
|
||||
{
|
||||
NcFileAdapter.RecipeLiveData.TC_last = estimTimeSec;
|
||||
NcAdapter.RecipeLiveData.TC_last = estimTimeSec;
|
||||
}
|
||||
// indico che non è + modificata...
|
||||
NcAdapter.RecipeLiveData.hasChanged = false;
|
||||
// e salvo su disco
|
||||
NcFileAdapter.SaveRecipe(newName, NcFileAdapter.RecipeLiveData);
|
||||
NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData);
|
||||
}
|
||||
return Ok();
|
||||
}
|
||||
@@ -567,7 +587,13 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
try
|
||||
{
|
||||
// ora salvo ANCHE i dati live...
|
||||
NcFileAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
NcAdapter.RecipeLiveData.RecipeParameters = currParams;
|
||||
// verifico SE siano cambiati rispetto a versione originale...
|
||||
var originalRecipe = NcFileAdapter.LoadRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}");
|
||||
// comparazione parametri...
|
||||
bool isEqual = false;
|
||||
ncAdapter.paramsComparer(originalRecipe.RecipeParameters, currParams, out isEqual);
|
||||
NcAdapter.RecipeLiveData.hasChanged = !isEqual;
|
||||
// e salvo su disco
|
||||
NcFileAdapter.SaveRecipeCurrent();
|
||||
}
|
||||
@@ -604,7 +630,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
// save parameters to PLC!!!
|
||||
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
|
||||
foreach (var item in NcFileAdapter.RecipeLiveData.RecipeParameters)
|
||||
foreach (var item in NcAdapter.RecipeLiveData.RecipeParameters)
|
||||
{
|
||||
if (prevRecipe.ContainsKey(item.Key))
|
||||
{
|
||||
@@ -632,7 +658,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
// process ch load setup...
|
||||
Dictionary<int, int> newRisk = new Dictionary<int, int>();
|
||||
foreach (var item in NcFileAdapter.RecipeLiveData.ChannelSetpoints)
|
||||
foreach (var item in NcAdapter.RecipeLiveData.ChannelSetpoints)
|
||||
{
|
||||
newRisk.Add(item.Key, item.Value);
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
try
|
||||
{
|
||||
// ora salvo ANCHE i dati live...
|
||||
NcFileAdapter.RecipeLiveData.ChannelSetpoints = chSetpoints;
|
||||
NcAdapter.RecipeLiveData.ChannelSetpoints = chSetpoints;
|
||||
// e salvo su disco
|
||||
NcFileAdapter.SaveRecipeCurrent();
|
||||
}
|
||||
|
||||
@@ -86,6 +86,10 @@ namespace Thermo.Active.Listeners
|
||||
{
|
||||
SignalRListener.SetGatewayRebootStatus(a);
|
||||
}));
|
||||
infos.Add(MessageServices.Current.Subscribe(SEND_M156_DATA, (a, b) =>
|
||||
{
|
||||
SignalRListener.SendM156Data(a);
|
||||
}));
|
||||
|
||||
// add specific modules for THERMO
|
||||
infos.Add(MessageServices.Current.Subscribe(SEND_THERMO_RECIPE_FULL, (a, b) =>
|
||||
|
||||
@@ -239,6 +239,17 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
}
|
||||
}
|
||||
#endif
|
||||
public static void SendM156Data(object data)
|
||||
{
|
||||
List<DTOM156InputModel> dtoM156Data = data as List<DTOM156InputModel>;
|
||||
|
||||
if (!LastM156Data.SequenceEqual(dtoM156Data))
|
||||
{
|
||||
LastM156Data = dtoM156Data;
|
||||
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
|
||||
context.Clients.Group("ncData").m156Data(dtoM156Data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SendScadaData(object scada)
|
||||
{
|
||||
@@ -455,6 +466,8 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void SetGatewayRebootStatus(object status)
|
||||
{
|
||||
string msg = status.ToString();
|
||||
@@ -514,7 +527,9 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
group.magazineIsActive(LastNcMagazineIsActive);
|
||||
// Send PP Queue
|
||||
group.partProgramQueue(LastPartProgramQueue);
|
||||
|
||||
// Send m156
|
||||
group.m156Data(LastM156Data);
|
||||
|
||||
// Send Scada
|
||||
group.scadaData(LastScadaData);
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace Thermo.Active.Listeners
|
||||
#if false
|
||||
public static List<DTOM155InputModel> LastM155Data = new List<DTOM155InputModel>();
|
||||
#endif
|
||||
public static List<DTOM156InputModel> LastM156Data = new List<DTOM156InputModel>();
|
||||
public static List<DTOScadaModel> LastScadaData = new List<DTOScadaModel>();
|
||||
|
||||
// FIXME TODO inserire oggetti corretti per THERMO
|
||||
|
||||
@@ -30,4 +30,4 @@ using System.Runtime.InteropServices;
|
||||
//
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("0.12.73")]
|
||||
[assembly: AssemblyVersion("0.15.85")]
|
||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
@@ -378,8 +378,9 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
margin-left: 5px;
|
||||
|
||||
&.error {
|
||||
background-color: rgba(255, 0, 0, .7);
|
||||
background-color: rgba(255, 0, 0, .7) !important;
|
||||
color: #222;
|
||||
background-image: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -176,6 +176,7 @@
|
||||
font-size: 120px;
|
||||
font-weight: 300;
|
||||
z-index: 1;
|
||||
max-height: 140px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,9 @@ footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
img {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
|
||||
@@ -139,6 +139,25 @@ select:focus {
|
||||
|
||||
}
|
||||
|
||||
.input-select{
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #6d6d6d;
|
||||
min-width: 200px;
|
||||
width: fit-content;
|
||||
height: 48px;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
|
||||
border: none;
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
padding: 0 10px;
|
||||
align-items: center;
|
||||
justify-content: stretch;
|
||||
padding-right: 25px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.input-area {
|
||||
width: 100%;
|
||||
|
||||
@@ -216,6 +216,17 @@
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
.content-modal-showval {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
span {
|
||||
word-wrap: break-word;
|
||||
max-width: 700px;
|
||||
font-size: 30px
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.content-btn {
|
||||
width: 592px;
|
||||
@@ -1159,7 +1170,7 @@
|
||||
justify-content: center;
|
||||
|
||||
&.nc {
|
||||
z-index: 700;
|
||||
z-index: 1002;
|
||||
}
|
||||
|
||||
&.internal {
|
||||
@@ -2378,7 +2389,7 @@
|
||||
line-height: 4px;
|
||||
|
||||
.title {
|
||||
width: 110px;
|
||||
min-width: 110px;
|
||||
text-align: right;
|
||||
color: @color-darkish-blue;
|
||||
}
|
||||
|
||||
@@ -548,6 +548,15 @@ article .box .body {
|
||||
.modal.m155 .content-real-showval input {
|
||||
margin-left: auto;
|
||||
}
|
||||
.modal.m155 .content-modal-showval {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.modal.m155 .content-modal-showval span {
|
||||
word-wrap: break-word;
|
||||
max-width: 700px;
|
||||
font-size: 30px;
|
||||
}
|
||||
.modal.m155 .content-btn {
|
||||
width: 592px;
|
||||
box-shadow: 0 0px 3px 0 rgba(0, 0, 0, 0.4);
|
||||
@@ -1356,7 +1365,7 @@ article .box .body {
|
||||
justify-content: center;
|
||||
}
|
||||
.backdrop.nc {
|
||||
z-index: 700;
|
||||
z-index: 1002;
|
||||
}
|
||||
.backdrop.internal {
|
||||
height: calc(100vh - 80px);
|
||||
@@ -2523,7 +2532,7 @@ article .box .body {
|
||||
.modal.modal-add-element-queue .modal-load-program-body .selected-item .selected-item-header .subtitle .title,
|
||||
.modal.modal-load-program .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .title,
|
||||
.modal.modal-add-element-queue .modal-add-element-queue-body .selected-item .selected-item-header .subtitle .title {
|
||||
width: 110px;
|
||||
min-width: 110px;
|
||||
text-align: right;
|
||||
color: #002680;
|
||||
}
|
||||
@@ -4301,6 +4310,7 @@ article .box .body {
|
||||
font-size: 120px;
|
||||
font-weight: 300;
|
||||
z-index: 1;
|
||||
max-height: 140px;
|
||||
}
|
||||
.dashboard .first_col .timing-area .start::before {
|
||||
background-image: url(/assets/svg/dashboard-top-left.svg);
|
||||
@@ -5064,9 +5074,7 @@ article .box .body {
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
|
||||
display: grid;
|
||||
grid-template-columns: 48px 101px;
|
||||
grid-template-rows: 48px;
|
||||
height: 48px;
|
||||
}
|
||||
.modal.processo-info header .tab-header button span {
|
||||
margin: auto;
|
||||
@@ -5518,6 +5526,25 @@ select:focus {
|
||||
color: #002680;
|
||||
flex: 1;
|
||||
}
|
||||
.input-select {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #6d6d6d;
|
||||
min-width: 200px;
|
||||
width: fit-content;
|
||||
height: 48px;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
|
||||
border: none;
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
padding: 0 10px;
|
||||
align-items: center;
|
||||
justify-content: stretch;
|
||||
padding-right: 25px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
}
|
||||
.input-area {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
@@ -5981,8 +6008,9 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
margin-left: 5px;
|
||||
}
|
||||
.togglebutton label .toggle.error {
|
||||
background-color: rgba(255, 0, 0, 0.7);
|
||||
background-color: rgba(255, 0, 0, 0.7) !important;
|
||||
color: #222;
|
||||
background-image: none !important;
|
||||
}
|
||||
.togglebutton label .toggle,
|
||||
.togglebutton label input[type=checkbox][disabled] + .toggle {
|
||||
@@ -6603,6 +6631,9 @@ footer .machine-area {
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
footer .machine-area img {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
footer .container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
@@ -7,301 +7,301 @@
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="disegno-quote-velocita-stampo.svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 297 210"
|
||||
width="297"
|
||||
height="210"
|
||||
width="297">
|
||||
viewBox="0 0 297 210"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="disegno-quote-velocita-stampo.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
|
||||
<sodipodi:namedview
|
||||
inkscape:object-nodes="false"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:cy="51.482576"
|
||||
inkscape:cx="187.49592"
|
||||
inkscape:zoom="2.9247028"
|
||||
showgrid="false"
|
||||
id="namedview907"
|
||||
inkscape:window-height="1001"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
inkscape:document-rotation="0"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
inkscape:document-rotation="0"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview907"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.9247028"
|
||||
inkscape:cx="187.49592"
|
||||
inkscape:cy="51.482576"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:object-nodes="false" />
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:perspective
|
||||
id="perspective32764"
|
||||
inkscape:persp3d-origin="148.5 : 70 : 1"
|
||||
inkscape:vp_z="297 : 105 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 105 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="297 : 105 : 1"
|
||||
inkscape:persp3d-origin="148.5 : 70 : 1"
|
||||
id="perspective32764" />
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
inkscape:stockid="ExperimentalArrow"
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker1181"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="ExperimentalArrow">
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
id="path1179"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path1179" />
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible;"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Lend"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend">
|
||||
<path
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)"
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
id="path912" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="marker1176"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1055"
|
||||
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
transform="scale(0.8)" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="TriangleOutL"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.8)"
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
||||
id="path1162" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker4178">
|
||||
<path
|
||||
id="path4176"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker4066">
|
||||
<path
|
||||
id="path4064"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker3448">
|
||||
<path
|
||||
id="path3446"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker3312"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path3310" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="StopL"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.8)"
|
||||
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0.0,5.65 L 0.0,-5.65"
|
||||
id="path1189" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker1984">
|
||||
<path
|
||||
id="path1982"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker1920">
|
||||
<path
|
||||
id="path1918"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1502"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.6) translate(0,0)"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
|
||||
id="path1500" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.3) translate(-2.3,0)"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
id="path1050" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1406"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.4) translate(10,0)"
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
id="path1404" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible;"
|
||||
id="Arrow2Mend"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6) rotate(180) translate(0,0)"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
id="path1047" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mstart"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.6) translate(0,0)"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
id="path1044" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.4) translate(10,0)"
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
id="path912"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
id="path1026" />
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ExperimentalArrow"
|
||||
style="overflow:visible"
|
||||
id="marker1176"
|
||||
refX="0.0"
|
||||
refY="0.0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.8)"
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
||||
id="path1055" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="TriangleOutL"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1162"
|
||||
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
transform="scale(0.8)" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker4178"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path1273" />
|
||||
id="path4176" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker4066"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path4064" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker3448"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path3446" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3"
|
||||
refX="5"
|
||||
id="ExperimentalArrow-5">
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="marker3312">
|
||||
<path
|
||||
id="path1273-2"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
id="path3310"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="StopL"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1189"
|
||||
d="M 0.0,5.65 L 0.0,-5.65"
|
||||
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="scale(0.8)" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker1984"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path1982" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker1920"
|
||||
refX="5.0"
|
||||
refY="3.0"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
id="path1918" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="marker1502"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1500"
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) translate(0,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Sstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1050"
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="marker1406"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1404"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
transform="scale(0.4) translate(10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Mend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path1047"
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) rotate(180) translate(0,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1044"
|
||||
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#bbbcbc;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) translate(0,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path1026"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1;fill:#bbbcbc;fill-opacity:1"
|
||||
transform="scale(0.4) translate(10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3"
|
||||
refX="5"
|
||||
id="ExperimentalArrow-2">
|
||||
refY="3.0"
|
||||
refX="5.0"
|
||||
id="ExperimentalArrow">
|
||||
<path
|
||||
id="path1273-1"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
id="path1273"
|
||||
d="m 10,3 -10,3 0,-6 z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3"
|
||||
refX="5"
|
||||
id="ExperimentalArrow-3">
|
||||
<path
|
||||
id="path1273-6"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1" />
|
||||
</marker>
|
||||
<marker
|
||||
id="marker1984-1"
|
||||
id="ExperimentalArrow-5"
|
||||
refX="5"
|
||||
refY="3"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
id="path1982-1" />
|
||||
id="path1273-2" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="StopL-8"
|
||||
style="overflow:visible">
|
||||
id="ExperimentalArrow-2"
|
||||
refX="5"
|
||||
refY="3"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1189-1"
|
||||
d="M 0,5.65 V -5.65"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
id="path1273-1" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ExperimentalArrow-3"
|
||||
refX="5"
|
||||
refY="3"
|
||||
orient="auto-start-reverse">
|
||||
<path
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
id="path1273-6" />
|
||||
</marker>
|
||||
<marker
|
||||
orient="auto-start-reverse"
|
||||
refY="3"
|
||||
refX="5"
|
||||
id="marker1984-1">
|
||||
<path
|
||||
id="path1982-1"
|
||||
d="M 10,3 0,6 V 0 Z"
|
||||
style="fill:context-stroke;stroke:#bbbcbc;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="StopL-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto">
|
||||
<path
|
||||
transform="scale(0.8)"
|
||||
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#bbbcbc;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="scale(0.8)" />
|
||||
d="M 0,5.65 V -5.65"
|
||||
id="path1189-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<metadata
|
||||
@@ -319,227 +319,207 @@
|
||||
<g
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path963"
|
||||
style="fill:#979797;fill-opacity:1;stroke:#979797;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 156.931,209.46621 156.11454,0.72523508"
|
||||
style="fill:#979797;fill-opacity:1;stroke:#979797;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path963"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path967"
|
||||
d="m 26.520225,102.56968 101.609595,0.0638 v 0 0 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 27.881686,115.27013 26.766659,0.0328 v 0 0 0"
|
||||
id="path967-2" />
|
||||
d="m 26.520225,170.56968 101.609595,0.0638 v 0 0 0"
|
||||
id="path967"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path967-2"
|
||||
d="m 27.881686,183.27013 26.766659,0.0328 v 0 0 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="fill:#99cfff;fill-rule:evenodd;stroke:#002680;stroke-width:4;stroke-linejoin:round"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,36.848572,131.73977)"
|
||||
id="g842"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,36.848572,63.739768)">
|
||||
style="fill:#99cfff;fill-rule:evenodd;stroke:#002680;stroke-width:4;stroke-linejoin:round">
|
||||
<rect
|
||||
id="Rectangle-Copy"
|
||||
x="11"
|
||||
y="147"
|
||||
height="48"
|
||||
width="334"
|
||||
height="48" />
|
||||
y="147"
|
||||
x="11"
|
||||
id="Rectangle-Copy" />
|
||||
<rect
|
||||
id="Rectangle-Copy-2"
|
||||
x="0"
|
||||
y="199"
|
||||
height="4"
|
||||
width="356"
|
||||
height="4" />
|
||||
y="199"
|
||||
x="0"
|
||||
id="Rectangle-Copy-2" />
|
||||
<polygon
|
||||
id="Rectangle"
|
||||
points="68,147 98,0 257.62107,0 287.62107,147 " />
|
||||
points="257.62107,0 287.62107,147 68,147 98,0 "
|
||||
id="Rectangle" />
|
||||
<polygon
|
||||
id="polygon840"
|
||||
points="257.62107,147 287.62107,179 68,179 98,147 "
|
||||
transform="matrix(1,0,0,-1,0,326)"
|
||||
points="68,179 98,147 257.62107,147 287.62107,179 " />
|
||||
id="polygon840" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.506214;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 128.13064,169.64777 -0.94836,-79.838053 v 0"
|
||||
id="path1004"
|
||||
d="m 128.13064,101.64777 -0.94836,-79.838053 v 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.506214;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.507232;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 7.7467941,90.012593 144.96042,89.468186 v 0 0"
|
||||
id="path1006"
|
||||
d="M 7.7467941,22.012593 144.96042,21.468186 v 0 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.507232;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 81.767182,90.017085 V 100.08673"
|
||||
id="path1012"
|
||||
d="M 81.767182,22.017085 V 32.086727"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1014"
|
||||
d="m 31.419476,115.38155 -5.26e-4,69.84397 v 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.510365;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1016"
|
||||
d="M 14.545513,185.5762 141.91289,185.30405"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1018"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.530934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 169.07902,100.69655 32.94825,0.0636 v 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.530934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path1018"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.420779;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
|
||||
d="M 136.74199,21.332161 V 32.475182"
|
||||
id="path1012-1" />
|
||||
id="path1012-1"
|
||||
d="M 136.74199,89.332161 V 100.47518"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.420779;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.573405;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#StopL)"
|
||||
d="m 8.1373094,90.089263 v 7.19921"
|
||||
id="path1012-1-6"
|
||||
d="m 8.1373094,22.089263 v 7.19921"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.573405;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#StopL)" />
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3838"
|
||||
style="fill:none;stroke:#bbbcbd;stroke-width:0.525286;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 209.62896,109.94961 h -40.55073 v 0"
|
||||
style="fill:none;stroke:#bbbcbd;stroke-width:0.525286;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path3838"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4058"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.517246;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 274.94556,100.96858 h 16.60132"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.517246;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path4058"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4060"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.505291;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 278.21139,114.84836 H 291.2747"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.505291;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path4060"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1012-9"
|
||||
d="m 290.73041,100.87214 v 14.2521"
|
||||
id="path1012-9" />
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="fill:#99cfff;fill-rule:evenodd;stroke:#002680;stroke-width:4;stroke-linejoin:round"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,184.30533,62.410816)"
|
||||
id="g918"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,184.30533,62.410816)">
|
||||
style="fill:#99cfff;fill-rule:evenodd;stroke:#002680;stroke-width:4;stroke-linejoin:round">
|
||||
<rect
|
||||
id="Rectangle-Copy-5"
|
||||
x="11"
|
||||
y="147"
|
||||
height="48"
|
||||
width="334"
|
||||
height="48" />
|
||||
y="147"
|
||||
x="11"
|
||||
id="Rectangle-Copy-5" />
|
||||
<rect
|
||||
id="Rectangle-Copy-2-3"
|
||||
x="0"
|
||||
y="199"
|
||||
height="4"
|
||||
width="356"
|
||||
height="4" />
|
||||
y="199"
|
||||
x="0"
|
||||
id="Rectangle-Copy-2-3" />
|
||||
<polygon
|
||||
id="Rectangle-1"
|
||||
points="257.62107,0 287.62107,147 68,147 98,0 " />
|
||||
points="257.62107,0 287.62107,147 68,147 98,0 "
|
||||
id="Rectangle-1" />
|
||||
<polygon
|
||||
id="polygon916"
|
||||
points="257.62107,147 287.62107,179 68,179 98,147 "
|
||||
transform="matrix(1,0,0,-1,0,326)"
|
||||
points="257.62107,147 287.62107,179 68,179 98,147 " />
|
||||
id="polygon916" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.544692;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1012-5"
|
||||
d="M 178.87573,62.402301 V 100.34339"
|
||||
id="path1012-5" />
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.544692;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6954"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 209.90111,62.050773 H 178.05927"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path6954"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7676"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 290.73042,115.10538 v 4.08228 0"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path7676"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7678"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.585901;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:"
|
||||
d="M 172.07191,96.971722 V 109.67746"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.585901;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:" />
|
||||
id="path7678"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7680"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 172.07191,110.04689 v 8.33945"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
id="path7680"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1012-1-6-1"
|
||||
d="M 28.871798,89.809207 V 170.21125"
|
||||
style="fill:none;stroke:#bbbcbc;stroke-width:0.510445;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 28.871798,21.809207 V 102.21125"
|
||||
id="path1012-1-6-1" />
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 178.74528,61.891705 -1.99023,4.161391 h 3.98046 z"
|
||||
id="path32784"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784"
|
||||
d="m 178.74528,61.891705 -1.99023,4.161391 h 3.98046 z"
|
||||
id="path32784-2"
|
||||
d="m 81.78039,89.621142 -1.99023,4.16139 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 81.78039,21.621142 -1.99023,4.16139 h 3.98046 z"
|
||||
id="path32784-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 28.948815,21.983004 -1.99023,4.16139 h 3.98046 z"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 28.948815,89.983004 -1.99023,4.16139 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 8.1418572,21.802077 -1.99023,4.16139 h 3.9804598 z"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 8.1418572,89.802077 -1.99023,4.16139 h 3.9804598 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 31.481832,115.52385 -1.99023,4.16139 h 3.98046 z"
|
||||
id="path32784-57"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 290.75461,101.04944 -1.99023,4.16139 h 3.98046 z"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-51"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 290.75461,101.04944 -1.99023,4.16139 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 172.0645,109.91501 -1.99023,4.16139 h 3.98046 z"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-23"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 172.0645,109.91501 -1.99023,4.16139 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.299082px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278896px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 81.961325,35.733683 -1.99023,-3.6186 h 3.98046 z"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3"
|
||||
d="m 81.961325,103.73368 -1.99023,-3.6186 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278896px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 136.96407,103.64323 -1.99023,-3.6186 h 3.98046 z"
|
||||
id="path32784-3-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3-7"
|
||||
d="m 136.96407,35.643226 -1.99023,-3.6186 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3-73"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 172.24542,100.41618 -1.99023,-3.618595 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
id="path32784-3-73"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3-2"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 178.93983,100.41619 -1.99023,-3.6186 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
id="path32784-3-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3-70"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 290.75462,114.89059 -1.99023,-3.6186 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
id="path32784-3-70"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 127.93118,170.04456 -1.99023,-3.6186 h 3.98046 z"
|
||||
id="path32784-3-5"
|
||||
d="m 127.93118,102.04456 -1.99023,-3.618604 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32784-3-24"
|
||||
d="m 31.481836,185.27239 -1.99023,-3.6186 h 3.98046 z"
|
||||
style="fill:#bbbcbc;fill-opacity:1;stroke:none;stroke-width:0.278897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 20 KiB |
@@ -2,7 +2,7 @@
|
||||
"env": "development",
|
||||
"api": {
|
||||
"enabled": true,
|
||||
"apiServerUrl": "http://seriate.steamware.net:9000/"
|
||||
"apiServerUrl": "http://localhost:9000/"
|
||||
},
|
||||
"allUIVisible": true
|
||||
"allUIVisible": false
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
<script src="Scripts/jquery.mousewheel.js"></script>
|
||||
<script src="Scripts/jquery.signalR-2.2.2.min.js"></script>
|
||||
<script src="Scripts/raphael-2.1.4.min.js"></script>
|
||||
<script src="http://seriate.steamware.net:9000/signalr/hubs" async></script>
|
||||
<script src="http://localhost:9000/signalr/hubs" async></script>
|
||||
|
||||
<link href="assets/styles/style.css" rel="stylesheet" />
|
||||
</head>
|
||||
|
||||
@@ -18,5 +18,7 @@ declare module server {
|
||||
terminated: boolean;
|
||||
running: boolean;
|
||||
hasError: boolean;
|
||||
category: string;
|
||||
subCategory_1: string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ declare module signalr_process {
|
||||
type: string;
|
||||
toDelete: boolean;
|
||||
toDisplay: boolean;
|
||||
isM156: boolean;
|
||||
id: number;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import Component from "vue-class-component";
|
||||
import { Watch } from "vue-property-decorator";
|
||||
import { UsersService } from "./services/usersService";
|
||||
import { KeyboardHelper } from "./app_modules_thermo/components/KeyboardHelper";
|
||||
import printGantt from "@/app_modules_thermo/processo/components/printProcesso.vue";
|
||||
|
||||
declare var cmsClient;
|
||||
|
||||
@@ -37,6 +38,7 @@ declare var cmsClient;
|
||||
dashboard: Dashboard,
|
||||
predashboard: PreDashboard,
|
||||
alarmList,
|
||||
printGantt
|
||||
}
|
||||
})
|
||||
export default class app extends Vue {
|
||||
@@ -56,7 +58,8 @@ export default class app extends Vue {
|
||||
loadingOperations = 0;
|
||||
HMIsrc = null;
|
||||
hub: Hub = null;
|
||||
prioritizeWindowsButtons = false;
|
||||
prioritizeWindowsButtons1 = false;
|
||||
prioritizeWindowsButtons2 = false;
|
||||
|
||||
beforeMount() {
|
||||
moment.locale((window.navigator as any).userLanguage || window.navigator.language);
|
||||
@@ -80,12 +83,12 @@ export default class app extends Vue {
|
||||
|
||||
ms.subscribeToChannel("show-modal-login", args => {
|
||||
this.applyBlur = true;
|
||||
this.prioritizeWindowsButtons = true;
|
||||
this.prioritizeWindowsButtons1 = true;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("hide-modal-login", args => {
|
||||
this.applyBlur = false;
|
||||
this.prioritizeWindowsButtons = false;
|
||||
this.prioritizeWindowsButtons1 = false;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("hide-modal", args => {
|
||||
@@ -94,10 +97,12 @@ export default class app extends Vue {
|
||||
|
||||
ms.subscribeToChannel("show-modal-nc-called", args => {
|
||||
this.applyBlurNc = true;
|
||||
this.prioritizeWindowsButtons2 = true;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("hide-modal-nc-called", args => {
|
||||
this.applyBlurNc = false;
|
||||
this.prioritizeWindowsButtons2 = false;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("show-modal-internal", args => {
|
||||
@@ -176,8 +181,13 @@ export default class app extends Vue {
|
||||
return this.$store.state.isShowPreDashboard;
|
||||
}
|
||||
|
||||
get prioritizeWindowsButtons() {
|
||||
return this.prioritizeWindowsButtons1 || this.prioritizeWindowsButtons2;
|
||||
}
|
||||
|
||||
onmousedown() {
|
||||
KeyboardHelper.hideKeyboard();
|
||||
messageService.publishToChannel('hideall');
|
||||
}
|
||||
|
||||
@Watch("isMainViewLiftedUp")
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<div class="container" @mousedown="onmousedown">
|
||||
<div id="app">
|
||||
<app-header :class="{'blur':applyBlur}"></app-header>
|
||||
<app-header :class="{'blur':applyBlur || applyBlurNc}"></app-header>
|
||||
<dashboard v-if="statusDashboard"></dashboard>
|
||||
<predashboard v-if="statusPreDashboard"></predashboard>
|
||||
<alarm-list :applyBlur="applyBlur"></alarm-list>
|
||||
<alarm-list :applyBlur="applyBlur || applyBlurNc"></alarm-list>
|
||||
|
||||
<div
|
||||
id="main-view"
|
||||
@@ -18,11 +18,12 @@
|
||||
<paddle></paddle>
|
||||
|
||||
<app-footer :class="{'blur':(applyBlur || applyBlurNc)}"></app-footer>
|
||||
<print-gantt></print-gantt>
|
||||
</div>
|
||||
<modal-container containerName="modal-login" name="modal-login"></modal-container>
|
||||
<keyboard></keyboard>
|
||||
|
||||
<div class="window-buttons" :class="{prioritize: prioritizeWindowsButtons}">
|
||||
<div class="window-buttons" :class="{prioritize: prioritizeWindowsButtons, 'blur':(applyBlurNc && !prioritizeWindowsButtons)}">
|
||||
<button
|
||||
class="gray square close"
|
||||
@click="sendMessage('hide')"
|
||||
@@ -34,7 +35,8 @@
|
||||
:title="'header_tooltip_btn_close' | localize('Close the application')"
|
||||
>×</button>
|
||||
</div>
|
||||
<modal-container name="modal"></modal-container>
|
||||
<modal-container name="modal" :class="{'blur':applyBlurNc}"></modal-container>
|
||||
<modal-nc-container name="modal-nc"></modal-nc-container>
|
||||
</div>
|
||||
</template>
|
||||
<script src="./App.ts" lang="ts"></script>
|
||||
|
||||
@@ -39,7 +39,7 @@ messageService.subscribeToChannel("show-contact-info", () => { ModalHelper.ShowM
|
||||
|
||||
// messageService.subscribeToChannel("show-axes-calibration", () => { ModalHelper.ShowNcModal(AxesCalibration); });
|
||||
// messageService.subscribeToChannel("hide-axes-calibration", () => { ModalHelper.HideNcModal(AxesCalibration); });
|
||||
// messageService.subscribeToChannel("show-m155-questions", () => { ModalHelper.ShowNextM155Modal(); });
|
||||
messageService.subscribeToChannel("show-m155-questions", () => { ModalHelper.ShowNextM155Modal(); });
|
||||
// messageService.subscribeToChannel("show-nochange-page", () => {
|
||||
// ModalHelper.ShowMessage(
|
||||
// Vue.filter('localize')("modal_nochangepage_title", "Operazione non possibile"),
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
import { AppModel } from "src/store";
|
||||
import { Modal, ModalHelper } from "src/components/modals";
|
||||
import Component from "vue-class-component";
|
||||
import Vue from "vue";
|
||||
import { Hub } from "src/services";
|
||||
import { Factory, messageService } from "src/_base";
|
||||
import { Watch } from "vue-property-decorator";
|
||||
|
||||
@Component({ components: { modal: Modal } })
|
||||
export default class M155Dialog extends Vue{
|
||||
|
||||
data = null;
|
||||
value = 0;
|
||||
|
||||
MULTIPLE_BUTTONS = "MULTIPLE_BUTTONS";
|
||||
REAL = "REAL";
|
||||
SHOW_VAL = "SHOW_VAL"
|
||||
MODAL = "MODAL"
|
||||
|
||||
mounted(){
|
||||
this.data = ModalHelper.M155ModalData.data;
|
||||
this.value = -1;
|
||||
|
||||
// Populate translations
|
||||
if(this.data.isM156) {
|
||||
this.data.message = this.$options.filters.localize("m156_title_" + this.data.id, "Title");
|
||||
|
||||
for(const key in this.data.buttons){
|
||||
this.data.buttons[key] = this.$options.filters.localize("m156_" + this.data.id + "_button_" + this.data.buttons[key], "Title");
|
||||
}
|
||||
|
||||
if(this.data.buttons)
|
||||
Object.keys(this.data.buttons).forEach(btn => {
|
||||
btn = this.$options.filters.localize("m156_title_" + this.data.id, "Title");
|
||||
});
|
||||
}
|
||||
|
||||
messageService.subscribeToChannel("show-modal-nc", args => {
|
||||
this.data = ModalHelper.M155ModalData.data;
|
||||
});
|
||||
}
|
||||
|
||||
get process(){
|
||||
if(this.data)
|
||||
return this.data.process;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Watch("data")
|
||||
dataChanged(){
|
||||
this.value = -1;
|
||||
}
|
||||
|
||||
ischecked(k){
|
||||
return k == this.value;
|
||||
}
|
||||
|
||||
check(k){
|
||||
return this.value = k;
|
||||
}
|
||||
|
||||
canSendAnswer(){
|
||||
if(this.getType == this.MODAL)
|
||||
return false
|
||||
else if(this.getType == this.REAL)
|
||||
return this.value != null && this.value != undefined;
|
||||
else
|
||||
return this.value && this.value != -1;
|
||||
}
|
||||
|
||||
answerVisible(){
|
||||
if(this.getType == this.MODAL)
|
||||
return false
|
||||
return true;
|
||||
}
|
||||
|
||||
get getType(){
|
||||
if(this.data)
|
||||
return this.data.type
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
hide() {
|
||||
ModalHelper.M155ModalData.data.toDisplay = false;
|
||||
ModalHelper.HideThisM155Modal(ModalHelper.M155ModalData.data.processId);
|
||||
}
|
||||
|
||||
answer(){
|
||||
if(!this.data.isM156)
|
||||
Hub.Current.WriteM155Response(this.data.process,this.value);
|
||||
else
|
||||
Hub.Current.WriteM156Response(this.data.process,this.value);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<modal :title="'modal_m155_standard' | localize('Message from the machine')" class="m155" :class="{'multiple': getType != REAL}" name="modal" >
|
||||
<div v-if="data">
|
||||
<h2 v-if="getType != SHOW_VAL && getType != MODAL">{{data.message}}</h2>
|
||||
<div class="content-real" v-if="getType == REAL">
|
||||
<span>{{'modal_m155_value' | localize("Value: ")}}</span>
|
||||
<input type="number" min="0" max="4294967295" v-model="value">
|
||||
</div>
|
||||
|
||||
<div class="content-real-showval" v-if="getType == SHOW_VAL">
|
||||
<span>{{data.message}}</span>
|
||||
<input type="number" min="0" max="4294967295" v-model="data.value" disabled="disabled">
|
||||
</div>
|
||||
|
||||
<div class="content-modal-showval" v-if="getType == MODAL" >
|
||||
<span>{{data.message}}</span>
|
||||
</div>
|
||||
|
||||
<div v-if="getType == MULTIPLE_BUTTONS" >
|
||||
<div class="content-btn" v-for="(t,k) in data.buttons" :key="'m155_'+k" @click="check(k)">
|
||||
<input type="radio" name="radio-group" :checked="ischecked(k)" >
|
||||
<label for="datefixed">{{t}}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer >
|
||||
<div class="pull-left">
|
||||
<button class="btn" @click="hide()">{{'modal_m155_hide_window' | localize("Hide")}}</button>
|
||||
</div>
|
||||
<div class="pull-right" v-if="answerVisible()" >
|
||||
<button class="btn btn-success" @click="answer()" :disabled="!canSendAnswer()">{{'confirm_request_confirm' | localize("Confirm")}}</button>
|
||||
</div>
|
||||
</footer>
|
||||
</modal>
|
||||
</template>
|
||||
<script src="./m155-dialog.ts" lang="ts"></script>
|
||||
|
||||
@@ -13,5 +13,6 @@ export {
|
||||
ContactInfoDialog,
|
||||
UserInfoDialog,
|
||||
UserInfo,
|
||||
CmsconnectInfoDialog
|
||||
CmsconnectInfoDialog,
|
||||
M155Questions
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import Component from "vue-class-component";
|
||||
import Vue from "vue";
|
||||
import { Prop } from "vue-property-decorator";
|
||||
import lottie from "lottie-web";
|
||||
import { messageService } from "@/_base";
|
||||
|
||||
@Component({})
|
||||
export default class Combo extends Vue {
|
||||
@@ -11,7 +12,7 @@ export default class Combo extends Vue {
|
||||
|
||||
get options() {
|
||||
let result: { id: number, text: string, anim: string }[] = [];
|
||||
if (this.value.enumVal)
|
||||
if (this.value && this.value.enumVal)
|
||||
for (const key in this.value.enumVal) {
|
||||
if (this.value.enumVal.hasOwnProperty(key)) {
|
||||
const element = this.value.enumVal[key];
|
||||
@@ -42,7 +43,7 @@ export default class Combo extends Vue {
|
||||
}
|
||||
|
||||
mounted() {
|
||||
|
||||
messageService.subscribeToChannel('hideall', () => this.hideList());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
<i v-if="opened" class="fa fa-chevron-up" />
|
||||
<i v-else class="fa fa-chevron-down" />
|
||||
</div>
|
||||
<div class="droplist" v-if="opened">
|
||||
<div class="droplist" v-if="opened" @mousedown.prevent.stop>
|
||||
<div
|
||||
class="droplist-item"
|
||||
v-for="opt in options"
|
||||
|
||||
@@ -23,8 +23,17 @@ export default class Keyboard extends Vue {
|
||||
}
|
||||
|
||||
set Value(v: number) {
|
||||
let scale = Math.pow(10, this.actualValue.numDec);
|
||||
this.actualValue.setpointHMI = Math.round(v * scale) / scale;
|
||||
try {
|
||||
let scale = Math.pow(10, this.actualValue.numDec ?? 0);
|
||||
let result = Math.round(v * scale) / scale;
|
||||
|
||||
if (!Number.isNaN(result) && Number.isFinite(result))
|
||||
this.actualValue.setpointHMI = result;
|
||||
else
|
||||
this.actualValue.setpointHMI = v;
|
||||
} catch {
|
||||
this.actualValue.setpointHMI = v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -34,8 +34,17 @@ export default class Numeric extends Vue {
|
||||
}
|
||||
|
||||
set Value(v: number) {
|
||||
let scale = Math.pow(10, this.value.numDec);
|
||||
this.value.setpointHMI = Math.round(v * scale) / scale;
|
||||
debugger
|
||||
try {
|
||||
let scale = Math.pow(10, this.value.numDec ?? 0);
|
||||
let result = Math.round(v * scale) / scale;
|
||||
if (!Number.isNaN(result) && Number.isFinite(result))
|
||||
this.value.setpointHMI = result;
|
||||
else
|
||||
this.value.setpointHMI = v;
|
||||
} catch {
|
||||
this.value.setpointHMI = v;
|
||||
}
|
||||
}
|
||||
|
||||
onFocus() {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
:id="id"
|
||||
:disabled="value.status && !value.status.enabled"
|
||||
/>
|
||||
<span v-if="value.unitMeasure">{{unitMeasure}}</span>
|
||||
<span v-if="value && value.unitMeasure">{{value.unitMeasure}}</span>
|
||||
</div>
|
||||
</template>
|
||||
<script src="./numeric.ts" lang="ts"></script>
|
||||
@@ -6,6 +6,7 @@ import { store, MachineStatusModel } from "@/store";
|
||||
import { SoftKeysConfigurationModel, machineInfoStore } from "@/store/machineInfo.store";
|
||||
import { Hub, machineService } from "@/services";
|
||||
import { Watch } from "vue-property-decorator";
|
||||
import { messageService } from "@/_base";
|
||||
|
||||
@Component({
|
||||
components: { softKey }
|
||||
@@ -60,6 +61,7 @@ export default class Paddle extends Vue {
|
||||
|
||||
async mounted() {
|
||||
this.loadData();
|
||||
messageService.subscribeToChannel('hideall', () => { this.isOpen = false; this.openFull = false; })
|
||||
}
|
||||
|
||||
@Watch("isOpen")
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<div class="paddle" :class="{'open-half': isOpen && !openFull, 'open-full': isOpen && openFull}">
|
||||
<div
|
||||
class="paddle"
|
||||
:class="{'open-half': isOpen && !openFull, 'open-full': isOpen && openFull}"
|
||||
@mousedown.prevent.stop
|
||||
>
|
||||
<nav class="paddleButton" @click="isOpen = !isOpen; openFull = false;sendKeyCancel()">
|
||||
<div class="circles">
|
||||
<div></div>
|
||||
|
||||
@@ -34,7 +34,7 @@ export default class Slider extends Vue {
|
||||
this.value.setpointHMI = v;
|
||||
}
|
||||
|
||||
@Prop({ default: .7 })
|
||||
@Prop({ default: .2 })
|
||||
incrementingStep: number;
|
||||
|
||||
step: number = 1;
|
||||
@@ -45,6 +45,11 @@ export default class Slider extends Vue {
|
||||
// return 1;
|
||||
// };
|
||||
|
||||
mounted() {
|
||||
this.step = 1 / Math.pow(10, this.value.numDec);
|
||||
if (Number.isNaN(this.step)) this.step = 1;
|
||||
}
|
||||
|
||||
startIncrement() {
|
||||
if (!this.value.status.enabled) return;
|
||||
this.incrementing = setInterval(() => {
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
<template>
|
||||
<div class="slider-container">
|
||||
<div class="slider">
|
||||
<button
|
||||
<button class="btn btn-info square"
|
||||
@mousedown="startDecrement()"
|
||||
v-on:touchstart="startDecrement()"
|
||||
v-on:touchend="confirm()"
|
||||
@mouseup="confirm()"
|
||||
@mouseout="confirm()"
|
||||
>
|
||||
<img src="assets/icons/png/min.png" />
|
||||
</button>
|
||||
><i class="fa fa-minus" ></i></button>
|
||||
<div class="control">
|
||||
<input
|
||||
:disabled="!this.value.status.enabled"
|
||||
@@ -27,15 +25,13 @@
|
||||
<small>{{`${this.value.range.max} ${this.value.unitMeasure}`}}</small>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
<button class="btn btn-info square"
|
||||
@mousedown="startIncrement()"
|
||||
v-on:touchstart="startIncrement()"
|
||||
v-on:touchend="confirm()"
|
||||
@mouseup="confirm()"
|
||||
@mouseout="confirm()"
|
||||
>
|
||||
<img src="assets/icons/png/max.png" />
|
||||
</button>
|
||||
><i class="fa fa-plus" ></i></button>
|
||||
</div>
|
||||
<button
|
||||
class="submit"
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Prop, Watch } from 'vue-property-decorator';
|
||||
import { messageService } from '@/_base';
|
||||
import AppRibbon from "@/components/app-ribbon.vue";
|
||||
import { alarmList } from "@/app_modules/alarms";
|
||||
import { AppModel, appModelActions } from '@/store';
|
||||
import { AppModel, appModelActions, store } from '@/store';
|
||||
import { getColorFromName, isDarkColor } from "@/_base/utils";
|
||||
import ArchInterface from "../components/arch-interface/arch-interface.vue";
|
||||
import gauge from "./base-components/gauge.vue";
|
||||
@@ -13,6 +13,7 @@ import moment from 'moment';
|
||||
import stats from "./base-components/stats.vue";
|
||||
import hitem from "./base-components/item.vue";
|
||||
import { Hub } from '@/services';
|
||||
import { SoftKeysConfigurationModel } from '@/store/machineInfo.store';
|
||||
|
||||
@Component({
|
||||
components: {
|
||||
@@ -26,7 +27,6 @@ import { Hub } from '@/services';
|
||||
})
|
||||
export default class Dashboard extends Vue {
|
||||
|
||||
|
||||
get panel() {
|
||||
return (this.$store.state as AppModel).prod.panel;
|
||||
}
|
||||
@@ -66,6 +66,18 @@ export default class Dashboard extends Vue {
|
||||
return (this.$store.state as AppModel).machineInfo.cmsConnectReady;
|
||||
}
|
||||
|
||||
get softKeys(): { [id: number]: SoftKeysConfigurationModel[] } {
|
||||
return store.state.machineInfo.softKeys as { [id: number]: SoftKeysConfigurationModel[] };
|
||||
}
|
||||
|
||||
get allSoftKeys(): SoftKeysConfigurationModel[] {
|
||||
var result = [];
|
||||
for (const key in this.softKeys) {
|
||||
const element = this.softKeys[key];
|
||||
result.push(...element);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
loading = false;
|
||||
async loadMore() {
|
||||
@@ -81,11 +93,11 @@ export default class Dashboard extends Vue {
|
||||
getColor(nome, cognome) {
|
||||
return getColorFromName(nome, cognome);
|
||||
}
|
||||
|
||||
isDarkColor(color) {
|
||||
return isDarkColor(color);
|
||||
}
|
||||
|
||||
|
||||
async mounted() {
|
||||
prodService.GetProdPanel();
|
||||
|
||||
@@ -146,8 +158,11 @@ export default class Dashboard extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
sendSoftKey(id: number) {
|
||||
Hub.Current.sendUserSoftKey(id);
|
||||
sendSoftKey(id: string) {
|
||||
debugger
|
||||
var sk = this.allSoftKeys.find(s => s.refCallParam == id);
|
||||
if (sk)
|
||||
Hub.Current.sendUserSoftKey(sk.id);
|
||||
}
|
||||
|
||||
public sendMessage(name: string) {
|
||||
@@ -157,7 +172,6 @@ export default class Dashboard extends Vue {
|
||||
close() {
|
||||
appModelActions.ShowDashboard(this.$store);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
enum ribbonStatusEnum {
|
||||
|
||||
@@ -112,14 +112,14 @@
|
||||
<div class="setpoint">
|
||||
<img src="assets/icons/png/inv.png" />
|
||||
<label>{{panel.tempAct}}°C</label>
|
||||
<button @click="sendSoftKey(37)">
|
||||
<button @click="sendSoftKey('dash_setpoint_minus')">
|
||||
<i class="fa fa-minus"></i>
|
||||
</button>
|
||||
<div>
|
||||
<small>{{'dashboard-setpoint' | localize('set point')}}</small>
|
||||
<span>{{panel.tempSetpoint}}°C</span>
|
||||
</div>
|
||||
<button @click="sendSoftKey(36)">
|
||||
<button @click="sendSoftKey('dash_setpoint_plus')">
|
||||
<i class="fa fa-plus"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -86,39 +86,45 @@ export default class GanttComponent extends Vue {
|
||||
|
||||
|
||||
openModal() {
|
||||
switch (this.blockType) {
|
||||
case "movement": this.showModalAtStep(2); break;
|
||||
case "heating": this.showModalAtStep(3); break;
|
||||
case "drawing": this.showModalAtStep(5); break;
|
||||
case "vacuum": this.showModalAtStep(8); break;
|
||||
case "cooling": this.showModalAtStep(7); break;
|
||||
case "extraction": this.showModalAtStep(9); break;
|
||||
}
|
||||
if (this.value.category)
|
||||
switch (this.value.category.toLowerCase()) {
|
||||
case "general": this.showModalAtStep(0, this.value.subCategory_1); break;
|
||||
case "positions": this.showModalAtStep(1, this.value.subCategory_1); break;
|
||||
case "cycle": this.showModalAtStep(2, this.value.subCategory_1); break;
|
||||
case "heats": this.showModalAtStep(3, this.value.subCategory_1); break;
|
||||
case "pyrometer": this.showModalAtStep(4, this.value.subCategory_1); break;
|
||||
case "drawing": this.showModalAtStep(5, this.value.subCategory_1); break;
|
||||
case "upperplate": this.showModalAtStep(6, this.value.subCategory_1); break;
|
||||
case "cooling": this.showModalAtStep(7, this.value.subCategory_1); break;
|
||||
case "vacuum": this.showModalAtStep(8, this.value.subCategory_1); break;
|
||||
case "extraction": this.showModalAtStep(9, this.value.subCategory_1); break;
|
||||
case "options": this.showModalAtStep(10, this.value.subCategory_1); break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async showModalAtStep(step: number) {
|
||||
async showModalAtStep(step: number, subcategory: string) {
|
||||
try {
|
||||
let next = await this.showModalStep(step);
|
||||
let next = await this.showModalStep(step, subcategory);
|
||||
if (next == null) return;
|
||||
this.showModalAtStep(step + next);
|
||||
this.showModalAtStep(step + next, null);
|
||||
} catch {
|
||||
}
|
||||
}
|
||||
|
||||
showModalStep(step: number): Promise<number> {
|
||||
showModalStep(step: number, subcategory: string): Promise<number> {
|
||||
switch (step) {
|
||||
case 0: return ModalHelper.ShowModalAsync(ShowFormatoInfo);
|
||||
case 1: return ModalHelper.ShowModalAsync(ShowQuoteVelocitaInfo);
|
||||
case 2: return ModalHelper.ShowModalAsync(ShowCicloInfo);
|
||||
case 3: return ModalHelper.ShowModalAsync(ShowRiscaldamentoInfo);
|
||||
case 4: return ModalHelper.ShowModalAsync(ShowPirometroInfo);
|
||||
case 5: return ModalHelper.ShowModalAsync(ShowImbutituraInfo);
|
||||
case 6: return ModalHelper.ShowModalAsync(ShowControstampoInfo);
|
||||
case 7: return ModalHelper.ShowModalAsync(ShowRaffreddamentoInfo);
|
||||
case 8: return ModalHelper.ShowModalAsync(ShowVuotoInfo);
|
||||
case 9: return ModalHelper.ShowModalAsync(ShowEstrazioneInfo);
|
||||
case 10: return ModalHelper.ShowModalAsync(ShowOpzioniInfo);
|
||||
case 0: return ModalHelper.ShowModalAsync(ShowFormatoInfo, subcategory?.toLowerCase());
|
||||
case 1: return ModalHelper.ShowModalAsync(ShowQuoteVelocitaInfo, subcategory?.toLowerCase());
|
||||
case 2: return ModalHelper.ShowModalAsync(ShowCicloInfo, subcategory?.toLowerCase());
|
||||
case 3: return ModalHelper.ShowModalAsync(ShowRiscaldamentoInfo, subcategory?.toLowerCase());
|
||||
case 4: return ModalHelper.ShowModalAsync(ShowPirometroInfo, subcategory?.toLowerCase());
|
||||
case 5: return ModalHelper.ShowModalAsync(ShowImbutituraInfo, subcategory?.toLowerCase());
|
||||
case 6: return ModalHelper.ShowModalAsync(ShowControstampoInfo, subcategory?.toLowerCase());
|
||||
case 7: return ModalHelper.ShowModalAsync(ShowRaffreddamentoInfo, subcategory?.toLowerCase());
|
||||
case 8: return ModalHelper.ShowModalAsync(ShowVuotoInfo, subcategory?.toLowerCase());
|
||||
case 9: return ModalHelper.ShowModalAsync(ShowEstrazioneInfo, subcategory?.toLowerCase());
|
||||
case 10: return ModalHelper.ShowModalAsync(ShowOpzioniInfo, subcategory?.toLowerCase());
|
||||
// case 11: return ModalHelper.ShowModalAsync(AvvioProduzione);
|
||||
}
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
</foreignObject>
|
||||
</g>
|
||||
|
||||
<g v-if="value.showDelay">
|
||||
<g v-if="value.showDelay && !ganttOptions.printing">
|
||||
<line x1="0" y1="0" y2="0" :x2="actualDelay * ganttOptions.secondSize" class="progress-line" />
|
||||
<foreignObject
|
||||
width="30"
|
||||
@@ -161,7 +161,10 @@
|
||||
</foreignObject>
|
||||
</g>
|
||||
|
||||
<g :transform="`translate(${delayDuration * ganttOptions.secondSize} 0)`">
|
||||
<g
|
||||
:transform="`translate(${delayDuration * ganttOptions.secondSize} 0)`"
|
||||
v-if="!ganttOptions.printing"
|
||||
>
|
||||
<line
|
||||
x1="0"
|
||||
y1="0"
|
||||
|
||||
@@ -32,6 +32,14 @@ export default class GanttRow extends Vue {
|
||||
return Array.from(this.blocks.values()).filter(i => i.section == this.section).sort((a, b) => a.priority - b.priority);
|
||||
}
|
||||
|
||||
get maxVerticalPosition() {
|
||||
return Math.max(...this.blocks.map(b => this.verticalPosition(b)))
|
||||
}
|
||||
|
||||
get maxBlockPosition() {
|
||||
return Math.max(...this.blocks.map(b => this.startPosition(b)))
|
||||
}
|
||||
|
||||
startPosition(block: server.Modblock) {
|
||||
return blockStartPosition(block, this.blocks, this.ganttOptions) * this.ganttOptions.secondSize;
|
||||
}
|
||||
@@ -65,7 +73,8 @@ export default class GanttRow extends Vue {
|
||||
|
||||
// cerco la prima delle righe disponibili che avrebbero posto per il mio blocco
|
||||
// una riga è disponibile se non ci sono blocchi che occupano lo spazio che mi servirebbe
|
||||
let myrow = rows.filter(r => r.filter(b => (b.from <= myStartPosition && b.to >= myStartPosition) || (b.from <= myEndPosition && b.to >= myEndPosition)).length == 0).shift();
|
||||
let myrow = rows.filter(r => r.filter(b => (b.from <= myStartPosition && b.to >= myStartPosition) || (b.from <= myEndPosition && b.to >= myEndPosition) ||
|
||||
(myStartPosition <= b.from && myEndPosition >= b.from) || (myStartPosition <= b.to && myEndPosition >= b.to)).length == 0).shift();
|
||||
|
||||
// se non ho trovato una riga allora non c'è posto oppure non ci sono righe..
|
||||
// aggiungo eventualmente una nuova riga
|
||||
@@ -120,6 +129,7 @@ function blockDuration(block: server.Modblock, options: IGanttOptions, includeDe
|
||||
duration += Math.max(minduration, block.terminated ? 0 : block.estimatedDuration, block.actualDuration);
|
||||
|
||||
|
||||
|
||||
if (block.idParam > 0 && includeDelay)
|
||||
duration += options.block_status_minDuration;
|
||||
|
||||
|
||||
@@ -4,10 +4,12 @@ import moment from "moment";
|
||||
import ganttHeader from "./gantt-header.vue";
|
||||
import ganttRow from "./gantt-row.vue"
|
||||
import timeLine from "./timeline.vue";
|
||||
import { recipeService } from "@/services/recipeService";
|
||||
import { store, AppModel } from "@/store";
|
||||
|
||||
var ContainerElements = ["svg", "g", "foreignobject"];
|
||||
var RelevantStyles = {
|
||||
"rect": ["fill", "stroke", "stroke-width"],
|
||||
"rect": ["fill", "stroke", "stroke-width", "rx", "ry"],
|
||||
"path": ["fill", "stroke", "stroke-width"],
|
||||
"circle": ["fill", "stroke", "stroke-width"],
|
||||
"line": ["stroke", "stroke-width"],
|
||||
@@ -34,6 +36,16 @@ export default class Gantt extends Vue {
|
||||
padX: number = 0;
|
||||
padY: number = 0;
|
||||
|
||||
get panel() {
|
||||
return (this.$store.state as AppModel).prod.panel;
|
||||
}
|
||||
|
||||
|
||||
get ganttHeight() {
|
||||
return (this.$refs.section1 as any).rowHeight +
|
||||
(this.$refs.section2 as any).rowHeight +
|
||||
(this.$refs.section3 as any).rowHeight;
|
||||
}
|
||||
|
||||
public print() {
|
||||
this.ganttOptions.printing = true;
|
||||
@@ -48,10 +60,10 @@ export default class Gantt extends Vue {
|
||||
var DOMURL = (window.URL || window.webkitURL);
|
||||
|
||||
var svgBlob = new Blob([data], { type: 'image/svg+xml;charset=utf-8' });
|
||||
var url = DOMURL.createObjectURL(svgBlob);
|
||||
|
||||
// var url = DOMURL.createObjectURL(svgBlob);
|
||||
recipeService.UploadImage(svgBlob, this.panel.nomeRicetta.replace('.rcp', '') + ".svg");
|
||||
this.ganttOptions.printing = false;
|
||||
window.open(url, '_blank')
|
||||
// window.open(url, '_blank')
|
||||
});
|
||||
}
|
||||
|
||||
@@ -95,10 +107,22 @@ export default class Gantt extends Vue {
|
||||
}
|
||||
|
||||
get PadY() {
|
||||
if (this.follow) {
|
||||
try {
|
||||
let result = Math.min(...this.blocks.filter(b => !b.terminated).map(i => i.section));
|
||||
switch (result) {
|
||||
case 1: return 0; break;
|
||||
case 2: return (this.$refs.section1 as any).rowHeight; break;
|
||||
case 3: return (this.$refs.section1 as any).rowHeight + (this.$refs.section2 as any).rowHeight; break;
|
||||
}
|
||||
} catch { }
|
||||
|
||||
}
|
||||
return this.padY;
|
||||
}
|
||||
set PadY(value: number) {
|
||||
this.padY = value;
|
||||
if (!this.follow)
|
||||
this.padY = value;
|
||||
}
|
||||
|
||||
follow: boolean = false;
|
||||
@@ -157,14 +181,15 @@ export default class Gantt extends Vue {
|
||||
doPan(event: MouseEvent | TouchEvent) {
|
||||
if (this.lastPosition)
|
||||
if (event.type == "touchmove" || (event.type == "mousemove" && (event as MouseEvent).buttons)) {
|
||||
this.follow = false;
|
||||
|
||||
let p = this.getSvgCoords(event)
|
||||
|
||||
this.PadX = Math.min(this.PadX + p.x - this.lastPosition.x, 0);
|
||||
this.PadY = Math.max(Math.min(this.PadY + p.y - this.lastPosition.y, 0), -this.maxPaddingY);
|
||||
|
||||
|
||||
|
||||
this.lastPosition = p;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ref="mainContainer"
|
||||
preserveAspectRation="xMinYMax"
|
||||
width="100%"
|
||||
height="100%"
|
||||
:height="ganttOptions.printing ? `${ganttHeight}px` : '100%'"
|
||||
@mousemove.capture="doPan"
|
||||
v-on:touchmove="doPan"
|
||||
@mousedown="startPan"
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
<template>
|
||||
<svg class="timeline">
|
||||
<g :transform="`translate(${ paddingHorizontal} 0)`" class="pad">
|
||||
<g :transform="`scale(${zoomFactor} 1)`">
|
||||
<g :transform="`scale(${zoomFactor} 1)`">
|
||||
<g :transform="`translate(${ paddingHorizontal} 0)`" class="pad">
|
||||
<g
|
||||
:transform="`translate(${position} 0)`"
|
||||
:style="position>20?`transition: transform ${speed}s linear`:''"
|
||||
>
|
||||
<g :transform="`scale(${2-zoomFactor} 1)`">
|
||||
<path class="arrow" d="M 0 0 L 30 0 L 15 24 Z" />
|
||||
<line x1="15" y1="24" x2="15" :y2="lineHeight" />
|
||||
</g>
|
||||
<path class="arrow" d="M 0 0 L 30 0 L 15 24 Z" />
|
||||
<line x1="15" y1="24" x2="15" :y2="lineHeight" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import Vue from "vue";
|
||||
import Component from "vue-class-component";
|
||||
import gantt from "./gantt/gantt.vue";
|
||||
import { store } from "@/store";
|
||||
import { messageService } from "@/_base";
|
||||
|
||||
@Component({
|
||||
components: {
|
||||
gantt
|
||||
}
|
||||
})
|
||||
export default class PrintProcesso extends Vue {
|
||||
|
||||
get blocks(): server.Modblock[] {
|
||||
return store.state.modules.blocks;
|
||||
}
|
||||
|
||||
mounted() {
|
||||
messageService.subscribeToChannel("print", () => {
|
||||
(this.$refs.gantt as any).print();
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<div class="printContainer">
|
||||
<gantt ref="gantt" v-if="blocks" :blocks="blocks" :zoom-factor="1"></gantt>
|
||||
</div>
|
||||
</template>
|
||||
<script src="./printProcesso.ts" lang="ts">
|
||||
@@ -42,7 +42,6 @@
|
||||
class="realign"
|
||||
v-if="$refs.gantt"
|
||||
@click="$refs.gantt.toggleFollow()"
|
||||
@dblclick="$refs.gantt.print()"
|
||||
:class="{active: $refs.gantt.follow}"
|
||||
>
|
||||
<img src="/assets/icons/png/recenter-time.png" />
|
||||
|
||||
@@ -4,13 +4,14 @@ import { Prop } from "vue-property-decorator";
|
||||
import { Deferred } from "@/services";
|
||||
import { Modal, ModalHelper } from "@/components/modals";
|
||||
import { messageService } from "@/_base";
|
||||
import { recipeService } from "@/services/recipeService";
|
||||
|
||||
@Component({ components: { modal: Modal } })
|
||||
export default class Notes extends Vue {
|
||||
@Prop()
|
||||
deferred: Deferred<string>;
|
||||
|
||||
@Prop()
|
||||
|
||||
value: string;
|
||||
|
||||
note: string = null;
|
||||
@@ -21,6 +22,10 @@ export default class Notes extends Vue {
|
||||
this.note = value;
|
||||
}
|
||||
|
||||
async mounted() {
|
||||
this.Note = await recipeService.GetNote();
|
||||
}
|
||||
|
||||
save(value: string) {
|
||||
this.deferred.resolve(this.Note);
|
||||
ModalHelper.HideModal();
|
||||
|
||||
@@ -16,11 +16,19 @@ import { debounce } from '@/_base/debounce';
|
||||
export default class ShowCicloInfo extends Vue {
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
show: string = 'forming';
|
||||
|
||||
@Prop()
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla() {
|
||||
recipeService.Cancel();
|
||||
// ModalHelper.HideModal();
|
||||
@@ -79,13 +87,17 @@ export default class ShowCicloInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
<div class="setup">
|
||||
<modal type="ciclo-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button :class="{'active':show==0}" @click="show=0">{{'cycle' | localize('Ciclo di formatura')}}</button>
|
||||
<button
|
||||
:class="{'active':show==1}"
|
||||
@click="show=1"
|
||||
:class="{'active':show=='forming'}"
|
||||
@click="show='forming'"
|
||||
>{{'cycle' | localize('Ciclo di formatura')}}</button>
|
||||
<button
|
||||
:class="{'active':show=='loader'}"
|
||||
@click="show='loader'"
|
||||
v-if="isLoaderEnabled()"
|
||||
>{{'loader' | localize('Caricatore')}}</button>
|
||||
</div>
|
||||
@@ -14,8 +17,8 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<cicloformatura v-if="show==0" :recipe="recipe"></cicloformatura>
|
||||
<caricatore v-if="show==1" :recipe="recipe"></caricatore>
|
||||
<cicloformatura v-if="show=='forming'" :recipe="recipe"></cicloformatura>
|
||||
<caricatore v-if="show=='loader'" :recipe="recipe"></caricatore>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
|
||||
@@ -27,11 +27,19 @@ import { debounce } from '@/_base/debounce';
|
||||
export default class ShowControstampoInfo extends Vue {
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
show: string = 'cycle';
|
||||
|
||||
@Prop()
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla() {
|
||||
recipeService.Cancel();
|
||||
// ModalHelper.HideModal();
|
||||
@@ -94,13 +102,17 @@ export default class ShowControstampoInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -3,23 +3,23 @@
|
||||
<modal type="controstamposetup-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button
|
||||
:class="{'active':show == 0}"
|
||||
@click="show=0"
|
||||
:class="{'active':show == 'cycle'}"
|
||||
@click="show='cycle'"
|
||||
v-if="isCycleEnabled()"
|
||||
>{{'upperplate_cycle' |localize('Ciclo controstampo')}}</button>
|
||||
<button
|
||||
:class="{'active':show == 1}"
|
||||
@click="show=1"
|
||||
:class="{'active':show == 'air'}"
|
||||
@click="show='air'"
|
||||
v-if="isAirEnabled()"
|
||||
>{{'upperplate_air' |localize('Aria controstampo')}}</button>
|
||||
<button
|
||||
:class="{'active':show == 2}"
|
||||
@click="show=2"
|
||||
:class="{'active':show == 'vacuum'}"
|
||||
@click="show='vacuum'"
|
||||
v-if="isVacuumEnabled()"
|
||||
>{{'upperplate_vacuum' |localize('Vuoto controstampo')}}</button>
|
||||
<button
|
||||
:class="{'active':show == 3}"
|
||||
@click="show=3"
|
||||
:class="{'active':show == 'extraction'}"
|
||||
@click="show='extraction'"
|
||||
v-if="isExtractionEnabled()"
|
||||
>{{'upperplate_extraction' |localize('Estrazione controstampo')}}</button>
|
||||
</div>
|
||||
@@ -28,10 +28,10 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<ciclocontrostampo v-if="show==0" :recipe="recipe"></ciclocontrostampo>
|
||||
<ariacontrostampo v-if="show==1" :recipe="recipe"></ariacontrostampo>
|
||||
<vuotocontrostampo v-if="show==2" :recipe="recipe"></vuotocontrostampo>
|
||||
<estrazionecontrostampo v-if="show==3" :recipe="recipe"></estrazionecontrostampo>
|
||||
<ciclocontrostampo v-if="show=='cycle'" :recipe="recipe"></ciclocontrostampo>
|
||||
<ariacontrostampo v-if="show=='air'" :recipe="recipe"></ariacontrostampo>
|
||||
<vuotocontrostampo v-if="show=='vacuum'" :recipe="recipe"></vuotocontrostampo>
|
||||
<estrazionecontrostampo v-if="show=='extraction'" :recipe="recipe"></estrazionecontrostampo>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
|
||||
@@ -74,13 +74,17 @@ export default class ShowEstrazioneInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -101,6 +101,10 @@ export default class ShowFormatoInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,10 @@ export default class ShowImbutituraInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -165,6 +165,10 @@ export default class ShowOpzioniInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,11 +17,19 @@ import { debounce } from "@/_base/debounce";
|
||||
export default class ShowPirometroInfo extends Vue {
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
show: string = 'pyrometer';
|
||||
|
||||
@Prop()
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla() {
|
||||
recipeService.Cancel();
|
||||
// ModalHelper.HideModal();
|
||||
@@ -75,13 +83,17 @@ export default class ShowPirometroInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
<div class="setup">
|
||||
<modal type="pirometro-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button :class="{'active':show==0}" @click="show=0">Pirometro</button>
|
||||
<button :class="{'active':show=='pyrometer'}" @click="show='pyrometer'">Pirometro</button>
|
||||
<button
|
||||
:class="{'active':show==1}"
|
||||
@click="show=1"
|
||||
:class="{'active':show=='upperthermoregulator'}"
|
||||
@click="show='upperthermoregulator'"
|
||||
v-if="isUpperthermoregulatorEnabled()"
|
||||
>{{'upperthermoregulator' | localize('Termoregolazione riscaldo superiore')}}</button>
|
||||
<button
|
||||
:class="{'active':show==2}"
|
||||
@click="show=2"
|
||||
:class="{'active':show=='lowerthermoregulator'}"
|
||||
@click="show='lowerthermoregulator'"
|
||||
v-if="isLowerthermoregulatorEnabled()"
|
||||
>{{'lowerthermoregulator' | localize('Termoregolazione riscaldo inferiore')}}</button>
|
||||
</div>
|
||||
@@ -19,9 +19,9 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<pirometro v-if="show==0" :recipe="recipe"></pirometro>
|
||||
<termosuperiore v-if="show==1" :recipe="recipe"></termosuperiore>
|
||||
<termoinferiore v-if="show==2" :recipe="recipe"></termoinferiore>
|
||||
<pirometro v-if="show=='pyrometer'" :recipe="recipe"></pirometro>
|
||||
<termosuperiore v-if="show=='upperthermoregulator'" :recipe="recipe"></termosuperiore>
|
||||
<termoinferiore v-if="show=='lowerthermoregulator'" :recipe="recipe"></termoinferiore>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
|
||||
@@ -8,13 +8,7 @@
|
||||
<small>{{recipe.positions_mould_intermediate_position.unitMeasure}}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="borded_label" id="quota2" v-focus-on>
|
||||
<div>
|
||||
<img src="assets/icons/png/quota.png" />
|
||||
<span>00</span>
|
||||
<small>mm</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="borded_label" id="quota3" v-focus-on>
|
||||
<div>
|
||||
<img src="assets/icons/png/quota.png" />
|
||||
@@ -89,13 +83,9 @@
|
||||
</template>
|
||||
<style scoped>
|
||||
#quota1 {
|
||||
top: 140px;
|
||||
top: calc(140px + 260px);
|
||||
left: 300px;
|
||||
}
|
||||
#quota2 {
|
||||
top: 540px;
|
||||
left: 100px;
|
||||
}
|
||||
#quota3 {
|
||||
top: 455px;
|
||||
left: 670px;
|
||||
@@ -109,19 +99,19 @@
|
||||
left: 670px;
|
||||
}
|
||||
#quota9 {
|
||||
top: 255px;
|
||||
top: calc(255px + 260px);
|
||||
left: 485px;
|
||||
}
|
||||
#quota8 {
|
||||
top: 140px;
|
||||
top: calc(140px + 260px);
|
||||
left: 510px;
|
||||
}
|
||||
#quota6 {
|
||||
top: 120px;
|
||||
top: calc(120px + 260px);
|
||||
left: 20px;
|
||||
}
|
||||
#quota7 {
|
||||
top: 230px;
|
||||
top: calc(230px + 260px);
|
||||
left: 100px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -25,11 +25,20 @@ import { debounce } from "@/_base/debounce";
|
||||
export default class ShowQuoteVelocitaInfo extends Vue {
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
|
||||
show: string = 'mould';
|
||||
|
||||
@Prop()
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla() {
|
||||
recipeService.Cancel();
|
||||
// ModalHelper.HideModal();
|
||||
@@ -88,13 +97,17 @@ export default class ShowQuoteVelocitaInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -3,18 +3,18 @@
|
||||
<modal type="quote-velocita-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button
|
||||
:class="{'active':show == 0}"
|
||||
@click="show=0"
|
||||
:class="{'active':show == 'mould'}"
|
||||
@click="show='mould'"
|
||||
v-if="isMouldEnabled()"
|
||||
>{{'mould' | localize("Stampo")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 1}"
|
||||
@click="show=1"
|
||||
:class="{'active':show == 'frame'}"
|
||||
@click="show='frame'"
|
||||
v-if="isFrameEnabled()"
|
||||
>{{'frame' | localize("Cornice")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 2}"
|
||||
@click="show=2"
|
||||
:class="{'active':show == 'upperplate'}"
|
||||
@click="show='upperplate'"
|
||||
v-if="isUpperplateEnabled()"
|
||||
>{{'upperplate' | localize("Controstampo")}}</button>
|
||||
</div>
|
||||
@@ -23,9 +23,9 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<salita-stampo v-if="show==0" :recipe="recipe"></salita-stampo>
|
||||
<discesacornice v-if="show==1" :recipe="recipe"></discesacornice>
|
||||
<controstampo v-if="show==2" :recipe="recipe"></controstampo>
|
||||
<salita-stampo v-if="show=='mould'" :recipe="recipe"></salita-stampo>
|
||||
<discesacornice v-if="show=='frame'" :recipe="recipe"></discesacornice>
|
||||
<controstampo v-if="show=='upperplate'" :recipe="recipe"></controstampo>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
|
||||
@@ -32,7 +32,15 @@ export default class Raffreddamento extends Vue {
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
show: string = 'blowing';
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla() {
|
||||
recipeService.Cancel();
|
||||
@@ -98,6 +106,10 @@ export default class Raffreddamento extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -105,7 +117,7 @@ export default class Raffreddamento extends Vue {
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -3,28 +3,28 @@
|
||||
<modal type="raffreddamento-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button
|
||||
:class="{'active':show == 0}"
|
||||
@click="show=0"
|
||||
:class="{'active':show == 'blowing'}"
|
||||
@click="show='blowing'"
|
||||
v-if="isBlowingEnabled()"
|
||||
>{{'blowers' | localize("Ventilatori")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 1}"
|
||||
@click="show=1"
|
||||
:class="{'active':show == 'pyrometer'}"
|
||||
@click="show='pyrometer'"
|
||||
v-if="isPyrometerEnabled()"
|
||||
>{{'pyrometers' | localize("Pirometro")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 2}"
|
||||
@click="show=2"
|
||||
:class="{'active':show == 'nebulizer'}"
|
||||
@click="show='nebulizer'"
|
||||
v-if="isNebulizerEnabled()"
|
||||
>{{'nebulizers' | localize("Nebulizzatori")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 3}"
|
||||
@click="show=3"
|
||||
:class="{'active':show == 'telescopic'}"
|
||||
@click="show='telescopic'"
|
||||
v-if="isTelescopicEnabled()"
|
||||
>{{'telescopic' | localize("Telescopi")}}</button>
|
||||
<button
|
||||
:class="{'active':show == 4}"
|
||||
@click="show=4"
|
||||
:class="{'active':show == 'shutter'}"
|
||||
@click="show='shutter'"
|
||||
v-if="isShutterEnabled()"
|
||||
>{{'shutters' | localize("Otturatori")}}</button>
|
||||
</div>
|
||||
@@ -33,11 +33,11 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<ventilatori v-if="show==0" :recipe="recipe"></ventilatori>
|
||||
<pirometro v-if="show==1" :recipe="recipe"></pirometro>
|
||||
<nebulizzatori v-if="show==2" :recipe="recipe"></nebulizzatori>
|
||||
<telescopi v-if="show==3" :recipe="recipe"></telescopi>
|
||||
<otturatori v-if="show==4" :recipe="recipe"></otturatori>
|
||||
<ventilatori v-if="show=='blowing'" :recipe="recipe"></ventilatori>
|
||||
<pirometro v-if="show=='pyrometer'" :recipe="recipe"></pirometro>
|
||||
<nebulizzatori v-if="show=='nebulizer'" :recipe="recipe"></nebulizzatori>
|
||||
<telescopi v-if="show=='telescopic'" :recipe="recipe"></telescopi>
|
||||
<otturatori v-if="show=='shutter'" :recipe="recipe"></otturatori>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
|
||||
@@ -16,12 +16,10 @@ export default class RiscaldiInferiori extends Vue {
|
||||
|
||||
|
||||
selectedChannelIds: number[] = [];
|
||||
_uniformChannelValue = 0;
|
||||
uniformChannelValue = 0;
|
||||
|
||||
get uniformChannelValue() { return this._uniformChannelValue; }
|
||||
set uniformChannelValue(v) {
|
||||
this._uniformChannelValue = v;
|
||||
for (const c of this.selectedChannels) c.setpointHMI = v;
|
||||
beforeMount(){
|
||||
this.uniformChannelValue = -1;
|
||||
}
|
||||
|
||||
get selectedChannels(): Warmers.IChannel[] {
|
||||
@@ -30,6 +28,10 @@ export default class RiscaldiInferiori extends Vue {
|
||||
|
||||
selectionMethod = "none";
|
||||
|
||||
changedSelectValue(v){
|
||||
if(this.uniformChannelValue>=0)
|
||||
for (const c of this.selectedChannels) c.setpointHMI = this.uniformChannelValue;
|
||||
}
|
||||
|
||||
zoomIn() {
|
||||
(this.$refs.warmers as any).zoomIn();
|
||||
@@ -48,9 +50,17 @@ export default class RiscaldiInferiori extends Vue {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) - 5, 0), 100);
|
||||
}
|
||||
|
||||
add1() {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) + 1, 0), 100);
|
||||
}
|
||||
|
||||
remove1() {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) - 1, 0), 100);
|
||||
}
|
||||
|
||||
selectionChanged(selected: number[]) {
|
||||
this.selectedChannelIds = []
|
||||
this.uniformChannelValue = 0;
|
||||
this.uniformChannelValue = -1;
|
||||
this.selectedChannelIds = selected;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="input-area">
|
||||
<label>Selezione</label>
|
||||
<label>{{'warmers_selection' | localize('Selezione')}}</label>
|
||||
</div>
|
||||
<div class="input-area left grid grid-5">
|
||||
<button
|
||||
@@ -49,25 +49,24 @@
|
||||
</div>
|
||||
<div class="divider"></div>
|
||||
<div class="input-area">
|
||||
<label>Gestione potenza</label>
|
||||
<label>{{'warmers_power' | localize('Gestione Potenza')}}</label>
|
||||
</div>
|
||||
<div class="input-area left grid grid-5">
|
||||
<button class="btn btn-info square" @click="remove5()">
|
||||
<img src="assets/icons/png/meno5.png" />
|
||||
</button>
|
||||
<button class="btn btn-info square" @click="add5()">
|
||||
<img src="assets/icons/png/piu5.png" />
|
||||
</button>
|
||||
<combo v-model="uniformChannelValue">
|
||||
<option :value="0">0%</option>
|
||||
<option :value="25">25%</option>
|
||||
<option :value="50">50%</option>
|
||||
<option :value="100">100%</option>
|
||||
</combo>
|
||||
<button class="btn btn-info square" @click="remove5()">-5%</button>
|
||||
<button class="btn btn-info square" @click="remove1()">-1%</button>
|
||||
<button class="btn btn-info square" @click="add1()">+1%</button>
|
||||
<button class="btn btn-info square" @click="add5()">+5%</button>
|
||||
<select class="input-select" v-model="uniformChannelValue" @change="changedSelectValue">
|
||||
<option value="-1">{{'warmers_select_power' | localize('Seleziona...')}}</option>
|
||||
<option v-for="index in 11" :key="index" :value="((index-1)*10)">{{(index-1)*10}}%</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="input-area grid left">
|
||||
<button class="btn btn-success">Autocomposizione</button>
|
||||
<button
|
||||
class="btn btn-success"
|
||||
@click="$refs.warmers.automate()"
|
||||
>{{'warmers_autocomposition' | localize('Autocomposizione')}}</button>
|
||||
</div>
|
||||
<div class="divider"></div>
|
||||
<!-- <div class="input-area grid left"> -->
|
||||
@@ -98,6 +97,7 @@
|
||||
<article class="warmers">
|
||||
<warmers
|
||||
ref="warmers"
|
||||
:recipe="recipe"
|
||||
:id-reflector="1"
|
||||
@select="selectionChanged"
|
||||
@methodChanged="m => selectionMethod = m"
|
||||
|
||||
@@ -16,12 +16,10 @@ export default class RiscaldiSuperiori extends Vue {
|
||||
recipe: Recipe.IRecipe;
|
||||
|
||||
selectedChannelIds: number[] = [];
|
||||
_uniformChannelValue = 0;
|
||||
uniformChannelValue: number = -1;
|
||||
|
||||
get uniformChannelValue() { return this._uniformChannelValue; }
|
||||
set uniformChannelValue(v) {
|
||||
this._uniformChannelValue = v;
|
||||
for (const c of this.selectedChannels) c.setpointHMI = v;
|
||||
beforeMount(){
|
||||
this.uniformChannelValue = -1;
|
||||
}
|
||||
|
||||
get selectedChannels(): Warmers.IChannel[] {
|
||||
@@ -30,6 +28,11 @@ export default class RiscaldiSuperiori extends Vue {
|
||||
|
||||
selectionMethod = "none"
|
||||
|
||||
changedSelectValue(v){
|
||||
console.log(this.uniformChannelValue);
|
||||
if(this.uniformChannelValue>=0)
|
||||
for (const c of this.selectedChannels) c.setpointHMI = this.uniformChannelValue;
|
||||
}
|
||||
|
||||
zoomIn() {
|
||||
(this.$refs.warmers as any).zoomIn();
|
||||
@@ -47,9 +50,17 @@ export default class RiscaldiSuperiori extends Vue {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) - 5, 0), 100);
|
||||
}
|
||||
|
||||
add1() {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) + 1, 0), 100);
|
||||
}
|
||||
|
||||
remove1() {
|
||||
for (const c of this.selectedChannels) c.setpointHMI = Math.min(Math.max(parseFloat(c.setpointHMI.toString()) - 1, 0), 100);
|
||||
}
|
||||
|
||||
selectionChanged(selected: number[]) {
|
||||
this.selectedChannelIds = []
|
||||
this.uniformChannelValue = 0;
|
||||
this.uniformChannelValue = -1;
|
||||
this.selectedChannelIds = selected;
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="input-area">
|
||||
<label>Selezione</label>
|
||||
<label>{{'warmers_selection' | localize('Selezione')}}</label>
|
||||
</div>
|
||||
<div class="input-area left grid grid-5">
|
||||
<button
|
||||
@@ -49,25 +49,24 @@
|
||||
</div>
|
||||
<div class="divider"></div>
|
||||
<div class="input-area">
|
||||
<label>Gestione potenza</label>
|
||||
<label>{{'warmers_power' | localize('Gestione Potenza')}}</label>
|
||||
</div>
|
||||
<div class="input-area left grid grid-5">
|
||||
<button class="btn btn-info square" @click="remove5()">
|
||||
<img src="assets/icons/png/meno5.png" />
|
||||
</button>
|
||||
<button class="btn btn-info square" @click="add5()">
|
||||
<img src="assets/icons/png/piu5.png" />
|
||||
</button>
|
||||
<combo v-model="uniformChannelValue">
|
||||
<option :value="0">0%</option>
|
||||
<option :value="25">25%</option>
|
||||
<option :value="50">50%</option>
|
||||
<option :value="100">100%</option>
|
||||
</combo>
|
||||
<button class="btn btn-info square" @click="remove5()">-5%</button>
|
||||
<button class="btn btn-info square" @click="remove1()">-1%</button>
|
||||
<button class="btn btn-info square" @click="add1()">+1%</button>
|
||||
<button class="btn btn-info square" @click="add5()">+5%</button>
|
||||
<select class="input-select" v-model="uniformChannelValue" @change="changedSelectValue">
|
||||
<option value="-1">{{'warmers_select_power' | localize('Seleziona...')}}</option>
|
||||
<option v-for="index in 11" :key="index" :value="((index-1)*10)">{{(index-1)*10}}%</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="input-area grid left">
|
||||
<button class="btn btn-success">Autocomposizione</button>
|
||||
<button
|
||||
class="btn btn-success"
|
||||
@click="$refs.warmers.automate()"
|
||||
>{{'warmers_autocomposition' | localize('Autocomposizione')}}</button>
|
||||
</div>
|
||||
<div class="divider"></div>
|
||||
<!-- <div class="input-area grid left"> -->
|
||||
@@ -95,7 +94,12 @@
|
||||
</aside>
|
||||
<hr />
|
||||
<article class="warmers">
|
||||
<warmers ref="warmers" @select="selectionChanged" @methodChanged="m => selectionMethod = m"></warmers>
|
||||
<warmers
|
||||
ref="warmers"
|
||||
@select="selectionChanged"
|
||||
@methodChanged="m => selectionMethod = m"
|
||||
:recipe="recipe"
|
||||
></warmers>
|
||||
|
||||
<div class="absolute bottom right">
|
||||
<button class="btn btn-info square" @click="zoomIn()">
|
||||
|
||||
@@ -16,6 +16,9 @@ export default class Warmers extends Vue {
|
||||
width = 180;
|
||||
height = 48;
|
||||
|
||||
@Prop()
|
||||
recipe: Recipe.IRecipe;
|
||||
|
||||
@Prop({ default: 0 })
|
||||
idReflector: number;
|
||||
|
||||
@@ -153,16 +156,14 @@ export default class Warmers extends Vue {
|
||||
|
||||
stopSelection() {
|
||||
if (this.selectionMethod != SelectionMethod.none) {
|
||||
this.captureItems();
|
||||
this.captureItems(this.$refs.lazo as SVGGeometryElement);
|
||||
this.toggleSelection(this.selectionMethod);
|
||||
}
|
||||
}
|
||||
|
||||
captureItems() {
|
||||
captureItems(lazo: SVGGeometryElement) {
|
||||
let captured = new Set<number>();
|
||||
|
||||
let lazo = this.$refs.lazo as SVGGeometryElement;
|
||||
|
||||
let point1 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
let point2 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
let point3 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
@@ -171,14 +172,7 @@ export default class Warmers extends Vue {
|
||||
if (lazo && point1 && point2)
|
||||
for (const row of this.rows) {
|
||||
for (const cell of this.resistancesPerRow(row)) {
|
||||
point1.x = this.resistanceXPosition(row, cell.column) * this.width;
|
||||
point1.y = row * this.height;
|
||||
point2.x = point1.x + this.width * cell.dimension;
|
||||
point2.y = point1.y + this.height;
|
||||
point3.x = point1.x;
|
||||
point3.y = point2.y;
|
||||
point4.x = point2.x;
|
||||
point4.y = point1.y;
|
||||
this.resistancePosition(row, cell, point1, point2, point3, point4);
|
||||
|
||||
if (lazo.isPointInFill(point1) || lazo.isPointInFill(point2) || lazo.isPointInFill(point3) || lazo.isPointInFill(point4)) {
|
||||
captured.add(cell.idChannel);
|
||||
@@ -190,6 +184,82 @@ export default class Warmers extends Vue {
|
||||
this.$emit('select', Array.from(captured.values()));
|
||||
}
|
||||
|
||||
private resistancePosition(row: number, cell: Warmers.IResistance, point1: DOMPoint, point2: DOMPoint, point3?: DOMPoint, point4?: DOMPoint) {
|
||||
point1.x = this.resistanceXPosition(row, cell.column) * this.width;
|
||||
point1.y = row * this.height;
|
||||
point2.x = point1.x + this.width * cell.dimension;
|
||||
point2.y = point1.y + this.height;
|
||||
if (point3) {
|
||||
point3.x = point1.x;
|
||||
point3.y = point2.y;
|
||||
}
|
||||
if (point4) {
|
||||
point4.x = point2.x;
|
||||
point4.y = point1.y;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
automate(max: number = 100, min: number = 20) {
|
||||
|
||||
let lazo = this.$refs.piastra as SVGRectElement;
|
||||
let point1 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
let point2 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
let point3 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
let point4 = (this.$refs.warmer as SVGSVGElement)?.createSVGPoint();
|
||||
|
||||
let result = new Map<number, Warmers.IResistance[]>();
|
||||
|
||||
for (const row of this.rows) {
|
||||
for (const cell of this.resistancesPerRow(row)) {
|
||||
this.resistancePosition(row, cell, point1, point2, point3, point4);
|
||||
if (lazo.isPointInFill(point1) || lazo.isPointInFill(point2) || lazo.isPointInFill(point3) || lazo.isPointInFill(point4)) {
|
||||
let distance = this.resistanceDistance(lazo, point1, point2, point3, point4);
|
||||
if (!result.has(distance))
|
||||
result.set(distance, []);
|
||||
result.get(distance).push(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mink = Math.min(...Array.from(result.keys()));
|
||||
let maxk = Math.max(...Array.from(result.keys()));
|
||||
|
||||
let dk = maxk - mink;
|
||||
let dv = max - min;
|
||||
|
||||
for (const i of Array.from(result.keys())) {
|
||||
let rv = max - (((i - mink) * dv) / dk);
|
||||
|
||||
for (const res of result.get(i)) {
|
||||
let channel = this.channels.find(c => c.idChannel == res.idChannel);
|
||||
channel.setpointHMI = Math.round(rv);
|
||||
}
|
||||
}
|
||||
|
||||
// console.log('automate', result);
|
||||
|
||||
|
||||
}
|
||||
|
||||
resistanceDistance(lazo: SVGRectElement, ...points: DOMPoint[]): number {
|
||||
// se i punti non sono tutti nel lazo la distanza è 0
|
||||
if (points.reduce((p, c) => { p += lazo.isPointInFill(c) ? 1 : 0; return p; }, 0) < 4) return 0;
|
||||
|
||||
let x = lazo.x.baseVal.value;
|
||||
let y = lazo.y.baseVal.value;
|
||||
let w = lazo.width.baseVal.value;
|
||||
let h = lazo.height.baseVal.value;
|
||||
|
||||
return Math.min(...points.reduce((p, c) => {
|
||||
p.push(Math.abs(c.x - x));
|
||||
p.push(Math.abs(c.x - (x + w)));
|
||||
p.push(Math.abs(c.y - y));
|
||||
p.push(Math.abs(c.y - (y + h)));
|
||||
return p;
|
||||
}, [] as number[]));
|
||||
}
|
||||
|
||||
trailing = false;
|
||||
moveSelection(event: MouseEvent) {
|
||||
if (this.selectionPoints.length) {
|
||||
|
||||
@@ -29,6 +29,21 @@
|
||||
/>
|
||||
</foreignObject>
|
||||
</g>
|
||||
<g>
|
||||
<rect
|
||||
ref="piastra"
|
||||
:x="10"
|
||||
:y="10"
|
||||
:width="recipe.general_sizes_sheet_dim_x.setpointHMI"
|
||||
:height="recipe.general_sizes_sheet_dim_y.setpointHMI"
|
||||
stroke="rgba(0,0,0,.3)"
|
||||
stroke-width="6"
|
||||
rx="3"
|
||||
ry="3"
|
||||
fill="rgba(0,0,0,0.1)"
|
||||
/>
|
||||
</g>
|
||||
|
||||
<g v-if="selectionMethod == 'rect' && selectionPoints.length>1">
|
||||
<rect
|
||||
ref="lazo"
|
||||
|
||||
@@ -18,11 +18,19 @@ import { debounce } from "@/_base/debounce";
|
||||
export default class ShowRiscaldamentoSuperioreInfo extends Vue {
|
||||
|
||||
recipe: Recipe.IRecipe = this.$store.getters.getCurrent();
|
||||
show: number = 0;
|
||||
show: string = 'upperheaters';
|
||||
|
||||
@Prop()
|
||||
deferred: Deferred<boolean>;
|
||||
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
mounted() {
|
||||
if (this.value)
|
||||
this.show = this.value;
|
||||
}
|
||||
|
||||
annulla(name: string) {
|
||||
recipeService.Cancel();
|
||||
// ModalHelper.HideModal();
|
||||
@@ -72,13 +80,17 @@ export default class ShowRiscaldamentoSuperioreInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -3,18 +3,18 @@
|
||||
<modal type="riscaldi-info">
|
||||
<div class="tab-header" slot="header-buttons">
|
||||
<button
|
||||
:class="{'active':show == 0}"
|
||||
@click="show = 0"
|
||||
:class="{'active':show == 'upperheaters'}"
|
||||
@click="show = 'upperheaters'"
|
||||
v-if="isUpperheatersEnabled()"
|
||||
>{{'upperheaters' | localize('Riscaldi superiori')}}</button>
|
||||
<button
|
||||
:class="{'active':show == 1}"
|
||||
@click="show = 1"
|
||||
:class="{'active':show == 'lowerheaters'}"
|
||||
@click="show = 'lowerheaters'"
|
||||
v-if="isLowerheatersEnabled()"
|
||||
>{{'lowerheaters' | localize('Riscaldi inferiori')}}</button>
|
||||
<button
|
||||
:class="{'active':show == 2}"
|
||||
@click="show = 2"
|
||||
:class="{'active':show == 'decomsustain'}"
|
||||
@click="show = 'decomsustain'"
|
||||
v-if="isDecomsustainEnabled()"
|
||||
>{{'decomsustain' | localize("Sostentamento/Decompressione")}}</button>
|
||||
</div>
|
||||
@@ -23,10 +23,10 @@
|
||||
<i class="fa fa-remove"></i>
|
||||
</button>
|
||||
</div>
|
||||
<riscaldiinf v-if="show == 1" :recipe="recipe"></riscaldiinf>
|
||||
<riscaldisup v-if="show == 0" :recipe="recipe"></riscaldisup>
|
||||
<sostdecomp v-if="show == 2" :recipe="recipe"></sostdecomp>
|
||||
<footer>
|
||||
<riscaldiinf v-if="show == 'lowerheaters'" :recipe="recipe"></riscaldiinf>
|
||||
<riscaldisup v-if="show == 'upperheaters'" :recipe="recipe"></riscaldisup>
|
||||
<sostdecomp v-if="show == 'decomsustain'" :recipe="recipe"></sostdecomp>
|
||||
<footer>
|
||||
<button
|
||||
class="btn"
|
||||
@click="annulla()"
|
||||
|
||||
@@ -100,13 +100,17 @@ export default class ShowVuotoInfo extends Vue {
|
||||
const el = this.payload[key] as Recipe.IValue;
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
for (const key in store.state.warmers.channels) {
|
||||
const el = store.state.warmers.channels[key];
|
||||
if (el.setpointHMI != el.setpointPLC) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
hasEnabledFields(...fields: string[]) {
|
||||
let result = false;
|
||||
for (const field of fields) {
|
||||
if ((this.recipe[field] as Recipe.IValue).status.enabled) result = true;
|
||||
if ((this.recipe[field] as Recipe.IValue).status.visible) result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
import { Factory, messageService } from "@/_base";
|
||||
import ConfirmModal from "./modal-confirm.vue";
|
||||
import { Deferred } from "@/services/Deferred";
|
||||
import { M155Questions } from "src/app_modules/machine";
|
||||
import { processStore, processModelActions } from "@/store/runningProcess.store";
|
||||
|
||||
import { store } from "@/store";
|
||||
declare let $: any;
|
||||
|
||||
@@ -57,12 +59,34 @@ export class ModalHelper {
|
||||
isMessage: false
|
||||
};
|
||||
|
||||
public static M155ModalData = {
|
||||
data: null
|
||||
};
|
||||
|
||||
public static MaintenancePasswordData = {
|
||||
maintenance: null,
|
||||
value: ""
|
||||
};
|
||||
|
||||
public static ShowNextM155Modal() {
|
||||
ModalHelper.M155ModalData.data = null;
|
||||
for(let i = 0; i< processStore.state.m155messages.length; i++){
|
||||
if(processStore.state.m155messages[i].toDisplay){
|
||||
ModalHelper.M155ModalData.data = processStore.state.m155messages[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(ModalHelper.M155ModalData.data){
|
||||
messageService.publishToChannel("show-modal-nc", M155Questions);
|
||||
}
|
||||
else{
|
||||
messageService.publishToChannel("hide-modal-nc", M155Questions);
|
||||
}
|
||||
}
|
||||
public static HideThisM155Modal(processId) {
|
||||
processModelActions.hideM155Messsage(store,processId);
|
||||
}
|
||||
|
||||
public static GetModalData() {
|
||||
return ModalHelper._modalData;
|
||||
};
|
||||
@@ -101,6 +125,17 @@ export class ModalHelper {
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
|
||||
public static ShowM155ModaloOfProcess(proc: number) {
|
||||
if (!ModalHelper.M155ModalData.data) {
|
||||
let find = processStore.state.m155messages.find(X => X.process == proc)
|
||||
if (find) {
|
||||
ModalHelper.M155ModalData.data = find;
|
||||
messageService.publishToChannel("show-modal-nc", M155Questions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static HideModal(modalname: string = "modal") {
|
||||
messageService.publishToChannel("hide-" + modalname);
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@ Vue.filter("localize", function (key: string, defaultValue: string, ...args): st
|
||||
if (!value)
|
||||
dvalue = labels[key];
|
||||
|
||||
if (!value && !dvalue) {
|
||||
console.debug("missing localization key:", key);
|
||||
}
|
||||
// if (!value && !dvalue) {
|
||||
// console.debug("missing localization key:", key);
|
||||
// }
|
||||
return pf.vsprintf(value || dvalue || defaultValue, args);
|
||||
});
|
||||
|
||||
|
||||