Compare commits
199 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| a6df5719f0 | |||
| d23f6fd4c5 | |||
| 91a554d616 | |||
| e96d97890f | |||
| 42186c9509 | |||
| b0391855f5 | |||
| 305e2220f8 | |||
| a5d2323dea | |||
| 95db7bbdd9 | |||
| 345918cdaf | |||
| 8bc9fc97c8 | |||
| cd5ea6c6cc | |||
| fb91158ee6 | |||
| 7b724b070f | |||
| 7bb8602595 | |||
| 02b1b3b4c6 | |||
| f499cdc203 | |||
| fa9db02e0e | |||
| 136f3c40ff | |||
| 0e02b0ca3f | |||
| 913834a34d | |||
| 6b0d5e2c03 | |||
| 3ead2b7283 | |||
| 66ba44868e | |||
| 529266b57b | |||
| e1280c193f | |||
| 77cec0160a | |||
| f7234dd34b | |||
| 4c7ad000db | |||
| 140afc4539 | |||
| 699ccfbfba | |||
| 3877cb7843 | |||
| 80e6192e46 | |||
| 2786c8e6a8 | |||
| efbfd857f6 | |||
| 3968f72061 | |||
| 88e78736f0 | |||
| a362829256 | |||
| 43abdd203b | |||
| 74e51a4156 | |||
| 52621f83e8 | |||
| 9be02d4666 | |||
| d16712bbd9 | |||
| 8c96c46d35 | |||
| 678312ceca | |||
| 072b216eff | |||
| 2f2fc02730 | |||
| cccd8f2c36 | |||
| 4e27d3fe63 | |||
| 8d57a29fd9 | |||
| c45c81dbf7 | |||
| 7417c20dcc | |||
| a98500bade | |||
| 154897e835 | |||
| 587f4b3e82 | |||
| 8714898228 | |||
| 49ccfe10e7 | |||
| 1168c826c1 | |||
| 71a1333c12 | |||
| 4c5f1e975f | |||
| 4a5d0b9770 | |||
| 1e4dc168ac | |||
| d2fd9675fd | |||
| 9440a01ff7 | |||
| 968dab090d | |||
| b47975c7f6 | |||
| cc9527fbad | |||
| 208b2122ac | |||
| 4dde0de70a | |||
| d3f65680e9 | |||
| 4879979ae6 | |||
| a379fc96d3 | |||
| a1fd3ec363 | |||
| 22b5b3453b | |||
| 06d83de1df | |||
| 828701c865 | |||
| 5dc96371ce | |||
| 3ce95c81dd | |||
| 1f7d34327c | |||
| 8aadb503ec | |||
| e7f221376f | |||
| d4d26408ad | |||
| 3e6b9390da | |||
| a03fe6c7c7 | |||
| 90d3e33f2b | |||
| 3388520048 | |||
| b938239572 | |||
| 71fb94f59b | |||
| b78cbfc38a | |||
| 3403836f7e | |||
| f0dc2333fb | |||
| 4fafa3a791 | |||
| 3564f0cb72 | |||
| 6b1bf6f94b | |||
| d2f8c7f893 | |||
| 7f3ad3dbd9 | |||
| 01c42162d0 | |||
| 8afcaf8f6f | |||
| 54573c76b1 | |||
| 5900f2b9d9 | |||
| 821b7accbd | |||
| f6bc7e4ef4 | |||
| 0e35c3da9e | |||
| d48d6e7925 | |||
| b91a18b434 | |||
| abaf3a4794 | |||
| dbc2777bcd | |||
| 7ee0cdb5a6 | |||
| 69f1398d9a | |||
| b707c4a2f5 | |||
| f741a39644 | |||
| 6624c6b219 | |||
| 2819c901f1 | |||
| 30ac1496e2 | |||
| 2bbd500360 | |||
| d887dc7d48 | |||
| be669f66f1 | |||
| 5c96a2c9f1 | |||
| d4cc3a8877 | |||
| d79d883224 | |||
| 2e646b0547 | |||
| 578351fbcc | |||
| a1b5bbb9ef | |||
| 88095c418b | |||
| 866ae7c089 | |||
| 5166e8db62 | |||
| ededb27d80 | |||
| 7ff75037f7 | |||
| bd350e15e4 | |||
| 10d3e8e958 | |||
| fe5ea382b9 | |||
| 7992723cba | |||
| 5e22af4625 | |||
| 393768fe7c | |||
| 34edd6839e | |||
| 0ef9a38073 | |||
| cb6271562b | |||
| 060a78964d | |||
| 9159864ef2 | |||
| 4f863b71f0 | |||
| c0edbdbd2f | |||
| b893a9f2e0 | |||
| 71f4192bba | |||
| ffadf07aaf | |||
| 0648f53c94 | |||
| d4e917cce2 | |||
| 895914fd24 | |||
| bc5fde0844 | |||
| b9f82cb6f0 | |||
| cc6ba8f0ef | |||
| 772aa06eb9 | |||
| 2399cd0a9d | |||
| 35d0e05908 | |||
| a057bb115e | |||
| fa9a477a88 | |||
| 0f23124a17 | |||
| d2e728abf5 | |||
| ecf740044d | |||
| 0341d98a95 | |||
| a88560e0c1 | |||
| 30a104854c |
@@ -12,7 +12,7 @@
|
||||
<ServerUrl>localhost</ServerUrl>
|
||||
<ServerPort>9000</ServerPort>
|
||||
<Id>1</Id>
|
||||
<DeleteCahceFolderOnStartup>false</DeleteCahceFolderOnStartup>
|
||||
<DeleteCahceFolderOnStartup>true</DeleteCahceFolderOnStartup>
|
||||
</Connection>
|
||||
<VendorHmi>
|
||||
<FollowNcWindow>True</FollowNcWindow>
|
||||
|
||||
@@ -36,13 +36,14 @@ namespace Active_Client.Browser_Tools
|
||||
|
||||
private MainForm mainForm;
|
||||
|
||||
private static readonly string[] _validExtensions = { "", ".json", ".rcp", ".tpl" };
|
||||
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";
|
||||
public static string RECENT_FOLDER_KEY = "RECENT";
|
||||
private const string THERMO_RECIPE_PATH = @"C:\CMS\Recipe";
|
||||
|
||||
public static FileSystemWatcher watcher = null;
|
||||
public static DateTime _lastTimeFileWatcherEventRaised = DateTime.Now;
|
||||
@@ -79,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;
|
||||
@@ -359,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)
|
||||
@@ -375,7 +382,7 @@ namespace Active_Client.Browser_Tools
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Desktop folder
|
||||
drivelist.Add(new Drive()
|
||||
{
|
||||
@@ -383,7 +390,18 @@ namespace Active_Client.Browser_Tools
|
||||
Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\",
|
||||
Type = "SPFO"
|
||||
});
|
||||
*/
|
||||
|
||||
if (Directory.Exists(THERMO_RECIPE_PATH))
|
||||
{
|
||||
drivelist.Add(new Drive()
|
||||
{
|
||||
Name = ElaborateName("Recipes", "", DriveType.Unknown),
|
||||
Path = THERMO_RECIPE_PATH + "\\",
|
||||
Type = "SPFO"
|
||||
});
|
||||
}
|
||||
/*
|
||||
try
|
||||
{
|
||||
// Network Folders
|
||||
@@ -405,7 +423,7 @@ namespace Active_Client.Browser_Tools
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
e.SetReturnValue(JsonConvert.SerializeObject(drivelist));
|
||||
}
|
||||
@@ -474,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)
|
||||
{
|
||||
@@ -660,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)
|
||||
{
|
||||
@@ -689,16 +785,26 @@ namespace Active_Client.Browser_Tools
|
||||
imagePath = Path.GetFileNameWithoutExtension(p);
|
||||
imageDirectory = Path.GetDirectoryName(p);
|
||||
|
||||
file.Content = new List<string>();
|
||||
file.SheetX = "";
|
||||
file.SheetY = "";
|
||||
file.SheetZ = "";
|
||||
file.Annotation = "";
|
||||
|
||||
try
|
||||
{
|
||||
StreamReader fileRead = new StreamReader(p);
|
||||
while ((line = fileRead.ReadLine()) != null && counter < 10)
|
||||
dynamic content = JsonConvert.DeserializeObject(File.ReadAllText(p));
|
||||
|
||||
if(content != null && content.RecipeParameters != null)
|
||||
{
|
||||
file.Content.Add(line);
|
||||
counter++;
|
||||
if(content.RecipeParameters.general_sizes_sheet_dim_x != null)
|
||||
file.SheetX = content.RecipeParameters.general_sizes_sheet_dim_x;
|
||||
if (content.RecipeParameters.general_sizes_sheet_dim_y != null)
|
||||
file.SheetY = content.RecipeParameters.general_sizes_sheet_dim_y;
|
||||
if (content.RecipeParameters.general_sizes_sheet_thickness != null)
|
||||
file.SheetZ = content.RecipeParameters.general_sizes_sheet_thickness;
|
||||
if (content.recipeNotes != null)
|
||||
file.Annotation = content.recipeNotes;
|
||||
}
|
||||
fileRead.Close();
|
||||
|
||||
foreach (string ext in _validImages)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,11 @@ namespace Active_Client.Browser_Tools.Models
|
||||
public String AbsolutePath;
|
||||
public DateTime CreationDate;
|
||||
public DateTime LastModDate;
|
||||
public List<String> Content;
|
||||
public String SheetX;
|
||||
public String SheetY;
|
||||
public String SheetZ;
|
||||
public String Annotation;
|
||||
|
||||
public Boolean CanEdit;
|
||||
public string PreviewBase64;
|
||||
}
|
||||
|
||||
@@ -179,6 +179,19 @@ namespace Active_Client
|
||||
//Method called Before Cef Initialization
|
||||
static void Chromium_OnBeforeCfxInitialize(OnBeforeCfxInitializeEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Config.ConnectionConfig.DeleteCahceFolderOnStartup && Directory.Exists(Constants.BROWSER_CACHE_FOLDER))
|
||||
{
|
||||
Directory.Delete(Constants.BROWSER_CACHE_FOLDER, true);
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
ShowAlarmAndClose(E.Message);
|
||||
}
|
||||
|
||||
|
||||
e.Settings.WindowlessRenderingEnabled = true;
|
||||
|
||||
//Path Setup
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -40,12 +40,7 @@ namespace Active_Client.View
|
||||
LogoCMS.Visible = true;
|
||||
LogoSCM.Visible = false;
|
||||
}
|
||||
|
||||
|
||||
//Setup The Browser
|
||||
if (!SetupBrowser())
|
||||
return;
|
||||
|
||||
|
||||
//Set window Position
|
||||
this.Location = new Point((Screen.PrimaryScreen.Bounds.Width / 2) - (this.Width / 2), (Screen.PrimaryScreen.Bounds.Height / 2) - (this.Height / 2));
|
||||
}
|
||||
@@ -164,30 +159,6 @@ namespace Active_Client.View
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Sub-Method used to SetupThe Browser Environment
|
||||
private bool SetupBrowser()
|
||||
{
|
||||
//Delete Browser Cache
|
||||
try
|
||||
{
|
||||
if (Config.ConnectionConfig.DeleteCahceFolderOnStartup && Directory.Exists(Constants.BROWSER_CACHE_FOLDER))
|
||||
{
|
||||
setStatus("Deleting Browser Chache Folder...", "");
|
||||
Directory.Delete(Constants.BROWSER_CACHE_FOLDER, true);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
setStatus("Close the application!", E.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//Sub-Method used to test the connection
|
||||
private bool testConnection(Uri url, out Boolean error)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# Progetto Thermo.Active CMS
|
||||
|
||||
|
||||
## Struttura Progetto
|
||||
|
||||
## Ambiente sviluppo e simulazione
|
||||
|
||||
## Procedura udpate DB
|
||||
|
||||
In caso di update del modello DB, seguendo questa guida (https://www.entityframeworktutorial.net/efcore/entity-framework-core-migration.aspx#:~:text=Adding%20a%20Migration,-At%20the%20very&text=So%2C%20firstly%2C%20you%20need%20to,command%20to%20add%20a%20migration.&text=If%20you%20are%20using%20dotnet,Interface%2C%20execute%20the%20following%20command.)
|
||||
|
||||
* si modifica lato classe il modello
|
||||
* si apre il PM Nuget,s elezionando il progetto DB (che contiene le migrations)
|
||||
* si da il comando di migrazione con un testo descrittivo, tipo
|
||||
add-migration MyFirstMigration
|
||||
* si può poi aggiornare il DB manualmente (o all'avvio del sw) con il comando
|
||||
Update-Database
|
||||
|
||||
## Procedura Riavvio su SIM
|
||||
|
||||
Step come indicati da M.Carissoni:
|
||||
* mettere macchina in MANUAL
|
||||
* Dai un paio di ResetSK (prima softkey! oppure sul pannello siemens)
|
||||
* fai cicloReset (softkey)
|
||||
* parcheggio macchina da GANT (fino a che si spegne)
|
||||
* quando si spegne ciclo reset auto
|
||||
* Inizia a lampeggiare start e lo clicchi e parte
|
||||
* Quando si spegne cicloReset fai cicloAuto
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<?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: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>
|
||||
|
||||
<!-- 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>
|
||||
@@ -552,17 +552,17 @@
|
||||
"233": 0
|
||||
},
|
||||
"RecipeOverview": {
|
||||
"General": "HasError",
|
||||
"Positions": "HasError",
|
||||
"Cycle": "ChangedOk",
|
||||
"Heats": "ChangedOk",
|
||||
"Pyrometer": "ChangedOk",
|
||||
"Drawing": "ChangedOk",
|
||||
"UpperPlate": "ChangedOk",
|
||||
"Cooling": "HasError",
|
||||
"Vacuum": "ChangedOk",
|
||||
"Extraction": "ChangedOk",
|
||||
"Options": "HasError"
|
||||
"General": "Unchanged",
|
||||
"Positions": "Unchanged",
|
||||
"Cycle": "Unchanged",
|
||||
"Heats": "Unchanged",
|
||||
"Pyrometer": "Unchanged",
|
||||
"Drawing": "Unchanged",
|
||||
"UpperPlate": "Unchanged",
|
||||
"Cooling": "Unchanged",
|
||||
"Vacuum": "Unchanged",
|
||||
"Extraction": "Unchanged",
|
||||
"Options": "Unchanged"
|
||||
},
|
||||
"TC_last": 2532.940840175
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?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>
|
||||
<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>
|
||||
@@ -71,6 +71,9 @@
|
||||
<idParam>80</idParam>
|
||||
<showDelay>true</showDelay>
|
||||
<priority>3</priority>
|
||||
<category>Pyrometer</category>
|
||||
<subCategory_1>Pyrometer</subCategory_1>
|
||||
<subCategory_2></subCategory_2>
|
||||
</block>
|
||||
<block>
|
||||
<id>9</id>
|
||||
@@ -116,6 +119,9 @@
|
||||
<idParam>99</idParam>
|
||||
<showDelay>true</showDelay>
|
||||
<priority>2</priority>
|
||||
<category>Drawing</category>
|
||||
<subCategory_1></subCategory_1>
|
||||
<subCategory_2></subCategory_2>
|
||||
</block>
|
||||
<block>
|
||||
<id>14</id>
|
||||
@@ -152,6 +158,9 @@
|
||||
<idParam>139</idParam>
|
||||
<showDelay>true</showDelay>
|
||||
<priority>4</priority>
|
||||
<category>Cooling</category>
|
||||
<subCategory_1>Pyrometer</subCategory_1>
|
||||
<subCategory_2></subCategory_2>
|
||||
</block>
|
||||
<block>
|
||||
<id>19</id>
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
<xs:element name="priority" type="xs:int" />
|
||||
<xs:element name="scaleFactor" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="numDec" type="xs:int" minOccurs="0" />
|
||||
<xs:element name="category" type="param_type" minOccurs="0" />
|
||||
<xs:element name="subCategory_1" type="xs:string" minOccurs="0" />
|
||||
<xs:element name="subCategory_2" type="xs:string" minOccurs="0" />
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
@@ -23,6 +26,23 @@
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<!-- Head Type -->
|
||||
<xs:simpleType name="param_type" final="restriction">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:enumeration value="General" />
|
||||
<xs:enumeration value="Positions" />
|
||||
<xs:enumeration value="Cycle"/>
|
||||
<xs:enumeration value="Heats"/>
|
||||
<xs:enumeration value="Pyrometer"/>
|
||||
<xs:enumeration value="Drawing"/>
|
||||
<xs:enumeration value="UpperPlate"/>
|
||||
<xs:enumeration value="Cooling"/>
|
||||
<xs:enumeration value="Vacuum"/>
|
||||
<xs:enumeration value="Extraction"/>
|
||||
<xs:enumeration value="Options"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- Language Type -->
|
||||
<xs:complexType name="langType">
|
||||
<xs:simpleContent>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<ncIpAddress>192.168.0.102</ncIpAddress>
|
||||
<ncPort>102</ncPort>
|
||||
<machineModel>Thermo 2020</machineModel>
|
||||
<sharedPath>C:\PartPrg\</sharedPath>
|
||||
<sharedPath>C:\CMS\Recipes\</sharedPath>
|
||||
<sharedName>//PARTPRG:/</sharedName>
|
||||
<installationDate>01/06/2020</installationDate>
|
||||
<mgiOption>false</mgiOption>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<userSoftKeys>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>1</plcId>
|
||||
@@ -17,18 +17,17 @@
|
||||
<active>true</active>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>2</plcId>
|
||||
<plcId>1</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Refresh alarms</lang>
|
||||
<lang langKey="it">Refresh allarmi</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<starred>true</starred>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_toggle>
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>3</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>3</plcId>
|
||||
<localizedNames>
|
||||
@@ -36,11 +35,11 @@
|
||||
<lang langKey="it">Termoregolatori</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_toggle>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_toggle>
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>4</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>4</plcId>
|
||||
<localizedNames>
|
||||
@@ -48,11 +47,11 @@
|
||||
<lang langKey="it">Portellone frontale</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_toggle>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_toggle>
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>5</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>5</plcId>
|
||||
<localizedNames>
|
||||
@@ -60,12 +59,11 @@
|
||||
<lang langKey="it">Pausa ciclo</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<starred>true</starred>
|
||||
</softKey_toggle>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>6</category>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>6</plcId>
|
||||
<localizedNames>
|
||||
@@ -76,9 +74,9 @@
|
||||
<starred>true</starred>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_toggle>
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>7</plcId>
|
||||
<localizedNames>
|
||||
@@ -87,9 +85,22 @@
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<starred>true</starred>
|
||||
</softKey_toggle>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_toggle>
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>8</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Heaters Back</lang>
|
||||
<lang langKey="it">Riscaldi indietro</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<starred>true</starred>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
@@ -99,47 +110,72 @@
|
||||
<lang langKey="it">Pompe vuoto</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_toggle>
|
||||
<starred>true</starred>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>10</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Last cycle</lang>
|
||||
<lang langKey="it">Ultimo ciclo</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>10</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>11</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">START Cycle</lang>
|
||||
<lang langKey="it">START Ciclo</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>4</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>12</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Reset hours pump 1</lang>
|
||||
<lang langKey="it">Reset contaore pompa 1</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<visible>false</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>1</category>
|
||||
<category>4</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>13</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Reset hours pump 2</lang>
|
||||
<lang langKey="it">Reset contaore pompa 2</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<visible>false</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>1</category>
|
||||
<category>4</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>14</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Reset hours pump 3</lang>
|
||||
<lang langKey="it">Reset contaore pompa 3</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<visible>false</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<category>4</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>15</plcId>
|
||||
<localizedNames>
|
||||
@@ -151,7 +187,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<category>4</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>16</plcId>
|
||||
<localizedNames>
|
||||
@@ -163,7 +199,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>4</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>17</plcId>
|
||||
<localizedNames>
|
||||
@@ -175,7 +211,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>4</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>18</plcId>
|
||||
<localizedNames>
|
||||
@@ -187,7 +223,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>19</plcId>
|
||||
<localizedNames>
|
||||
@@ -199,7 +235,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>20</plcId>
|
||||
<localizedNames>
|
||||
@@ -211,7 +247,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>21</plcId>
|
||||
<localizedNames>
|
||||
@@ -223,7 +259,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
|
||||
<plcId>22</plcId>
|
||||
<localizedNames>
|
||||
@@ -231,11 +267,13 @@
|
||||
<lang langKey="it">Ventose setup</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>cycle_loader_enable</refCallParam>
|
||||
<refCallLabel>cycle_loader_enable_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>23</plcId>
|
||||
<localizedNames>
|
||||
@@ -247,7 +285,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>24</plcId>
|
||||
<localizedNames>
|
||||
@@ -259,7 +297,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>25</plcId>
|
||||
<localizedNames>
|
||||
@@ -271,7 +309,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>26</plcId>
|
||||
<localizedNames>
|
||||
@@ -283,7 +321,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>27</plcId>
|
||||
<localizedNames>
|
||||
@@ -295,7 +333,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>28</plcId>
|
||||
<localizedNames>
|
||||
@@ -307,7 +345,7 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>false</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>29</plcId>
|
||||
<localizedNames>
|
||||
@@ -319,19 +357,21 @@
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>30</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Frame X</lang>
|
||||
<lang langKey="it">Apertura cornice</lang>
|
||||
<lang langKey="it">Larghezza cornice</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>general_sizes_frame_dim_x</refCallParam>
|
||||
<refCallLabel>general_sizes_frame_dim_x_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>31</plcId>
|
||||
<localizedNames>
|
||||
@@ -339,11 +379,13 @@
|
||||
<lang langKey="it">Profondità cornice</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>general_sizes_frame_dim_y</refCallParam>
|
||||
<refCallLabel>general_sizes_frame_dim_y_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>32</plcId>
|
||||
<localizedNames>
|
||||
@@ -351,11 +393,13 @@
|
||||
<lang langKey="it">Larghezza piastrafinestra</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>general_sizes_plate_dim_x</refCallParam>
|
||||
<refCallLabel>general_sizes_plate_dim_x_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>33</plcId>
|
||||
<localizedNames>
|
||||
@@ -363,36 +407,68 @@
|
||||
<lang langKey="it">Profondità piastrafinestra</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>general_sizes_plate_dim_y</refCallParam>
|
||||
<refCallLabel>general_sizes_plate_dim_y_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>2</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>34</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Windowplate Up</lang>
|
||||
<lang langKey="it">Piastrafinestra su</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
</softKey_procedure>
|
||||
|
||||
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>36</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Dashboard Setpoint Plus</lang>
|
||||
<lang langKey="it">Dashboard Setpoint Plus</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>dash_setpoint_plus</refCallParam>
|
||||
<refCallLabel>dash_setpoint_plus_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<softKey_procedure>
|
||||
<active>true</active>
|
||||
<category>7</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<plcId>34</plcId>
|
||||
<plcId>37</plcId>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Preheating cycles</lang>
|
||||
<lang langKey="it">Cicli di preriscaldo</lang>
|
||||
<lang langKey="en">Dashboard Setpoint Minus</lang>
|
||||
<lang langKey="it">Dashboard Setpoint Minus</lang>
|
||||
</localizedNames>
|
||||
<visible>true</visible>
|
||||
<refCallParam>dash_setpoint_minus</refCallParam>
|
||||
<refCallLabel>dash_setpoint_minus_button</refCallLabel>
|
||||
</softKey_procedure>
|
||||
|
||||
<!--
|
||||
<softKey_group>
|
||||
<active>true</active>
|
||||
<category>3</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<localizedNames>
|
||||
<lang langKey="en">Brakes ON/FF:</lang>
|
||||
<lang langKey="it">Freni ON/OFF</lang>
|
||||
</localizedNames>
|
||||
<subKeys>
|
||||
<subKey active="true" plcId="50"> B </subKey>
|
||||
<subKey active="true" plcId="51"> C </subKey>
|
||||
</subKeys>
|
||||
<visible>true</visible>
|
||||
</softKey_group>
|
||||
-->
|
||||
|
||||
<!--softKey_group>
|
||||
<active>true</active>
|
||||
<category>1</category>
|
||||
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
|
||||
<localizedNames>
|
||||
<lang langKey="en">aaa:</lang>
|
||||
<lang langKey="it">aaa</lang>
|
||||
</localizedNames>
|
||||
<subKeys>
|
||||
<subKey active="true" plcId="21"> B </subKey>
|
||||
<subKey active="true" plcId="22"> C </subKey>
|
||||
</subKeys>
|
||||
<visible>true</visible>
|
||||
</softKey_group-->
|
||||
|
||||
|
||||
|
||||
</userSoftKeys>
|
||||
@@ -31,6 +31,8 @@
|
||||
<xs:element name="active" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="visible" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="starred" minOccurs="0" type="xs:boolean"></xs:element>
|
||||
<xs:element name="refCallLabel" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="refCallParam" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="category" type="xs:integer"></xs:element>
|
||||
<xs:element name="operatorConfirmationNeeded" type="xs:boolean"></xs:element>
|
||||
<xs:element name="localizedNames">
|
||||
@@ -66,6 +68,8 @@
|
||||
<xs:element name="active" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="visible" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="starred" minOccurs="0" type="xs:boolean"></xs:element>
|
||||
<xs:element name="refCallLabel" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="refCallParam" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="category" type="xs:integer"></xs:element>
|
||||
<xs:element name="operatorConfirmationNeeded" type="xs:boolean"></xs:element>
|
||||
<xs:element name="localizedNames">
|
||||
@@ -86,6 +90,8 @@
|
||||
<xs:element name="active" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="visible" minOccurs="1" maxOccurs="1" type="xs:boolean"></xs:element>
|
||||
<xs:element name="starred" minOccurs="0" type="xs:boolean"></xs:element>
|
||||
<xs:element name="refCallLabel" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="refCallParam" minOccurs="0" type="xs:string"></xs:element>
|
||||
<xs:element name="category" type="xs:integer"></xs:element>
|
||||
<xs:element name="operatorConfirmationNeeded" type="xs:boolean"></xs:element>
|
||||
<xs:element name="localizedNames">
|
||||
|
||||
@@ -552,17 +552,17 @@
|
||||
"233": 0
|
||||
},
|
||||
"RecipeOverview": {
|
||||
"General": "HasError",
|
||||
"Positions": "HasError",
|
||||
"Cycle": "ChangedOk",
|
||||
"Heats": "ChangedOk",
|
||||
"Pyrometer": "ChangedOk",
|
||||
"Drawing": "ChangedOk",
|
||||
"UpperPlate": "ChangedOk",
|
||||
"Cooling": "HasError",
|
||||
"Vacuum": "ChangedOk",
|
||||
"Extraction": "ChangedOk",
|
||||
"Options": "HasError"
|
||||
"General": "Unchanged",
|
||||
"Positions": "Unchanged",
|
||||
"Cycle": "Unchanged",
|
||||
"Heats": "Unchanged",
|
||||
"Pyrometer": "Unchanged",
|
||||
"Drawing": "Unchanged",
|
||||
"UpperPlate": "Unchanged",
|
||||
"Cooling": "Unchanged",
|
||||
"Vacuum": "Unchanged",
|
||||
"Extraction": "Unchanged",
|
||||
"Options": "Unchanged"
|
||||
},
|
||||
"TC_last": 2532.940840175
|
||||
}
|
||||
@@ -51,10 +51,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,47 @@ 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";
|
||||
default:
|
||||
return "REAL";
|
||||
}
|
||||
}
|
||||
|
||||
#region Read config from file from configuration
|
||||
|
||||
@@ -518,6 +560,8 @@ namespace Thermo.Active.Config
|
||||
IsActive = Convert.ToBoolean(x.Element("active").Value),
|
||||
IsVisible = Convert.ToBoolean(x.Element("visible").Value),
|
||||
IsStarred = x.Element("starred") != null ? Convert.ToBoolean(x.Element("starred").Value) : false,
|
||||
RefCallLabel = x.Element("refCallLabel") != null ? x.Element("refCallLabel").Value : "",
|
||||
RefCallParam = x.Element("refCallParam") != null ? x.Element("refCallParam").Value : "",
|
||||
Category = Convert.ToInt32(x.Element("category").Value),
|
||||
LocalizedNames = x.Element("localizedNames").Elements().ToDictionary( // Read localized names and convert into a dictionary
|
||||
y => y.Attribute("langKey").Value, y => y.Value
|
||||
@@ -626,7 +670,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();
|
||||
}
|
||||
@@ -652,7 +695,10 @@ namespace Thermo.Active.Config
|
||||
Priority = Convert.ToInt16(x.Element("priority").Value),
|
||||
// attributi presi da default se NON presenti...
|
||||
ScaleFactor = x.Element("scaleFactor") != null ? Convert.ToInt16(x.Element("scaleFactor").Value) : 1000,
|
||||
NumDec = x.Element("numDec") != null ? Convert.ToInt16(x.Element("numDec").Value) : 1
|
||||
NumDec = x.Element("numDec") != null ? Convert.ToInt16(x.Element("numDec").Value) : 1,
|
||||
Category = x.Element("category") != null ? x.Element("category").Value : "",
|
||||
SubCategory_1 = x.Element("subCategory_1") != null ? x.Element("subCategory_1").Value : "",
|
||||
SubCategory_2 = x.Element("subCategory_2") != null ? x.Element("subCategory_2").Value : ""
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
@@ -760,13 +806,14 @@ namespace Thermo.Active.Config
|
||||
SetpointThermo = 0,
|
||||
MaxPower = riferimento.Potenza,
|
||||
NumResist = 1,
|
||||
CalcIchMin = riferimento.Modello.Contains("Quarzo") || riferimento.Modello.Contains("Alogena")
|
||||
// 2020.07.27 applicato x tutti
|
||||
CalcIchMin = true //riferimento.Modello.Contains("Quarzo") || riferimento.Modello.Contains("Alogena")
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
chanFound.NumResist += 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
chanFound.NumResist += 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -88,7 +91,7 @@
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Config\userSoftKeyConfig.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<SubType>Designer</SubType>
|
||||
</Content>
|
||||
<EmbeddedResource Include="Config\userSoftKeyConfigValidator.xsd">
|
||||
@@ -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>
|
||||
|
||||
@@ -318,16 +318,8 @@ public static class ThreadsFunctions
|
||||
ManageLibraryError(libraryError);
|
||||
else
|
||||
{
|
||||
libraryError = ncAdapter.GetM155Data(out List<DTOM155InputModel> m155Data);
|
||||
if (libraryError.errorCode != 0)
|
||||
ManageLibraryError(libraryError);
|
||||
else
|
||||
{
|
||||
// Send processes through signalR
|
||||
MessageServices.Current.Publish(SEND_PROCESSES_DATA, null, processesPPData);
|
||||
// Send m155 through signalR
|
||||
MessageServices.Current.Publish(SEND_M155_DATA, null, m155Data);
|
||||
}
|
||||
// Send processes through signalR
|
||||
MessageServices.Current.Publish(SEND_PROCESSES_DATA, null, processesPPData);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -818,8 +810,6 @@ public static class ThreadsFunctions
|
||||
|
||||
MessageServices.Current.Publish(SEND_THERMO_RECIPE_FULL, null, currRecipe);
|
||||
|
||||
// FIXME TODO verificare come ridurre chiamate
|
||||
|
||||
// ora gestisco la overview!
|
||||
libraryError = ncAdapter.GetRecipeOverview(out Dictionary<RecipeSection, RecipeCatStatus> currOverview);
|
||||
if (libraryError.IsError())
|
||||
@@ -967,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();
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Thermo.Active.Core
|
||||
ThreadsFunctions.ReadAlarms,
|
||||
ThreadsFunctions.ReadPowerOnData,
|
||||
ThreadsFunctions.StatThread,
|
||||
//ThreadsFunctions.ReadProcessesPPStatus,
|
||||
ThreadsFunctions.ReadProcessesPPStatus,
|
||||
ThreadsFunctions.ReadEnabledFunctionality,
|
||||
ThreadsFunctions.ReadExpiredMaintenances,
|
||||
//ThreadsFunctions.ReadAxesPositionsData,
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -67,8 +67,9 @@ namespace Thermo.Active.Database.Controllers
|
||||
/// <param name="VacuumReadVal"></param>
|
||||
/// <param name="MouldEnergyOUT"></param>
|
||||
/// <param name="MouldEnergyIN"></param>
|
||||
/// <param name="IsScrap"></param>
|
||||
/// <returns></returns>
|
||||
public ProdInfoModel Create(short NumTarget, short NumDone, int TimeWarm, int TimeVent, int TimeVacuum, int TimeCycleGross, int TimeCycleNet, double MaterialTempEndWarm, double MaterialTempEndVent, double MoldTemp, double VacuumReadVal, double MouldEnergyOUT, double MouldEnergyIN)
|
||||
public ProdInfoModel Create(short NumTarget, short NumDone, int TimeWarm, int TimeVent, int TimeVacuum, int TimeCycleGross, int TimeCycleNet, double MaterialTempEndWarm, double MaterialTempEndVent, double MoldTemp, double VacuumReadVal, double MouldEnergyOUT, double MouldEnergyIN, bool IsScrap)
|
||||
{
|
||||
// Create database machine model
|
||||
ProdInfoModel prodData = new ProdInfoModel()
|
||||
@@ -86,7 +87,8 @@ namespace Thermo.Active.Database.Controllers
|
||||
MoldTemp = MoldTemp,
|
||||
VacuumReadVal = VacuumReadVal,
|
||||
MouldEnergyOUT = MouldEnergyOUT,
|
||||
MouldEnergyIN = MouldEnergyIN
|
||||
MouldEnergyIN = MouldEnergyIN,
|
||||
IsScrap = IsScrap
|
||||
};
|
||||
try
|
||||
{
|
||||
@@ -100,6 +102,33 @@ namespace Thermo.Active.Database.Controllers
|
||||
|
||||
return prodData;
|
||||
}
|
||||
/// <summary>
|
||||
/// Process table and set as scrap by num value
|
||||
/// </summary>
|
||||
/// <param name="maxKeep"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetScrap(int num, bool isScrap)
|
||||
{
|
||||
bool answ = false;
|
||||
|
||||
var currRecord = dbCtx
|
||||
.ProdInfo
|
||||
.Where(x => x.NumDone == num)
|
||||
.SingleOrDefault();
|
||||
try
|
||||
{
|
||||
if (currRecord != null)
|
||||
{
|
||||
currRecord.IsScrap = isScrap;
|
||||
}
|
||||
// save!
|
||||
dbCtx.SaveChanges();
|
||||
answ = true;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Process table and keep only maxKeep most recent ones
|
||||
|
||||
@@ -46,6 +46,8 @@ namespace Thermo.Active.Database.Controllers
|
||||
Id = softKey.Id,
|
||||
Category = softKey.Category,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
RefCallLabel = softKey.RefCallLabel,
|
||||
RefCallParam = softKey.RefCallParam,
|
||||
Type = softKey.Type,
|
||||
SubKeys = tmpSubKey
|
||||
});
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// <auto-generated />
|
||||
namespace Thermo.Active.Database.Migrations
|
||||
{
|
||||
using System.CodeDom.Compiler;
|
||||
using System.Data.Entity.Migrations;
|
||||
using System.Data.Entity.Migrations.Infrastructure;
|
||||
using System.Resources;
|
||||
|
||||
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
|
||||
public sealed partial class AddedScrapPartMgmt : IMigrationMetadata
|
||||
{
|
||||
private readonly ResourceManager Resources = new ResourceManager(typeof(AddedScrapPartMgmt));
|
||||
|
||||
string IMigrationMetadata.Id
|
||||
{
|
||||
get { return "202009021558544_AddedScrapPartMgmt"; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Source
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Target
|
||||
{
|
||||
get { return Resources.GetString("Target"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace Thermo.Active.Database.Migrations
|
||||
{
|
||||
using System;
|
||||
using System.Data.Entity.Migrations;
|
||||
|
||||
public partial class AddedScrapPartMgmt : DbMigration
|
||||
{
|
||||
public override void Up()
|
||||
{
|
||||
AddColumn("dbo.ProdInfo", "IsScrap", c => c.Boolean(nullable: false));
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{
|
||||
DropColumn("dbo.ProdInfo", "IsScrap");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -131,6 +131,10 @@
|
||||
<Compile Include="Migrations\202006170558519_AddedProdInfoModel.Designer.cs">
|
||||
<DependentUpon>202006170558519_AddedProdInfoModel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\202009021558544_AddedScrapPartMgmt.cs" />
|
||||
<Compile Include="Migrations\202009021558544_AddedScrapPartMgmt.Designer.cs">
|
||||
<DependentUpon>202009021558544_AddedScrapPartMgmt.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\Configuration.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Redis\redUtil.cs" />
|
||||
@@ -173,6 +177,9 @@
|
||||
<EmbeddedResource Include="Migrations\202006170558519_AddedProdInfoModel.resx">
|
||||
<DependentUpon>202006170558519_AddedProdInfoModel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Migrations\202009021558544_AddedScrapPartMgmt.resx">
|
||||
<DependentUpon>202009021558544_AddedScrapPartMgmt.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -14,5 +14,8 @@ namespace Thermo.Active.Model.ConfigModels
|
||||
public int Priority { get; set; }
|
||||
public int ScaleFactor { get; set; } = 1000;
|
||||
public int NumDec { get; set; } = 1;
|
||||
public string Category { get; set; }
|
||||
public string SubCategory_1 { get; set; }
|
||||
public string SubCategory_2 { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ namespace Thermo.Active.Model.ConfigModels
|
||||
public bool IsActive { get; set; }
|
||||
public bool IsVisible { get; set; }
|
||||
public bool IsStarred { get; set; } = false;
|
||||
public string RefCallParam { get; set; } = "";
|
||||
public string RefCallLabel { get; set; } = "";
|
||||
public bool OperatorConfirmationNeeded { get; set; }
|
||||
public List<SubKeysModel> SubKeys { get; set; }
|
||||
public int PlcId { 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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,11 +82,11 @@ namespace Thermo.Active.Model.DTOModels
|
||||
if (WorkOverride != item.WorkOverride)
|
||||
return false;
|
||||
|
||||
if (offsetData.RealLength != item.offsetData.RealLength)
|
||||
return false;
|
||||
//if (offsetData.RealLength != item.offsetData.RealLength)
|
||||
// return false;
|
||||
|
||||
if (offsetData.RealRadius != item.offsetData.RealRadius)
|
||||
return false;
|
||||
//if (offsetData.RealRadius != item.offsetData.RealRadius)
|
||||
// return false;
|
||||
|
||||
if (FeedOverride != item.FeedOverride)
|
||||
return false;
|
||||
|
||||
@@ -8,6 +8,8 @@ namespace Thermo.Active.Model.DTOModels
|
||||
public int Id { get; set; }
|
||||
public int Category { get; set; }
|
||||
public bool OperatorConfirmationNeeded { get; set; }
|
||||
public string RefCallParam { get; set; } = "";
|
||||
public string RefCallLabel { get; set; } = "";
|
||||
public SOFTKEY_TYPE Type { get; set; }
|
||||
public Dictionary<int, string> SubKeys { get; set; }
|
||||
}
|
||||
@@ -20,6 +22,9 @@ namespace Thermo.Active.Model.DTOModels
|
||||
public bool Visible { get; set; }
|
||||
public bool Starred { get; set; } = false;
|
||||
public bool Value { get; set; }
|
||||
public bool OperatorConfirmationNeeded { get; set; }
|
||||
public string RefCallParam { get; set; } = "";
|
||||
public string RefCallLabel { get; set; } = "";
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
@@ -34,6 +39,12 @@ namespace Thermo.Active.Model.DTOModels
|
||||
return false;
|
||||
if (Value != item.Value)
|
||||
return false;
|
||||
if (OperatorConfirmationNeeded != item.OperatorConfirmationNeeded)
|
||||
return false;
|
||||
if (RefCallParam != item.RefCallParam)
|
||||
return false;
|
||||
if (RefCallLabel != item.RefCallLabel)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -43,4 +54,5 @@ namespace Thermo.Active.Model.DTOModels
|
||||
return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@ namespace Thermo.Active.Model.DTOModels.ThModules
|
||||
public bool Running { get; set; } = false;
|
||||
public bool HasError { get; set; } = false;
|
||||
public bool Terminated { get; set; } = false;
|
||||
public string Category { get; set; } = "";
|
||||
public string SubCategory_1 { get; set; } = "";
|
||||
public string SubCategory_2 { get; set; } = "";
|
||||
|
||||
|
||||
public override bool Equals(object obj)
|
||||
@@ -67,6 +70,12 @@ namespace Thermo.Active.Model.DTOModels.ThModules
|
||||
return false;
|
||||
if (Terminated != item.Terminated)
|
||||
return false;
|
||||
if (Category != item.Category)
|
||||
return false;
|
||||
if (SubCategory_1 != item.SubCategory_1)
|
||||
return false;
|
||||
if (SubCategory_2 != item.SubCategory_2)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Thermo.Active.Model.DTOModels.ThProd
|
||||
public double VacuumReadVal { get; set; } = 0;
|
||||
public double MouldEnergyOUT { get; set; } = 0;
|
||||
public double MouldEnergyIN { get; set; } = 0;
|
||||
public bool IsScrap { get; set; } = false;
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
@@ -60,6 +61,8 @@ namespace Thermo.Active.Model.DTOModels.ThProd
|
||||
return false;
|
||||
if (MouldEnergyIN != item.MouldEnergyIN)
|
||||
return false;
|
||||
if (IsScrap != item.IsScrap)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -88,6 +91,7 @@ namespace Thermo.Active.Model.DTOModels.ThProd
|
||||
this.VacuumReadVal = pimRawData.VacuumReadVal;
|
||||
this.MouldEnergyIN = pimRawData.MouldEnergyIN;
|
||||
this.MouldEnergyOUT = pimRawData.MouldEnergyOUT;
|
||||
this.IsScrap = pimRawData.IsScrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ namespace Thermo.Active.Model.DatabaseModels
|
||||
public double MouldEnergyOUT { get; set; }
|
||||
[Column("MouldEnergyIN")]
|
||||
public double MouldEnergyIN { get; set; }
|
||||
[Column("IsScrap")]
|
||||
public bool IsScrap { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" />
|
||||
|
||||
+248
-54
@@ -3,6 +3,7 @@ using CMS_CORE_Library.Models;
|
||||
using CMS_CORE_Library.S7Net;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Thermo.Active.Database.Controllers;
|
||||
@@ -53,6 +54,46 @@ namespace Thermo.Active.NC
|
||||
/// </summary>
|
||||
public static LiveData RecipeLiveData = new LiveData();
|
||||
|
||||
/// <summary>
|
||||
/// Max number of param writable as single operation
|
||||
/// </summary>
|
||||
public int nMaxParamWrite
|
||||
{
|
||||
get
|
||||
{
|
||||
int answ = 5;
|
||||
int.TryParse(ConfigurationManager.AppSettings["nMaxParamWrite"], out answ);
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Delay between single param write operation
|
||||
/// </summary>
|
||||
public int delayParamWrite
|
||||
{
|
||||
get
|
||||
{
|
||||
int answ = 5;
|
||||
int.TryParse(ConfigurationManager.AppSettings["delayParamWrite"], out answ);
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Parametro lambda per EWMA smoothing
|
||||
/// </summary>
|
||||
public double ewmaLambda
|
||||
{
|
||||
get
|
||||
{
|
||||
int answ = 50;
|
||||
int.TryParse(ConfigurationManager.AppSettings["ewmaPar100"], out answ);
|
||||
return (double)answ / 100;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public NcAdapter() =>
|
||||
// Choose NC
|
||||
numericalControl = SetNumericalControl();
|
||||
@@ -388,7 +429,7 @@ namespace Thermo.Active.NC
|
||||
}
|
||||
}
|
||||
// se si in questo caso scrivo configurazione attuale...
|
||||
WriteRecipeParams(updtRecipe);
|
||||
WriteRecipeParams(updtRecipe, nMaxParamWrite, delayParamWrite);
|
||||
// Ack !
|
||||
libraryError = numericalControl.PLC_WAckConfRecipeRequest();
|
||||
if (libraryError.IsError())
|
||||
@@ -636,6 +677,7 @@ namespace Thermo.Active.NC
|
||||
}
|
||||
}
|
||||
|
||||
#if false
|
||||
// Read selected axes
|
||||
libraryError = numericalControl.AXES_RSelectedAxis(ref processesData.SelectedAxis);
|
||||
if (libraryError.IsError())
|
||||
@@ -677,7 +719,8 @@ namespace Thermo.Active.NC
|
||||
// Measure
|
||||
processesData.UnitMeasure = UMeas;
|
||||
|
||||
processesData.FeedOverride = selectedData.FeedOverride;
|
||||
processesData.FeedOverride = selectedData.FeedOverride;
|
||||
#endif
|
||||
|
||||
return libraryError;
|
||||
}
|
||||
@@ -1011,6 +1054,9 @@ namespace Thermo.Active.NC
|
||||
Id = subkey.Id,
|
||||
Active = plcSoftKey.Active,
|
||||
Starred = softKey.IsStarred,
|
||||
RefCallParam = softKey.RefCallParam,
|
||||
RefCallLabel = softKey.RefCallLabel,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Category = softKey.Category,
|
||||
Value = plcSoftKey.Value
|
||||
});
|
||||
@@ -1020,6 +1066,7 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
Id = softKey.Id,
|
||||
Category = softKey.Category,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Visible = softKey.IsVisible
|
||||
});
|
||||
}
|
||||
@@ -1032,6 +1079,9 @@ namespace Thermo.Active.NC
|
||||
Id = softKey.Id,
|
||||
Active = plcSoftKey.Active,
|
||||
Starred = softKey.IsStarred,
|
||||
RefCallParam = softKey.RefCallParam,
|
||||
RefCallLabel = softKey.RefCallLabel,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Category = softKey.Category,
|
||||
Visible = softKey.IsVisible,
|
||||
Value = plcSoftKey.Value
|
||||
@@ -1071,6 +1121,9 @@ namespace Thermo.Active.NC
|
||||
Id = subkey.Id,
|
||||
Active = plcSoftKey.Active,
|
||||
Starred = softKey.IsStarred,
|
||||
RefCallParam = softKey.RefCallParam,
|
||||
RefCallLabel = softKey.RefCallLabel,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Category = softKey.Category,
|
||||
Value = plcSoftKey.Value
|
||||
});
|
||||
@@ -1083,6 +1136,7 @@ namespace Thermo.Active.NC
|
||||
{
|
||||
Id = softKey.Id,
|
||||
Category = softKey.Category,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Visible = softKey.IsVisible
|
||||
});
|
||||
}
|
||||
@@ -1098,6 +1152,9 @@ namespace Thermo.Active.NC
|
||||
Id = softKey.Id,
|
||||
Active = plcSoftKey.Active,
|
||||
Starred = softKey.IsStarred,
|
||||
RefCallParam = softKey.RefCallParam,
|
||||
RefCallLabel = softKey.RefCallLabel,
|
||||
OperatorConfirmationNeeded = softKey.OperatorConfirmationNeeded,
|
||||
Category = softKey.Category,
|
||||
Visible = softKey.IsVisible,
|
||||
Value = plcSoftKey.Value
|
||||
@@ -1127,6 +1184,9 @@ namespace Thermo.Active.NC
|
||||
// Get current head config
|
||||
var configuredHead = HeadsConfig.Find(x => x.Id == head.Id);
|
||||
// Create different model according on type
|
||||
|
||||
// 2020.08.27 update core.library ha sminchionato --> commentato!
|
||||
#if false
|
||||
switch (configuredHead.Type)
|
||||
{
|
||||
case HEAD_TYPE.SPINDLE:
|
||||
@@ -1174,7 +1234,8 @@ namespace Thermo.Active.NC
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return libraryError;
|
||||
@@ -1209,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();
|
||||
|
||||
var buttons = inp.Buttons?.ToDictionary(x => x.Key, x => x.Key.ToString());
|
||||
if (inp != null)
|
||||
{
|
||||
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);
|
||||
@@ -1364,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)
|
||||
@@ -1379,8 +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);
|
||||
//currentProdPanel.StimaDurata = Math.Round((currentProdPanel.NumTarget - currentProdPanel.NumDone) * currentProdPanel.LastTCiclo, 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;
|
||||
}
|
||||
@@ -1423,31 +1548,6 @@ namespace Thermo.Active.NC
|
||||
numTcOk++;
|
||||
}
|
||||
}
|
||||
#if DEBUG
|
||||
|
||||
// creo una perturubazione...
|
||||
var rand = new Random();
|
||||
int slope = TS_TC.Count / 2;
|
||||
Dictionary<int, double> origTcData = new Dictionary<int, double>();
|
||||
foreach (var item2fix in TS_TC)
|
||||
{
|
||||
origTcData.Add(item2fix.Key, item2fix.Value);
|
||||
}
|
||||
foreach (var origVal in origTcData)
|
||||
{
|
||||
TS_TC[origVal.Key] = Math.Round(origVal.Value + (rand.NextDouble() * 20 - 10) + slope, 2);
|
||||
slope--;
|
||||
if (TS_Cad.ContainsKey(origVal.Key))
|
||||
{
|
||||
TS_Cad[origVal.Key] = Math.Round((double)3600 / TS_TC[origVal.Key], 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
TS_Cad.Add(origVal.Key, Math.Round((double)3600 / TS_TC[origVal.Key], 2));
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
// accodo!
|
||||
currentProdPanel.TS_Cadenza = TS_Cad;
|
||||
currentProdPanel.TS_TCiclo = TS_TC;
|
||||
@@ -1460,6 +1560,7 @@ namespace Thermo.Active.NC
|
||||
try
|
||||
{
|
||||
currentProdPanel.InizioProd = prodInfoFirst.FirstOrDefault().DtEvent;
|
||||
lottoStart = currentProdPanel.InizioProd;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
@@ -1478,7 +1579,7 @@ namespace Thermo.Active.NC
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lettura dati ProdInfo
|
||||
/// Lettura dati ProdInfo (LIVE)
|
||||
/// </summary>
|
||||
/// <param name="prodInfoData"></param>
|
||||
/// <returns></returns>
|
||||
@@ -1493,20 +1594,24 @@ namespace Thermo.Active.NC
|
||||
// converto 1:1 dati da ThermoModels.ProdInfoModel --> DTOProdInfo
|
||||
prodInfoData = new DTOProdInfo(prodInfoRawData);
|
||||
|
||||
// 2020.09.02: incremento di 1 il NUMERO dei pezzi, in modo che mostro il pezzo corrente (n=fatti + 1)
|
||||
prodInfoData.NumDone++;
|
||||
|
||||
// if lastProdInfo is missing --> populate!
|
||||
if (lastProdInfoData == null)
|
||||
lastProdInfoData = prodInfoRawData;
|
||||
|
||||
// se ho update OPPURE differenza di lettura..., sennò restituisco ultima lettura...
|
||||
// se ho update da strobe OPPURE differenza di lettura..., sennò restituisco ultima lettura...
|
||||
if (ThermoProdUpdatedStr || (lastProdInfoData.NumDone != prodInfoRawData.NumDone))
|
||||
{
|
||||
// do comparison with old record and if changed --> persist on DB!
|
||||
if (!prodInfoRawData.Equals(lastProdInfoData))
|
||||
{
|
||||
// save on DB!
|
||||
// save on DB! attenzione: RAW DATA perché salvo pezzo PRECEDENTE...
|
||||
using (ProdInfoController prodInfoController = new ProdInfoController())
|
||||
prodInfoController.Create(prodInfoRawData.NumTarget, prodInfoRawData.NumDone, prodInfoRawData.TimeWarm, prodInfoRawData.TimeVent, prodInfoRawData.TimeVacuum, prodInfoRawData.TimeCycleGross, prodInfoRawData.TimeCycleNet, prodInfoRawData.MaterialTempEndWarm, prodInfoRawData.MaterialTempEndVent, prodInfoRawData.MoldTemp, prodInfoRawData.VacuumReadVal, prodInfoRawData.MouldEnergyOUT, prodInfoRawData.MouldEnergyIN);
|
||||
|
||||
{
|
||||
prodInfoController.Create(prodInfoRawData.NumTarget, prodInfoRawData.NumDone, prodInfoRawData.TimeWarm, prodInfoRawData.TimeVent, prodInfoRawData.TimeVacuum, prodInfoRawData.TimeCycleGross, prodInfoRawData.TimeCycleNet, prodInfoRawData.MaterialTempEndWarm, prodInfoRawData.MaterialTempEndVent, prodInfoRawData.MoldTemp, prodInfoRawData.VacuumReadVal, prodInfoRawData.MouldEnergyOUT, prodInfoRawData.MouldEnergyIN, false);
|
||||
}
|
||||
// update last info data
|
||||
lastProdInfoData = prodInfoRawData;
|
||||
|
||||
@@ -1535,15 +1640,16 @@ namespace Thermo.Active.NC
|
||||
lastProdEnd = DateTime.Now;
|
||||
// calcolo ultimo ciclo...
|
||||
var lastDuration = lastProdEnd.Subtract(lastProdStart).TotalSeconds;
|
||||
// se il valore SALVATO è > 3 * valore rilevato (ma NON inferiore a 1/3...) --> uso SOLO ultimo
|
||||
if ((lastCycle > 3 * lastDuration) && (lastCycle / 3 < lastDuration))
|
||||
// se il valore SALVATO è > 3 * valore rilevato --> uso SOLO ultimo
|
||||
if (lastCycle > 3 * lastDuration)
|
||||
{
|
||||
lastCycle = lastDuration;
|
||||
}
|
||||
// altrimenti EWMA 50%
|
||||
// altrimenti EWMA da parametro calcolato standard, default 50%
|
||||
else
|
||||
{
|
||||
lastCycle = 0.5 * lastCycle + 0.5 * lastDuration;
|
||||
//lastCycle = 0.5 * lastCycle + 0.5 * lastDuration;
|
||||
lastCycle = ewmaLambda * lastDuration + (1 - ewmaLambda) * lastCycle;
|
||||
}
|
||||
// salvo anche nei live data della ricetta...
|
||||
RecipeLiveData.TC_last = lastCycle;
|
||||
@@ -1589,26 +1695,45 @@ namespace Thermo.Active.NC
|
||||
MoldTemp = x.MoldTemp,
|
||||
VacuumReadVal = x.VacuumReadVal,
|
||||
MouldEnergyOUT = x.MouldEnergyOUT,
|
||||
MouldEnergyIN = x.MouldEnergyIN
|
||||
MouldEnergyIN = x.MouldEnergyIN,
|
||||
IsScrap = x.IsScrap
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
return libraryError;
|
||||
}
|
||||
/// <summary>
|
||||
/// Get historical prodinfo data from DB
|
||||
/// </summary>
|
||||
/// <param name="num"></param>
|
||||
/// <param name="isScrap"></param>
|
||||
/// <returns></returns>
|
||||
public CmsError SetScrap(int num, bool isScrap)
|
||||
{
|
||||
CmsError libraryError = NO_ERROR;
|
||||
|
||||
using (ProdInfoController prodInfoController = new ProdInfoController())
|
||||
{
|
||||
prodInfoController.SetScrap(num, isScrap);
|
||||
}
|
||||
|
||||
return libraryError;
|
||||
}
|
||||
/// <summary>
|
||||
/// Update requested prod quantity
|
||||
/// </summary>
|
||||
/// <param name="numTarget"></param>
|
||||
/// <param name="newWorkOrder"></param>
|
||||
/// <param name="numTarget">Total qty requested</param>
|
||||
/// <param name="newWorkOrder">Reset counter = new order</param>
|
||||
/// <param name="preWarmCycle">Number of pre-warm cycle requested</param>
|
||||
/// <returns></returns>
|
||||
public CmsError UpdateProdInfoData(short numTarget, bool newWorkOrder)
|
||||
public CmsError UpdateProdInfoData(short numTarget, bool newWorkOrder, short preWarmCycle)
|
||||
{
|
||||
CmsError libraryError = NO_ERROR;
|
||||
|
||||
using (ProdInfoController prodInfoController = new ProdInfoController())
|
||||
{
|
||||
// registro dati aggiornati sul PLC
|
||||
libraryError = numericalControl.PLC_WProdInfo(numTarget, newWorkOrder);
|
||||
libraryError = numericalControl.PLC_WProdInfo(numTarget, newWorkOrder, preWarmCycle);
|
||||
if (libraryError.IsError())
|
||||
return libraryError;
|
||||
|
||||
@@ -1762,9 +1887,11 @@ namespace Thermo.Active.NC
|
||||
/// <summary>
|
||||
/// Recipe Parameters write to PLC (only SetpointHMI)
|
||||
/// </summary>
|
||||
/// <param name="updtRecipe"></param>
|
||||
/// <param name="updtRecipe">Oggetto parametri da aggiornare (from HMI)</param>
|
||||
/// <param name="nMaxParamWrite">num max parametri da scrivere singolarmente</param>
|
||||
/// <param name="delayParamWrite">delay in scriottura multi parametri singoli</param>
|
||||
/// <returns></returns>
|
||||
public CmsError WriteRecipeParametersToPLC(Dictionary<string, DTORecipeParam> updtRecipe)
|
||||
public CmsError WriteRecipeParametersToPLC(Dictionary<string, DTORecipeParam> updtRecipe, int nMaxParamWrite, int delayParamWrite)
|
||||
{
|
||||
Dictionary<int, int> newParameters = new Dictionary<int, int>();
|
||||
// solo x S7...
|
||||
@@ -1776,7 +1903,7 @@ namespace Thermo.Active.NC
|
||||
newParameters.Add(item.Value.Id, (int)(item.Value.SetpointHMI * item.Value.ScaleFactor));
|
||||
}
|
||||
// scrivo!
|
||||
CmsError libraryError = numericalControl.PLC_WRecipeParameters(newParameters);
|
||||
CmsError libraryError = numericalControl.PLC_WRecipeParameters(newParameters, nMaxParamWrite, delayParamWrite);
|
||||
if (libraryError.IsError())
|
||||
return libraryError;
|
||||
}
|
||||
@@ -2246,14 +2373,56 @@ namespace Thermo.Active.NC
|
||||
/// Scrive tutti i parametri della ricetta indicati
|
||||
/// </summary>
|
||||
/// <param name="updtRecipe">Oggetto parametri da aggiornare (from HMI)</param>
|
||||
/// <param name="nMaxParamWrite">num max parametri da scrivere singolarmente</param>
|
||||
/// <param name="delayParamWrite">delay in scriottura multi parametri singoli</param>
|
||||
/// <returns></returns>
|
||||
public CmsError WriteRecipeParams(Dictionary<string, DTORecipeParam> updtRecipe)
|
||||
public CmsError WriteRecipeParams(Dictionary<string, DTORecipeParam> updtRecipe, int nMaxParamWrite, int delayParamWrite)
|
||||
{
|
||||
CmsError libraryError = WriteRecipeParametersToPLC(updtRecipe);
|
||||
CmsError libraryError = WriteRecipeParametersToPLC(updtRecipe, nMaxParamWrite, delayParamWrite);
|
||||
|
||||
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>
|
||||
@@ -2264,6 +2433,7 @@ namespace Thermo.Active.NC
|
||||
CmsError libraryError = NO_ERROR;
|
||||
// overview di base: ultima salvata...
|
||||
currOverview = new Dictionary<RecipeSection, RecipeCatStatus>();
|
||||
var err2fix = new Dictionary<RecipeSection, RecipeCatStatus>();
|
||||
|
||||
// leggo la ricetta dal PLC!
|
||||
var currRecipe = new Dictionary<string, DTORecipeParam>();
|
||||
@@ -2295,6 +2465,7 @@ namespace Thermo.Active.NC
|
||||
currOverview = NcFileAdapter.RecipeLiveData.RecipeOverview;
|
||||
}
|
||||
|
||||
// verifico eventualmente se mancasse qualcosa...
|
||||
bool changed = false;
|
||||
foreach (var item in recipeConfig)
|
||||
{
|
||||
@@ -2304,6 +2475,19 @@ namespace Thermo.Active.NC
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
// ricerco SE co fossero errori --> reset come changedOK
|
||||
foreach (var item in currOverview)
|
||||
{
|
||||
if (item.Value == RecipeCatStatus.HasError)
|
||||
err2fix.Add(item.Key, RecipeCatStatus.ChangedOk);
|
||||
}
|
||||
foreach (var item in err2fix)
|
||||
{
|
||||
currOverview[item.Key] = item.Value;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
// se cambiato --> salvo in live data...
|
||||
if (changed)
|
||||
{
|
||||
@@ -2323,8 +2507,15 @@ namespace Thermo.Active.NC
|
||||
// altrimenti controllo
|
||||
else
|
||||
{
|
||||
// se in errore --> registro...
|
||||
if (currRecipe[item.Label].Status.HasError)
|
||||
// se in errore AND visibile --> registro...
|
||||
bool checkCondition = false;
|
||||
#if DEBUG
|
||||
checkCondition = (currRecipe[item.Label].Status.HasError && currRecipe[item.Label].Status.Visible);
|
||||
#else
|
||||
checkCondition = (currRecipe[item.Label].Status.HasError);
|
||||
#endif
|
||||
// 2020.07.29 - controllo condizione secondo status debug/release...
|
||||
if (checkCondition)
|
||||
{
|
||||
currOverview[getRecipeSection(item.Category)] = RecipeCatStatus.HasError;
|
||||
}
|
||||
@@ -2401,7 +2592,10 @@ namespace Thermo.Active.NC
|
||||
Visible = currModule.Visible,
|
||||
Running = currModule.Running,
|
||||
HasError = currModule.HasError,
|
||||
Terminated = currModule.Terminated
|
||||
Terminated = currModule.Terminated,
|
||||
Category = item.Category,
|
||||
SubCategory_1 = item.SubCategory_1,
|
||||
SubCategory_2 = item.SubCategory_2
|
||||
};
|
||||
currModules.Add(item.Id, currVal);
|
||||
}
|
||||
@@ -2583,7 +2777,7 @@ namespace Thermo.Active.NC
|
||||
// check div0!
|
||||
if (VUMin == 0)
|
||||
{
|
||||
VUMin = 1;
|
||||
VUMin = 230;
|
||||
}
|
||||
|
||||
// processo corrente minima!
|
||||
@@ -2595,7 +2789,7 @@ namespace Thermo.Active.NC
|
||||
minICh = 0;
|
||||
if (item.CalcIchMin)
|
||||
{
|
||||
calcPower = (item.NumResist - 1) + item.MaxPower + item.MaxPower / 2;
|
||||
calcPower = (item.NumResist - 1) * item.MaxPower + item.MaxPower / 2;
|
||||
minICh = (double)calcPower / VUMin;
|
||||
}
|
||||
newFloatTData.Add(item.IdChannel, minICh);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
<add key="enableDirectoryBrowsing" value="true" />
|
||||
<add key="ClientSettingsProvider.ServiceUri" value="" />
|
||||
<add key="ServerServiceName" value="MariaDB" />
|
||||
<add key="nMaxParamWrite" value="5" />
|
||||
<add key="delayParamWrite" value="10" />
|
||||
<add key="ewmaPar100" value="40" />
|
||||
</appSettings>
|
||||
<system.web>
|
||||
<compilation debug="true" targetFramework="4.6.2" />
|
||||
@@ -108,7 +111,7 @@
|
||||
<add name="SignalR-Bus" />
|
||||
</listeners>
|
||||
</source>
|
||||
<source name="SignalR.Transports.WebSocketTransport">
|
||||
<!-- <source name="SignalR.Transports.WebSocketTransport">
|
||||
<listeners>
|
||||
<add name="SignalR-Transports" />
|
||||
</listeners>
|
||||
@@ -132,7 +135,7 @@
|
||||
<listeners>
|
||||
<add name="SignalR-Transports" />
|
||||
</listeners>
|
||||
</source>
|
||||
</source> -->
|
||||
<source name="SignalR.ReflectedHubDescriptorProvider">
|
||||
<listeners>
|
||||
<add name="SignalR-Init" />
|
||||
@@ -146,7 +149,7 @@
|
||||
<!-- Specifies the trace writer for output -->
|
||||
<sharedListeners>
|
||||
<!-- Listener for transport events -->
|
||||
<add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="logs/transports.log" />
|
||||
<!--<add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="logs/transports.log" />-->
|
||||
<!-- Listener for scaleout provider events -->
|
||||
<add name="SignalR-Bus" type="System.Diagnostics.TextWriterTraceListener" initializeData="logs/bus.log" />
|
||||
<!-- Listener for hub discovery events -->
|
||||
|
||||
@@ -172,6 +172,7 @@ namespace Thermo.Active.Controllers.SignalR
|
||||
throw new HubException(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
#if false
|
||||
[SignalRAuthorize(FunctionAccess = GENERAL, Action = ACTIONS.WRITE)]
|
||||
public void WriteM155Response(int process, double responseVal)
|
||||
{
|
||||
@@ -179,6 +180,20 @@ namespace Thermo.Active.Controllers.SignalR
|
||||
CmsError libraryError = ncAdapter.WriteM155Data(process, responseVal);
|
||||
if (libraryError.IsError())
|
||||
throw new HubException(libraryError.localizationKey);
|
||||
}
|
||||
#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)]
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
}
|
||||
#if true
|
||||
/// <summary>
|
||||
/// Request mode AUTO
|
||||
/// </summary>
|
||||
@@ -71,7 +72,8 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/// <summary>
|
||||
/// Request mode SETUP
|
||||
/// </summary>
|
||||
@@ -100,9 +102,42 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
return Ok();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Set item as scrap
|
||||
/// </summary>
|
||||
/// <param name="num">item NUM</param>
|
||||
/// <param name="isScrap">scrap flag (true/false)</param>
|
||||
/// <returns></returns>
|
||||
[Route("setScrap"), HttpPut]
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
public IHttpActionResult SetScrap(int num, bool isScrap)
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"NC Not connected! | SetScrap | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// scrivo sul DB che il pezzo è SCRAPPED
|
||||
libraryError = ncAdapter.SetScrap(num, isScrap);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"SetScrap error | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request start production
|
||||
/// </summary>
|
||||
/// <param name="requestQty">item NUM</param>
|
||||
/// <param name="newWorkOrder">scrap flag (true/false)</param>
|
||||
/// <returns></returns>
|
||||
[Route("start"), HttpPut]
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
@@ -116,19 +151,73 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// scrivo sul PLC il comando strobe richiesta AUTO!
|
||||
libraryError = ncAdapter.UpdateProdInfoData((short)requestQty, newWorkOrder);
|
||||
// legacy method
|
||||
short numCicliRisc = 0;
|
||||
|
||||
// scrivo sul PLC pezzi richiesti, cicli riscaldo + comando strobe reset se encessario!
|
||||
libraryError = ncAdapter.UpdateProdInfoData((short)requestQty, newWorkOrder, numCicliRisc);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"StartProd error | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
// se new workorder --> registro nuova data lorro!
|
||||
// se new workorder --> registro nuova data x start lotto!
|
||||
if (newWorkOrder)
|
||||
{
|
||||
ncAdapter.lottoStart = DateTime.Now;
|
||||
}
|
||||
|
||||
// scrivo sul PLC il comando strobe richiesta AUTO!
|
||||
libraryError = ncAdapter.StrobeMode(Mode.AUTO);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"RequestAuto error | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
}
|
||||
/// <summary>
|
||||
/// Request start production
|
||||
/// </summary>
|
||||
/// <param name="requestQty">item NUM</param>
|
||||
/// <param name="newWorkOrder">scrap flag (true/false)</param>
|
||||
/// <param name="numCicliRisc">warmup cycle requested (0=none)</param>
|
||||
/// <returns></returns>
|
||||
[Route("startFull"), HttpPut]
|
||||
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
|
||||
public IHttpActionResult StartProdFull(int requestQty, bool newWorkOrder, int numCicliRisc)
|
||||
{
|
||||
// Try connection
|
||||
CmsError libraryError = ncAdapter.Connect();
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"NC Not connected! | StartProd | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// scrivo sul PLC pezzi richiesti, cicli riscaldo + comando strobe reset se encessario!
|
||||
libraryError = ncAdapter.UpdateProdInfoData((short)requestQty, newWorkOrder, (short)numCicliRisc);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"StartProd error | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
// se new workorder --> registro nuova data x start lotto!
|
||||
if (newWorkOrder)
|
||||
{
|
||||
ncAdapter.lottoStart = DateTime.Now;
|
||||
}
|
||||
|
||||
// scrivo sul PLC il comando strobe richiesta AUTO!
|
||||
libraryError = ncAdapter.StrobeMode(Mode.AUTO);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"RequestAuto error | {libraryError.exception}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// ritorno solo fatto!
|
||||
return Ok();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using CMS_CORE_Library.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
@@ -69,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)]
|
||||
@@ -76,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();
|
||||
@@ -118,8 +129,10 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
|
||||
if (updtRecipe.Count > 0)
|
||||
{
|
||||
// scrivo sul PLC
|
||||
ncAdapter.WriteRecipeParams(updtRecipe);
|
||||
// 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);
|
||||
}
|
||||
|
||||
// ritorno solo fatto!
|
||||
@@ -147,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();
|
||||
@@ -161,21 +174,18 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
libraryError = ncAdapter.ConfirmRecipeData(true);
|
||||
if (libraryError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}");
|
||||
ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}");
|
||||
return BadRequest(libraryError.localizationKey);
|
||||
}
|
||||
|
||||
// SE HO una section != null/empty --> salvo come modificata...
|
||||
if (section != null)
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
NcFileAdapter.upsRecipeOverview(section, RecipeCatStatus.ChangedOk);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
ThermoActiveLogger.LogError($"Error on set recipe overview | section: {section}{Environment.NewLine}{exc}");
|
||||
}
|
||||
NcFileAdapter.upsRecipeOverview(section, RecipeCatStatus.ChangedOk);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
ThermoActiveLogger.LogError($"Error on set recipe overview | section: {section}{Environment.NewLine}{exc}");
|
||||
}
|
||||
|
||||
// recupero i dati LIVE dei parametri HMI della ricetta...
|
||||
@@ -213,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();
|
||||
@@ -233,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}");
|
||||
@@ -269,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())
|
||||
{
|
||||
@@ -332,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...
|
||||
@@ -370,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...
|
||||
@@ -388,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();
|
||||
@@ -428,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>();
|
||||
@@ -436,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
|
||||
@@ -481,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();
|
||||
}
|
||||
|
||||
@@ -502,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))
|
||||
if (!string.IsNullOrEmpty(recipeNotes))
|
||||
{
|
||||
NcFileAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim();
|
||||
}
|
||||
|
||||
bool imageUploaded = false;
|
||||
@@ -547,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();
|
||||
}
|
||||
@@ -569,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();
|
||||
}
|
||||
@@ -606,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))
|
||||
{
|
||||
@@ -624,7 +648,7 @@ namespace Thermo.Active.Controllers.WebApi
|
||||
}
|
||||
|
||||
// write to PLC
|
||||
checkError = ncAdapter.WriteRecipeParams(updtRecipe);
|
||||
checkError = ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite);
|
||||
if (checkError.IsError())
|
||||
{
|
||||
ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeParams error | {checkError.exception}");
|
||||
@@ -634,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();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
mb_DiscesaCZ,CZ↓
|
||||
mb_MembDiscesaZ,Z↓
|
||||
mb_DiscesaCZ,↓ Cornice
|
||||
mb_MembDiscesaZ,↓ Controstampo
|
||||
mb_MembZ,Controstampo
|
||||
mb_Mod_MembSalitaZ,Z↑
|
||||
mb_Mod_AppoggioDiscesaW,W↓
|
||||
mb_Mod_MembSalitaZ,↑ Controstampo
|
||||
mb_Mod_AppoggioDiscesaW,↓ Stampo
|
||||
mb_Mod_RiscaldoInf,Riscaldo inferiore
|
||||
mb_Mod_RiscaldoSup,Riscaldo superiore
|
||||
mb_Mod_PirometroRisc,Pirometro riscaldo
|
||||
mb_Mod_DecompSustain,Decompressione/Sostentamento
|
||||
mb_Mod_Acrilico,Acrilico
|
||||
mb_Mod_RiscaldiIndietro,RS←
|
||||
mb_Mod_RiscaldiIndietro,← Riscaldi
|
||||
mb_Mod_ExtraR,Riscaldo superiore aggiuntivo
|
||||
mb_Mod_Imbutitura,Imbutitura
|
||||
mb_Mod_SalitaW,W↑
|
||||
mb_Mod_SalitaW,↑ Stampo
|
||||
mb_Mod_AttesaStampo,Attesa stampo
|
||||
mb_Mod_Raffreddamento,Raffreddamento
|
||||
mb_Mod_PirometroRaffr,Pirometro raffreddamento
|
||||
@@ -20,24 +20,24 @@ mb_Mod_VuotoDiretto,Vuoto diretto
|
||||
mb_Mod_VuotoAux,Vuoto ausiliario
|
||||
mb_Mod_Nebulizz,Nebulizzatori
|
||||
mb_Mod_AttesaPartenzaZ,Attesa partenza Z
|
||||
mb_Mod_DiscesaZ,Z↓
|
||||
mb_Mod_DiscesaZ,↓ Controstampo
|
||||
mb_Mod_Z,Controstampo basso
|
||||
mb_Mod_SalitaZ,Z↑
|
||||
mb_Mod_SalitaZ,↑ Controstampo
|
||||
mb_Mod_AriaZ,Aria controstampo
|
||||
mb_Mod_VuotoZ,Vuoto controstampo
|
||||
mb_Mod_ScaricoVuotoZ,Scarico vuoto controstampo
|
||||
mb_Mod_ScaricoVuoto,Scarico vuoto
|
||||
mb_Mod_EstrazioneZ,Estrazione controstampo
|
||||
mb_Mod_DiscesaAssistZ,Z↓
|
||||
mb_Mod_DiscesaAssistZ,↓ Controstampo
|
||||
mb_Mod_Estrazione,Estrazione
|
||||
mb_Mod_DiscesaW,W↓
|
||||
mb_Mod_RiscaldiIndietro2,RS←
|
||||
mb_Mod_SalitaCZ,CZ↑
|
||||
mb_Mod_DiscesaW,↓ Stampo
|
||||
mb_Mod_RiscaldiIndietro2,← Riscaldi
|
||||
mb_Mod_SalitaCZ,↑ Cornice
|
||||
mb_Mod_Riscaldi2,Secondo riscaldo
|
||||
mb_Mod_Estrazione_Aux_W,Estrazione ausiliaria
|
||||
mb_Mod_Attesa_Pirometro,Attesa pirometro
|
||||
mb_Mod_Prevuoto,Prevuoto
|
||||
mb_Mod_SalitaAssistZ,Z↑
|
||||
mb_Mod_SalitaAssistZ,↑ Controstampo
|
||||
general_sizes_mould_dim_x,Larghezza stampo
|
||||
general_sizes_mould_dim_y,Profondità stampo
|
||||
general_sizes_mould_max_height,Altezza massima stampo
|
||||
|
||||
@@ -78,10 +78,6 @@ namespace Thermo.Active.Listeners
|
||||
SignalRListener.SendPartProgramQueue(a);
|
||||
SignalRDatabaseHandler.UpdateQueue(a);
|
||||
}));
|
||||
infos.Add(MessageServices.Current.Subscribe(SEND_M155_DATA, (a, b) =>
|
||||
{
|
||||
SignalRListener.SendM155Data(a);
|
||||
}));
|
||||
infos.Add(MessageServices.Current.Subscribe(SEND_SCADA_DATA, (a, b) =>
|
||||
{
|
||||
SignalRListener.SendScadaData(a);
|
||||
@@ -90,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) =>
|
||||
|
||||
@@ -226,6 +226,7 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
}
|
||||
}
|
||||
|
||||
#if false
|
||||
public static void SendM155Data(object data)
|
||||
{
|
||||
List<DTOM155InputModel> dtoM155Data = data as List<DTOM155InputModel>;
|
||||
@@ -236,6 +237,18 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
|
||||
context.Clients.Group("ncData").m155Data(dtoM155Data);
|
||||
}
|
||||
}
|
||||
#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)
|
||||
@@ -453,6 +466,8 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void SetGatewayRebootStatus(object status)
|
||||
{
|
||||
string msg = status.ToString();
|
||||
@@ -512,8 +527,9 @@ namespace Thermo.Active.Listeners.SignalR
|
||||
group.magazineIsActive(LastNcMagazineIsActive);
|
||||
// Send PP Queue
|
||||
group.partProgramQueue(LastPartProgramQueue);
|
||||
// Send m155 data
|
||||
group.m155Data(LastM155Data);
|
||||
// Send m156
|
||||
group.m156Data(LastM156Data);
|
||||
|
||||
// Send Scada
|
||||
group.scadaData(LastScadaData);
|
||||
|
||||
|
||||
@@ -27,7 +27,10 @@ namespace Thermo.Active.Listeners
|
||||
public static DTOActiveProgramDataModel LastProgramData = new DTOActiveProgramDataModel();
|
||||
public static Dictionary<int, bool> LastNcMagazineIsActive = new Dictionary<int, bool>();
|
||||
public static List<DTOQueueModel> LastPartProgramQueue = new List<DTOQueueModel>();
|
||||
public static List<DTOM155InputModel> LastM155Data = new List<DTOM155InputModel>();
|
||||
#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.9.46")]
|
||||
[assembly: AssemblyVersion("0.14.80")]
|
||||
@@ -0,0 +1,81 @@
|
||||
# Script di installazione in macchina zip dell'ultima release di ThermoActive
|
||||
|
||||
# Check parameters
|
||||
Param (
|
||||
[Parameter(Mandatory=$True)]
|
||||
[ValidateNotNull()]
|
||||
$zipPath
|
||||
)
|
||||
|
||||
# recupera timestamp x logging
|
||||
function Get-TimeStamp
|
||||
{
|
||||
return "[{0:MM/dd/yy} {0:HH:mm:ss}]" -f (Get-Date)
|
||||
}
|
||||
# registra log!
|
||||
function DoLog($txt2log)
|
||||
{
|
||||
Write-Output "$(Get-TimeStamp) $txt2log" | Out-File c:\tmp\Script.log -Append
|
||||
}
|
||||
|
||||
function checkFolder($dirPath)
|
||||
{
|
||||
if(!(Test-Path -path $dirPath))
|
||||
{
|
||||
New-Item -ItemType directory -Path $dirPath
|
||||
DoLog("Folder path has been created successfully at $dirPath")
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output "-------------------------------- START script --------------------------------" | Out-File c:\tmp\Script.log
|
||||
$StopWatch = New-Object System.Diagnostics.Stopwatch
|
||||
$StopWatch.Start()
|
||||
|
||||
# directory di base
|
||||
$BaseDir = "C:\CMS"
|
||||
$ArchiveDir = "$BaseDir\Archive"
|
||||
$BackupDir = "$BaseDir\Backup"
|
||||
$ConfDir = "$BaseDir\Conf"
|
||||
$LogDir = "$BaseDir\Logs"
|
||||
$UnzipDir = "$BaseDir\Unzip"
|
||||
$ProgramDir = "$BaseDir\ThermoActive"
|
||||
|
||||
$adesso = Get-Date -Format "yyyy.MM.dd_HH.mm"
|
||||
|
||||
# mi sposto in Dir di base
|
||||
cd $BaseDir
|
||||
|
||||
# creo se non ci fosse dir varie
|
||||
checkFolder($BaseDir)
|
||||
checkFolder($ArchiveDir)
|
||||
checkFolder($BackupDir)
|
||||
checkFolder($ConfDir)
|
||||
checkFolder($LogDir)
|
||||
checkFolder($UnzipDir)
|
||||
checkFolder($ProgramDir)
|
||||
|
||||
# Salvo CONF varie
|
||||
robocopy $ProgramDir"\Config\" $BackupDir"\Config\" /MIR /Z /LOG:$LogDir"\Config.1.log"
|
||||
robocopy $ProgramDir"\Dict\" $BackupDir"\Dict\" /MIR /Z /LOG:$LogDir"\Dict.1.log"
|
||||
robocopy $ProgramDir"\Recipes\" $BackupDir"\Recipes\" /MIR /Z /LOG:$LogDir"\Recipes.1.log"
|
||||
robocopy $ProgramDir"\TMP\" $BackupDir"\TMP\" /MIR /Z /LOG:$LogDir"\Tmp.1.log"
|
||||
|
||||
# Move versione attuale
|
||||
Move-Item -Path $ProgramDir -Destination $ArchiveDir"\ThermoActive_$adesso"
|
||||
|
||||
# Faccio unzip NUOVA versione
|
||||
Expand-Archive -Path $zipPath -DestinationPath $UnzipDir -Force
|
||||
|
||||
# Move da ZIP a program
|
||||
Move-Item -Path $UnzipDir -Destination $ProgramDir
|
||||
#robocopy $UnzipDir $ProgramDir /MIR /Z /LOG:$LogDir+"Newversion.log" /XD "Config Dict Recipes"
|
||||
|
||||
# Ripristino CONF
|
||||
robocopy $BackupDir"\Config\" $ProgramDir"\Config\" /MIR /Z /LOG:$LogDir"\Config.2.log"
|
||||
robocopy $BackupDir"\Dict\" $ProgramDir"\Dict\" /MIR /Z /LOG:$LogDir"\Dict.2.log"
|
||||
robocopy $BackupDir"\Recipes\" $ProgramDir"\Recipes\" /MIR /Z /LOG:$LogDir"\Recipes.2.log"
|
||||
robocopy $BackupDir"\TMP\" $ProgramDir"\TMP\" /MIR /Z /LOG:$LogDir"\Tmp.2.log"
|
||||
|
||||
$StopWatch.Stop()
|
||||
$StopWatch.Elapsed | Out-File $LogDir"\Install.log" -Append
|
||||
DoLog("-------------------------------- END script --------------------------------")
|
||||
@@ -11,7 +11,8 @@ Param (
|
||||
$npmInstall,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[ValidateNotNull()]
|
||||
$npmBuild,[Parameter(Mandatory=$True)]
|
||||
$npmBuild,
|
||||
[Parameter(Mandatory=$True)]
|
||||
[ValidateNotNull()]
|
||||
$version
|
||||
)
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 962 B |
@@ -337,6 +337,8 @@ button.soft {
|
||||
.togglebutton {
|
||||
vertical-align: middle;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.togglebutton,
|
||||
@@ -374,6 +376,11 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
.togglebutton label .toggle {
|
||||
text-align: left;
|
||||
margin-left: 5px;
|
||||
|
||||
&.error {
|
||||
background-color: rgba(255, 0, 0, .7);
|
||||
color: #222;
|
||||
}
|
||||
}
|
||||
|
||||
.togglebutton label .toggle,
|
||||
@@ -432,18 +439,19 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.togglebutton.big {
|
||||
.togglebutton.big,
|
||||
.togglebutton.big[disabled] {
|
||||
span.toggle {
|
||||
height: 40px;
|
||||
width: 112px;
|
||||
border-radius: 20px;
|
||||
font-size: 17px;
|
||||
line-height: 40px;
|
||||
font-weight: bold;
|
||||
height: 40px !important;
|
||||
width: 112px !important;
|
||||
border-radius: 20px !important;
|
||||
font-size: 17px !important;
|
||||
line-height: 40px !important;
|
||||
font-weight: bold !important;
|
||||
|
||||
&:after {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
width: 36px !important;
|
||||
height: 36px !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
width: 100%;
|
||||
background-image: url("../../assets/icons/png/bg.png");
|
||||
position: fixed;
|
||||
z-index: 1001;
|
||||
z-index: 1002;
|
||||
display: grid;
|
||||
grid-template-rows: 144px 1fr;
|
||||
grid-template-columns: 152px 1fr 610px 1fr 152px;
|
||||
|
||||
@@ -143,6 +143,60 @@
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.context-menu {
|
||||
position: relative;
|
||||
|
||||
.context-area {
|
||||
top: 50px;
|
||||
display: none;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
||||
position: absolute;
|
||||
width: 300px;
|
||||
left: -150px + 24px;
|
||||
padding-inline-start: 0;
|
||||
padding-inline-end: 0;
|
||||
|
||||
|
||||
&.show {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
li {
|
||||
list-style-type: none;
|
||||
height: 62px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.5);
|
||||
color: #545454;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: 0 28px;
|
||||
font-weight: 500;
|
||||
font-size: 18px;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
&:last-of-type {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
|
||||
&:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: calc(~'50% - 8px');
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
border-bottom: 15px solid #fff;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.colorWhite {
|
||||
@@ -156,6 +210,10 @@
|
||||
align-items: center;
|
||||
-webkit-user-select: none;
|
||||
|
||||
&.prioritize {
|
||||
z-index: 9000;
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: 28px;
|
||||
justify-content: center;
|
||||
|
||||
@@ -146,6 +146,7 @@ select:focus {
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
max-width: 472px;
|
||||
|
||||
&.grid {
|
||||
display: grid;
|
||||
@@ -222,6 +223,7 @@ select:focus {
|
||||
color: #002680;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
// flex: 0.7;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
@import "report.less";
|
||||
@import "users.less";
|
||||
@import "tooltip.less";
|
||||
@import "saveas.less";
|
||||
|
||||
|
||||
@background-color: rgb(216, 216, 216);
|
||||
|
||||
@@ -2378,7 +2378,7 @@
|
||||
line-height: 4px;
|
||||
|
||||
.title {
|
||||
width: 110px;
|
||||
min-width: 110px;
|
||||
text-align: right;
|
||||
color: @color-darkish-blue;
|
||||
}
|
||||
|
||||
@@ -9,24 +9,27 @@
|
||||
right: 0;
|
||||
bottom: 80px;
|
||||
overflow: visible;
|
||||
z-index: 100;
|
||||
background-color: #ddd;
|
||||
width: 1360px;
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
box-shadow: none;
|
||||
transform: translateX(1360px);
|
||||
transition: transform .3s ease-in-out;
|
||||
transition: transform .3s .2s ease-in-out,box-shadow .3s linear;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
justify-content: flex-start;
|
||||
z-index: 1100;
|
||||
z-index: 1001;
|
||||
|
||||
|
||||
&.open-full {
|
||||
transform: translateX(0);
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
transition: transform .1s ease-in-out,box-shadow .3s .1s linear;
|
||||
}
|
||||
|
||||
&.open-half {
|
||||
transform: translateX(680px);
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
transition: transform .1s ease-in-out,box-shadow .3s .1s linear;
|
||||
}
|
||||
|
||||
.paddleButton {
|
||||
@@ -127,7 +130,7 @@
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
||||
background-color: #808e96;
|
||||
cursor: pointer;
|
||||
color: #fff;
|
||||
@@ -141,6 +144,26 @@
|
||||
justify-content: center;
|
||||
padding: 1rem;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
position: relative;
|
||||
|
||||
&.active {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff;
|
||||
&[disabled]::after{
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
}
|
||||
}
|
||||
|
||||
&[disabled]::after{
|
||||
top:0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #aaaaaaaa;
|
||||
content: "";
|
||||
}
|
||||
|
||||
|
||||
button.configure {
|
||||
position: absolute;
|
||||
@@ -153,6 +176,55 @@
|
||||
color: @color-darkish-blue;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
&.pressed:active,
|
||||
&:active {
|
||||
background-color: #57636b;
|
||||
}
|
||||
}
|
||||
|
||||
.starred-softkey {
|
||||
box-sizing: border-box;
|
||||
border-radius: 2px;
|
||||
margin: 0 8px;
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
box-shadow: none;
|
||||
padding: 0 20px;
|
||||
border: none;
|
||||
position: relative;
|
||||
background-image: linear-gradient(to bottom, @color-white2, @color-silver) !important;
|
||||
|
||||
&.pressed:active,
|
||||
&:active {
|
||||
background-image: linear-gradient(to bottom, @color-silver, @color-white2) !important;
|
||||
}
|
||||
&.pressed {
|
||||
background-image: linear-gradient(to bottom, @color-silver, @color-white2) !important;
|
||||
}
|
||||
|
||||
&.active {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
&[disabled]::after{
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
}
|
||||
}
|
||||
|
||||
img{
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
|
||||
|
||||
&[disabled]::after{
|
||||
top:0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #aaaaaaaa;
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
|
||||
.box-softkeys-prefered-footer {
|
||||
|
||||
@@ -119,6 +119,9 @@
|
||||
color: @color-green;
|
||||
}
|
||||
|
||||
.black{
|
||||
color: #4b4b4b;
|
||||
}
|
||||
.content.READY,
|
||||
.status.READY{
|
||||
color: @color-clear-blue;
|
||||
|
||||
@@ -21,9 +21,11 @@
|
||||
|
||||
.tab-header {
|
||||
width: 70%;
|
||||
display: flex;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 200px));
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
justify-content: flex-end;
|
||||
grid-column-gap: 10px;
|
||||
|
||||
button {
|
||||
border: none;
|
||||
@@ -45,6 +47,7 @@
|
||||
}
|
||||
|
||||
label {
|
||||
justify-self: flex-end;
|
||||
font-size: 32px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
// out: false, sourceMap: false, main: ../style.less
|
||||
.modal.save-as {
|
||||
width: 500px;
|
||||
height: 300px;
|
||||
top: calc(~'50% - 200px');
|
||||
|
||||
article {
|
||||
|
||||
label {
|
||||
color: #002680;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
input {
|
||||
padding: 5px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #6d6d6d;
|
||||
width: 100%;
|
||||
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 4px;
|
||||
align-items: center;
|
||||
justify-content: stretch;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -238,6 +238,34 @@
|
||||
}
|
||||
}
|
||||
|
||||
i {
|
||||
grid-column-start: -1;
|
||||
grid-column-end: 1;
|
||||
grid-row: 2;
|
||||
z-index: 2;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
top: -10px;
|
||||
left: 47px;
|
||||
font-size: 25px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
overflow: visible;
|
||||
background-color: white;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
border-radius: 7px;
|
||||
|
||||
&.fa-check-circle {
|
||||
color: #90BF3D;
|
||||
}
|
||||
|
||||
&.fa-check-circle.undone-step {
|
||||
color: #1791FF;
|
||||
}
|
||||
}
|
||||
|
||||
span,
|
||||
label {
|
||||
grid-row-start: 1;
|
||||
@@ -446,6 +474,8 @@ article {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 5px;
|
||||
border: 2px solid #979797;
|
||||
box-sizing: border-box;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.submit {
|
||||
|
||||
@@ -196,6 +196,31 @@
|
||||
.setup .modal-footer-navigator .setup-button.current .background-bottom {
|
||||
box-shadow: -3px -5px 5px rgba(0, 0, 0, 0.2) inset;
|
||||
}
|
||||
.setup .modal-footer-navigator .setup-button i {
|
||||
grid-column-start: -1;
|
||||
grid-column-end: 1;
|
||||
grid-row: 2;
|
||||
z-index: 2;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
top: -10px;
|
||||
left: 47px;
|
||||
font-size: 25px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
overflow: visible;
|
||||
background-color: white;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
border-radius: 7px;
|
||||
}
|
||||
.setup .modal-footer-navigator .setup-button i.fa-check-circle {
|
||||
color: #90BF3D;
|
||||
}
|
||||
.setup .modal-footer-navigator .setup-button i.fa-check-circle.undone-step {
|
||||
color: #1791FF;
|
||||
}
|
||||
.setup .modal-footer-navigator .setup-button span,
|
||||
.setup .modal-footer-navigator .setup-button label {
|
||||
grid-row-start: 1;
|
||||
@@ -360,6 +385,8 @@ article .box .body {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 5px;
|
||||
border: 2px solid #979797;
|
||||
box-sizing: border-box;
|
||||
align-items: center;
|
||||
}
|
||||
.box .submit {
|
||||
margin: auto;
|
||||
@@ -2496,7 +2523,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;
|
||||
}
|
||||
@@ -4132,7 +4159,7 @@ article .box .body {
|
||||
width: 100%;
|
||||
background-image: url("../../assets/icons/png/bg.png");
|
||||
position: fixed;
|
||||
z-index: 1001;
|
||||
z-index: 1002;
|
||||
display: grid;
|
||||
grid-template-rows: 144px 1fr;
|
||||
grid-template-columns: 152px 1fr 610px 1fr 152px;
|
||||
@@ -4759,22 +4786,25 @@ article .box .body {
|
||||
right: 0;
|
||||
bottom: 80px;
|
||||
overflow: visible;
|
||||
z-index: 100;
|
||||
background-color: #ddd;
|
||||
width: 1360px;
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
box-shadow: none;
|
||||
transform: translateX(1360px);
|
||||
transition: transform 0.3s ease-in-out;
|
||||
transition: transform 0.3s 0.2s ease-in-out, box-shadow 0.3s linear;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
justify-content: flex-start;
|
||||
z-index: 1100;
|
||||
z-index: 1001;
|
||||
}
|
||||
.paddle.open-full {
|
||||
transform: translateX(0);
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
transition: transform 0.1s ease-in-out, box-shadow 0.3s 0.1s linear;
|
||||
}
|
||||
.paddle.open-half {
|
||||
transform: translateX(680px);
|
||||
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
|
||||
transition: transform 0.1s ease-in-out, box-shadow 0.3s 0.1s linear;
|
||||
}
|
||||
.paddle .paddleButton {
|
||||
width: 40px;
|
||||
@@ -4852,20 +4882,36 @@ article .box .body {
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
||||
background-color: #808e96;
|
||||
cursor: pointer;
|
||||
color: #fff;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
display: grid;
|
||||
position: relative;
|
||||
grid-template-columns: auto 1fr;
|
||||
grid-column-gap: 10px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 1rem;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
position: relative;
|
||||
}
|
||||
.softkey.active {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff;
|
||||
}
|
||||
.softkey.active[disabled]::after {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
}
|
||||
.softkey[disabled]::after {
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #aaaaaaaa;
|
||||
content: "";
|
||||
}
|
||||
.softkey button.configure {
|
||||
position: absolute;
|
||||
@@ -4878,6 +4924,48 @@ article .box .body {
|
||||
color: #002680;
|
||||
background: #fff;
|
||||
}
|
||||
.softkey.pressed:active,
|
||||
.softkey:active {
|
||||
background-color: #57636b;
|
||||
}
|
||||
.starred-softkey {
|
||||
box-sizing: border-box;
|
||||
border-radius: 2px;
|
||||
margin: 0 8px;
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
box-shadow: none;
|
||||
padding: 0 20px;
|
||||
border: none;
|
||||
position: relative;
|
||||
background-image: linear-gradient(to bottom, #f1f1f1, #bbbcbc) !important;
|
||||
}
|
||||
.starred-softkey.pressed:active,
|
||||
.starred-softkey:active {
|
||||
background-image: linear-gradient(to bottom, #bbbcbc, #f1f1f1) !important;
|
||||
}
|
||||
.starred-softkey.pressed {
|
||||
background-image: linear-gradient(to bottom, #bbbcbc, #f1f1f1) !important;
|
||||
}
|
||||
.starred-softkey.active {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
}
|
||||
.starred-softkey.active[disabled]::after {
|
||||
box-shadow: inset 0px 0px 0px 3px #1791ff !important;
|
||||
}
|
||||
.starred-softkey img {
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
.starred-softkey[disabled]::after {
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #aaaaaaaa;
|
||||
content: "";
|
||||
}
|
||||
.box-softkeys-prefered-footer {
|
||||
height: 65px;
|
||||
display: flex;
|
||||
@@ -4966,9 +5054,11 @@ article .box .body {
|
||||
}
|
||||
.modal.processo-info header .tab-header {
|
||||
width: 70%;
|
||||
display: flex;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 200px));
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
justify-content: flex-end;
|
||||
grid-column-gap: 10px;
|
||||
}
|
||||
.modal.processo-info header .tab-header button {
|
||||
border: none;
|
||||
@@ -4987,6 +5077,7 @@ article .box .body {
|
||||
margin: auto;
|
||||
}
|
||||
.modal.processo-info header .tab-header label {
|
||||
justify-self: flex-end;
|
||||
font-size: 32px;
|
||||
line-height: 1;
|
||||
}
|
||||
@@ -5433,6 +5524,7 @@ select:focus {
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
max-width: 472px;
|
||||
}
|
||||
.input-area.grid {
|
||||
display: grid;
|
||||
@@ -5494,6 +5586,7 @@ select:focus {
|
||||
color: #002680;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
}
|
||||
.input-area .numeric {
|
||||
font-size: 18px;
|
||||
@@ -5887,6 +5980,10 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
text-align: left;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.togglebutton label .toggle.error {
|
||||
background-color: rgba(255, 0, 0, 0.7);
|
||||
color: #222;
|
||||
}
|
||||
.togglebutton label .toggle,
|
||||
.togglebutton label input[type=checkbox][disabled] + .toggle {
|
||||
content: "";
|
||||
@@ -5937,19 +6034,22 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
background-image: linear-gradient(to bottom, #3fa4ff, #1791ff);
|
||||
color: #fff;
|
||||
}
|
||||
.togglebutton.big span.toggle {
|
||||
height: 40px;
|
||||
width: 112px;
|
||||
border-radius: 20px;
|
||||
font-size: 17px;
|
||||
line-height: 40px;
|
||||
font-weight: bold;
|
||||
.togglebutton.big span.toggle,
|
||||
.togglebutton.big[disabled] span.toggle {
|
||||
height: 40px !important;
|
||||
width: 112px !important;
|
||||
border-radius: 20px !important;
|
||||
font-size: 17px !important;
|
||||
line-height: 40px !important;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
.togglebutton.big span.toggle:after {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
.togglebutton.big span.toggle:after,
|
||||
.togglebutton.big[disabled] span.toggle:after {
|
||||
width: 36px !important;
|
||||
height: 36px !important;
|
||||
}
|
||||
.togglebutton.big input[type=checkbox]:checked + .toggle:after {
|
||||
.togglebutton.big input[type=checkbox]:checked + .toggle:after,
|
||||
.togglebutton.big[disabled] input[type=checkbox]:checked + .toggle:after {
|
||||
left: 74px;
|
||||
}
|
||||
.custom-checkbox {
|
||||
@@ -6189,6 +6289,57 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
#app > header .context-menu,
|
||||
.dashboard > header .context-menu {
|
||||
position: relative;
|
||||
}
|
||||
#app > header .context-menu .context-area,
|
||||
.dashboard > header .context-menu .context-area {
|
||||
top: 50px;
|
||||
display: none;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
||||
position: absolute;
|
||||
width: 300px;
|
||||
left: -126px;
|
||||
padding-inline-start: 0;
|
||||
padding-inline-end: 0;
|
||||
}
|
||||
#app > header .context-menu .context-area.show,
|
||||
.dashboard > header .context-menu .context-area.show {
|
||||
display: block !important;
|
||||
}
|
||||
#app > header .context-menu .context-area li,
|
||||
.dashboard > header .context-menu .context-area li {
|
||||
list-style-type: none;
|
||||
height: 62px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.5);
|
||||
color: #545454;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: 0 28px;
|
||||
font-weight: 500;
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
}
|
||||
#app > header .context-menu .context-area li:last-of-type,
|
||||
.dashboard > header .context-menu .context-area li:last-of-type {
|
||||
border-bottom: none;
|
||||
}
|
||||
#app > header .context-menu .context-area:before,
|
||||
.dashboard > header .context-menu .context-area:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: calc(50% - 8px);
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
border-bottom: 15px solid #fff;
|
||||
}
|
||||
.colorWhite {
|
||||
color: #fff !important;
|
||||
}
|
||||
@@ -6204,6 +6355,9 @@ fieldset[disabled] .form-group.is-focused .togglebutton label {
|
||||
display: flex;
|
||||
padding-right: 8px !important;
|
||||
}
|
||||
.window-buttons.prioritize {
|
||||
z-index: 9000;
|
||||
}
|
||||
.window-buttons button {
|
||||
font-size: 28px;
|
||||
justify-content: center;
|
||||
@@ -6701,6 +6855,9 @@ footer .container button.big:before {
|
||||
.process-info .status.RUN {
|
||||
color: #7ed321;
|
||||
}
|
||||
.process-info .black {
|
||||
color: #4b4b4b;
|
||||
}
|
||||
.process-info .content.READY,
|
||||
.process-info .status.READY {
|
||||
color: #1791ff;
|
||||
@@ -23638,6 +23795,34 @@ footer .container button.big:before {
|
||||
text-align: center;
|
||||
color: #4b4b4b;
|
||||
}
|
||||
.modal.save-as {
|
||||
width: 500px;
|
||||
height: 300px;
|
||||
top: calc(50% - 200px);
|
||||
}
|
||||
.modal.save-as article label {
|
||||
color: #002680;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.modal.save-as article input {
|
||||
padding: 5px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #6d6d6d;
|
||||
width: 100%;
|
||||
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 4px;
|
||||
align-items: center;
|
||||
justify-content: stretch;
|
||||
}
|
||||
a,
|
||||
a:visited,
|
||||
a:hover,
|
||||
|
||||
@@ -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 |
@@ -4,5 +4,5 @@
|
||||
"enabled": true,
|
||||
"apiServerUrl": "http://localhost:9000/"
|
||||
},
|
||||
"allUIVisible": true
|
||||
"allUIVisible": false
|
||||
}
|
||||
@@ -19,13 +19,12 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<app>
|
||||
<img src="/assets/icons/png/bg.png" style="display:hidden">
|
||||
<div id="loading-spinner"><i class="fa fa-circle-o-notch fa-spin"></i></div>
|
||||
</app>
|
||||
<script src="/dist/vendors~main.js" type="text/javascript"></script>
|
||||
<script src="/dist/build.js" type="text/javascript"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Generated
+2648
-2628
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@
|
||||
"svg-pan-zoom": "3.6.1",
|
||||
"v-tooltip": "^2.0.3",
|
||||
"vee-validate": "2.1.1",
|
||||
"vue": "^2.6.11",
|
||||
"vue": "^2.6.12",
|
||||
"vue-chartjs": "^3.5.0",
|
||||
"vue-class-component": "7.2.3",
|
||||
"vue-drag-drop": "1.1.4",
|
||||
@@ -37,16 +37,16 @@
|
||||
"vuex": "3.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/plugin-proposal-export-default-from": "7.8.3",
|
||||
"@babel/plugin-proposal-export-default-from": "7.10.4",
|
||||
"@types/es6-promise": "3.3.0",
|
||||
"@vue/cli-plugin-babel": "^4.1.0",
|
||||
"@vue/cli-plugin-eslint": "^4.1.0",
|
||||
"@vue/cli-plugin-router": "^4.1.0",
|
||||
"@vue/cli-plugin-typescript": "^4.1.0",
|
||||
"@vue/cli-plugin-vuex": "^4.1.0",
|
||||
"@vue/cli-service": "^4.2.3",
|
||||
"@vue/cli-plugin-babel": "^4.5.4",
|
||||
"@vue/cli-plugin-eslint": "^4.5.4",
|
||||
"@vue/cli-plugin-router": "^4.5.4",
|
||||
"@vue/cli-plugin-typescript": "^4.5.4",
|
||||
"@vue/cli-plugin-vuex": "^4.5.4",
|
||||
"@vue/cli-service": "^4.5.4",
|
||||
"autoprefixer": "^7.1.2",
|
||||
"babel-loader": "8.0.6",
|
||||
"babel-loader": "8.1.0",
|
||||
"chalk": "^2.0.1",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"css-loader": "^0.28.0",
|
||||
@@ -57,8 +57,8 @@
|
||||
"ts-loader": "6.2.1",
|
||||
"typescript": "3.8.3",
|
||||
"url-loader": "^3.0.0",
|
||||
"vue-loader": "^15.9.0",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"vue-loader": "^15.9.3",
|
||||
"vue-template-compiler": "^2.6.12",
|
||||
"webpack": "^4.42.0",
|
||||
"webpack-cli": "3.2.3",
|
||||
"webpack-dev-server": "3.2.1"
|
||||
|
||||
@@ -18,5 +18,7 @@ declare module server {
|
||||
terminated: boolean;
|
||||
running: boolean;
|
||||
hasError: boolean;
|
||||
category: string;
|
||||
subCategory_1: string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ declare module Recipe {
|
||||
}
|
||||
|
||||
interface IValue {
|
||||
key?: string,
|
||||
range: IRange,
|
||||
status: IStatus,
|
||||
unitMeasure: string,
|
||||
|
||||
@@ -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,6 +58,7 @@ export default class app extends Vue {
|
||||
loadingOperations = 0;
|
||||
HMIsrc = null;
|
||||
hub: Hub = null;
|
||||
prioritizeWindowsButtons = false;
|
||||
|
||||
beforeMount() {
|
||||
moment.locale((window.navigator as any).userLanguage || window.navigator.language);
|
||||
@@ -63,6 +66,12 @@ export default class app extends Vue {
|
||||
mounted() {
|
||||
let ms = messageService;
|
||||
|
||||
window.oncontextmenu = function (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return false;
|
||||
};
|
||||
|
||||
// if cms is connected
|
||||
if (typeof cmsClient != "undefined")
|
||||
this.HMIsrc = cmsClient.getScreenBase64();
|
||||
@@ -73,10 +82,12 @@ export default class app extends Vue {
|
||||
|
||||
ms.subscribeToChannel("show-modal-login", args => {
|
||||
this.applyBlur = true;
|
||||
this.prioritizeWindowsButtons = true;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("hide-modal-login", args => {
|
||||
this.applyBlur = false;
|
||||
this.prioritizeWindowsButtons = false;
|
||||
});
|
||||
|
||||
ms.subscribeToChannel("hide-modal", args => {
|
||||
|
||||
@@ -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>
|
||||
<modal-container name="modal"></modal-container>
|
||||
<div class="window-buttons">
|
||||
|
||||
<div class="window-buttons" :class="{prioritize: prioritizeWindowsButtons}">
|
||||
<button
|
||||
class="gray square close"
|
||||
@click="sendMessage('hide')"
|
||||
@@ -34,6 +35,7 @@
|
||||
:title="'header_tooltip_btn_close' | localize('Close the application')"
|
||||
>×</button>
|
||||
</div>
|
||||
<modal-container name="modal"></modal-container>
|
||||
</div>
|
||||
</template>
|
||||
<script src="./App.ts" lang="ts"></script>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import Axios, { AxiosInstance, AxiosPromise, AxiosResponse, AxiosBasicCredentials, AxiosRequestConfig } from "axios";
|
||||
import Factory from "./factoryService";
|
||||
import * as iziToast from "izitoast";
|
||||
// import { localizeString } from "../filters/localizeFilter";
|
||||
import { store, AppModel } from "@/store";
|
||||
|
||||
interface InterceptorRequestDelegate { (config: AxiosRequestConfig): AxiosRequestConfig; }
|
||||
|
||||
@@ -9,6 +9,7 @@ import { UserInfoDialog, MachineInfoDialog, ContactInfoDialog } from "@/app_modu
|
||||
import { ModalHelper } from "./components/modals/ModalHelper";
|
||||
import Vue from "vue";
|
||||
import { loginService, machineService, localizationService } from "./services";
|
||||
import { prodService } from "./services/prodService";
|
||||
|
||||
// import { UsersService } from "./services/usersService";
|
||||
|
||||
@@ -61,6 +62,8 @@ async function loadMachineConfig() {
|
||||
|
||||
let mcresult = await machine.getMachineConfiguration();
|
||||
|
||||
await prodService.GetProdPanel();
|
||||
|
||||
// load default language
|
||||
if (!(store.state as AppModel).localization.currentLanguage) {
|
||||
localizationService.changeCurrentLanguage(mcresult.defaultLanguage);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
font-family: "Work Sans";
|
||||
font-size: 47px;
|
||||
font-size: 40px;
|
||||
font-weight: 500;
|
||||
line-height: 1.01;
|
||||
padding-right: 1rem;
|
||||
|
||||
@@ -2,7 +2,6 @@ import Component from "vue-class-component";
|
||||
import Vue from "vue";
|
||||
import { Prop } from "vue-property-decorator";
|
||||
import lottie from "lottie-web";
|
||||
import { localizeString } from "@/filters/localizeFilter";
|
||||
|
||||
@Component({})
|
||||
export default class Combo extends Vue {
|
||||
@@ -12,7 +11,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];
|
||||
@@ -25,13 +24,15 @@ export default class Combo extends Vue {
|
||||
|
||||
get currentValue() {
|
||||
let result = this.options.find(o => o.id == this.value.setpointHMI);
|
||||
if (result) return localizeString(result.text, result.text);
|
||||
if (result) {
|
||||
return this.$options.filters.localize(result.text, result.text);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
opened: boolean = false;
|
||||
showList() {
|
||||
this.opened = true;
|
||||
this.opened = !this.opened;
|
||||
this.$nextTick(() => lottie.searchAnimations());
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
<template>
|
||||
<div class="combo">
|
||||
<div class="form" @click="showList">
|
||||
<div
|
||||
class="form"
|
||||
@click="showList"
|
||||
:class="{'error': value && value.status && value.status.hasError}"
|
||||
>
|
||||
{{currentValue}}
|
||||
<i v-if="opened" class="fa fa-chevron-up" />
|
||||
<i v-else class="fa fa-chevron-down" />
|
||||
@@ -36,7 +40,7 @@
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #6d6d6d;
|
||||
min-width: 80px;
|
||||
min-width: 200px;
|
||||
width: fit-content;
|
||||
|
||||
height: 48px;
|
||||
@@ -53,6 +57,10 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.combo .form.error {
|
||||
outline: 2px red auto;
|
||||
}
|
||||
|
||||
.combo .form i {
|
||||
position: absolute;
|
||||
right: 4px;
|
||||
|
||||
@@ -18,29 +18,43 @@ export default class Keyboard extends Vue {
|
||||
@Prop()
|
||||
value: string;
|
||||
|
||||
get Value() {
|
||||
return this.actualValue.setpointHMI;
|
||||
}
|
||||
|
||||
set Value(v: number) {
|
||||
try {
|
||||
let scale = Math.pow(10, this.actualValue.numDec);
|
||||
this.actualValue.setpointHMI = Math.round(v * scale) / scale;
|
||||
} catch{
|
||||
this.actualValue.setpointHMI = v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
del() {
|
||||
this.actualValue.setpointHMI = 0;
|
||||
this.Value = 0;
|
||||
}
|
||||
|
||||
canc() {
|
||||
let temp = String(this.actualValue.setpointHMI);
|
||||
this.actualValue.setpointHMI = Number(temp.slice(0, -1))
|
||||
let temp = String(this.Value);
|
||||
this.Value = Number(temp.slice(0, -1))
|
||||
}
|
||||
|
||||
add(num: string) {
|
||||
if (this.point) {
|
||||
this.point += num;
|
||||
this.actualValue.setpointHMI = Number(this.point)
|
||||
this.Value = Number(this.point)
|
||||
} else {
|
||||
let temp = String(this.actualValue.setpointHMI);
|
||||
let temp = String(this.Value);
|
||||
temp += num;
|
||||
this.actualValue.setpointHMI = Number(temp)
|
||||
this.Value = Number(temp)
|
||||
}
|
||||
}
|
||||
|
||||
addpoint() {
|
||||
if (!this.point) {
|
||||
this.point = String(this.actualValue.setpointHMI);
|
||||
this.point = String(this.Value);
|
||||
this.point += ".";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,19 @@ export default class Numeric extends Vue {
|
||||
|
||||
focused: boolean = false;
|
||||
|
||||
get Value() {
|
||||
return this.value.setpointHMI;
|
||||
}
|
||||
|
||||
set Value(v: number) {
|
||||
try {
|
||||
let scale = Math.pow(10, this.value.numDec);
|
||||
this.value.setpointHMI = Math.round(v * scale) / scale;
|
||||
} catch {
|
||||
this.value.setpointHMI = v;
|
||||
}
|
||||
}
|
||||
|
||||
onFocus() {
|
||||
if (this.value && this.value.status && !this.value.status.enabled) return;
|
||||
let rect = this.$el.getBoundingClientRect();
|
||||
@@ -48,9 +61,10 @@ export default class Numeric extends Vue {
|
||||
KeyboardHelper.showKeyboard(x, y, this.value);
|
||||
|
||||
let textBox = (this.$refs.input as any);
|
||||
textBox.SelectionStart = textBox.value.length;
|
||||
textBox.SelectionLength = 0;
|
||||
this.$nextTick(() => { this.focused = true; })
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.focused = true;
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<input
|
||||
type="number"
|
||||
ref="input"
|
||||
v-model.number="value.setpointHMI"
|
||||
v-model.number="Value"
|
||||
@focus="onFocus"
|
||||
@blur="onBlur"
|
||||
:id="id"
|
||||
|
||||
@@ -5,6 +5,7 @@ import { dataService } from "@/services/dataService";
|
||||
import { store, MachineStatusModel } from "@/store";
|
||||
import { SoftKeysConfigurationModel, machineInfoStore } from "@/store/machineInfo.store";
|
||||
import { Hub, machineService } from "@/services";
|
||||
import { Watch } from "vue-property-decorator";
|
||||
|
||||
@Component({
|
||||
components: { softKey }
|
||||
@@ -58,6 +59,11 @@ export default class Paddle extends Vue {
|
||||
}
|
||||
|
||||
async mounted() {
|
||||
this.loadData();
|
||||
}
|
||||
|
||||
@Watch("isOpen")
|
||||
async loadData() {
|
||||
await dataService.GetSoftKeysConfiguration();
|
||||
await dataService.GetUserSoftkeyFavorite();
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
@toggleFavourite="toggleFavourite(b.id, false)"
|
||||
v-model="getSoftKeyStatus(b.id).value"
|
||||
:active="getSoftKeyStatus(b.id).active"
|
||||
:value="getSoftKeyStatus(b.id).value"
|
||||
:isFavourite="true"
|
||||
@click="softKeyChanged(b.id, b.operatorConfirmationNeeded)"
|
||||
@checkChanged="softKeyChanged(b.id, b.operatorConfirmationNeeded)"
|
||||
@@ -55,6 +56,7 @@
|
||||
<template v-for="(b,idx) in allSoftKeys">
|
||||
<soft-key
|
||||
v-if="getSoftKeyStatus(b.id) && getSoftKeyStatus(b.id).visible"
|
||||
:id="b.id"
|
||||
:key="idx"
|
||||
:title="'softkey_' + b.id | localize('softkey_' + b.id)"
|
||||
:type="b.type"
|
||||
@@ -62,6 +64,7 @@
|
||||
@toggleFavourite="toggleFavourite(b.id, !isFavourite(b.id))"
|
||||
v-model="getSoftKeyStatus(b.id).value"
|
||||
:active="getSoftKeyStatus(b.id).active"
|
||||
:value="getSoftKeyStatus(b.id).value"
|
||||
:isFavourite="isFavourite(b.id)"
|
||||
@click="softKeyChanged(b.id, b.operatorConfirmationNeeded)"
|
||||
@checkChanged="softKeyChanged(b.id, b.operatorConfirmationNeeded)"
|
||||
|
||||
@@ -18,11 +18,18 @@ export default class SoftKey extends Vue {
|
||||
@Prop({ default: false })
|
||||
configMode: boolean;
|
||||
|
||||
@Prop({ default: false })
|
||||
active: boolean;
|
||||
|
||||
@Prop({ default: false })
|
||||
isFavourite: boolean;
|
||||
|
||||
@Prop({ default: null })
|
||||
id: number;
|
||||
|
||||
doclick() {
|
||||
if (!this.configMode && this.type != 0) this.$emit('click');
|
||||
if (this.configMode) this.$emit('toggleFavourite');
|
||||
}
|
||||
|
||||
get Checked() { return this.value; }
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="softkey" @click="doclick()">
|
||||
<button class="softkey" @click="doclick()" :disabled="!active && !configMode" :class="{ active: (value && type==1 && !configMode)}">
|
||||
<button class="configure" v-if="configMode" @click.prevent.stop="$emit('toggleFavourite')">
|
||||
<i class="fa fa-plus" v-if="!isFavourite"></i>
|
||||
<i class="fa fa-minus" v-if="isFavourite"></i>
|
||||
</button>
|
||||
<toggle-button v-if="type==0" v-model="Checked"></toggle-button>
|
||||
{{title}}
|
||||
</div>
|
||||
</button>
|
||||
</template>
|
||||
<script src="./softkey.ts" lang="ts"></script>
|
||||
@@ -1,7 +1,10 @@
|
||||
import Vue from "vue";
|
||||
import Component from "vue-class-component";
|
||||
import { Prop } from 'vue-property-decorator';
|
||||
import { debounce } from "@/_base/debounce";
|
||||
|
||||
import { Hub } from "@/services";
|
||||
import Numeric from "./numeric";
|
||||
import { unitOfTime } from "moment";
|
||||
@Component({ name: "slider" })
|
||||
export default class Slider extends Vue {
|
||||
|
||||
@@ -16,49 +19,80 @@ export default class Slider extends Vue {
|
||||
@Prop({ default: 1 })
|
||||
decimal: number;
|
||||
|
||||
incrementing: number = 0;
|
||||
tempValue: number = null;
|
||||
|
||||
get actualvalue() {
|
||||
return this.value.setpointHMI;
|
||||
}
|
||||
|
||||
set actualvalue(v: number) {
|
||||
this.debouncedActualValue(v)
|
||||
get softKey() {
|
||||
return this.$store.getters.getSoftKeyByRef(this.value.key);
|
||||
}
|
||||
|
||||
debouncedActualValue = debounce((v: number) => this.value.setpointHMI = v, 200);
|
||||
set actualvalue(v: number) {
|
||||
this.value.setpointHMI = v;
|
||||
}
|
||||
|
||||
get step() {
|
||||
var s = ((this.value.range.max - this.value.range.min) / (this.lines + 1));
|
||||
var m = Math.pow(10, this.decimal);
|
||||
return Math.round(s * m) / m
|
||||
};
|
||||
@Prop({ default: .2 })
|
||||
incrementingStep: number;
|
||||
|
||||
increment() {
|
||||
step: number = 1;
|
||||
// get step() {
|
||||
// var s = ((this.value.range.max - this.value.range.min) / (this.lines + 1));
|
||||
// var m = Math.pow(10, this.decimal);
|
||||
// return Math.round(s * m) / m
|
||||
// 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(() => {
|
||||
var v = this.value.setpointHMI;
|
||||
if (v < this.value.range.max) {
|
||||
v += Math.floor(this.step);
|
||||
this.step += this.incrementingStep;
|
||||
}
|
||||
if (v > this.value.range.max) {
|
||||
v = this.value.range.max;
|
||||
}
|
||||
this.actualvalue = v;
|
||||
}, 50);
|
||||
}
|
||||
|
||||
var v = this.value.setpointHMI;
|
||||
if (v < this.value.range.max) {
|
||||
v -= (-this.step);
|
||||
}
|
||||
if (v > this.value.range.max) {
|
||||
v = this.value.range.max;
|
||||
}
|
||||
this.actualvalue = v;
|
||||
};
|
||||
|
||||
decrement() {
|
||||
startDecrement() {
|
||||
if (!this.value.status.enabled) return;
|
||||
this.incrementing = setInterval(() => {
|
||||
var v = this.value.setpointHMI;
|
||||
if (v > this.value.range.min) {
|
||||
v -= Math.floor(this.step);
|
||||
this.step += this.incrementingStep;
|
||||
}
|
||||
if (v < this.value.range.min) {
|
||||
v = this.value.range.min;
|
||||
}
|
||||
this.actualvalue = v;
|
||||
}, 50);
|
||||
}
|
||||
|
||||
var v = this.value.setpointHMI;
|
||||
if (v > this.value.range.min) {
|
||||
v -= this.step;
|
||||
}
|
||||
if (v < this.value.range.min) {
|
||||
v = this.value.range.min;
|
||||
}
|
||||
this.actualvalue = v;
|
||||
confirm() {
|
||||
if (!this.value.status.enabled) return;
|
||||
if (this.incrementing)
|
||||
clearInterval(this.incrementing);
|
||||
|
||||
this.incrementing = 0;
|
||||
this.step = 1;
|
||||
};
|
||||
|
||||
|
||||
doSoftKeyClick() {
|
||||
Hub.Current.sendUserSoftKey(this.softKey.id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,29 +1,64 @@
|
||||
<template>
|
||||
<div class="slider">
|
||||
<button @click="decrement()">
|
||||
<img src="assets/icons/png/min.png" />
|
||||
</button>
|
||||
<div class="control">
|
||||
<input
|
||||
:disabled="!this.value.status.enabled"
|
||||
:min="this.value.range.min"
|
||||
:max="this.value.range.max"
|
||||
v-model.number="actualvalue"
|
||||
type="range"
|
||||
/>
|
||||
<div class="lines">
|
||||
<span v-for="iter in lines" :key="iter" class="line"></span>
|
||||
</div>
|
||||
<div class="labels">
|
||||
<small>{{`${this.value.range.min} ${this.value.unitMeasure}`}}</small>
|
||||
<small>{{`${(this.value.range.max - this.value.range.min) / 2 + this.value.range.min} ${this.value.unitMeasure}`}}</small>
|
||||
<small>{{`${this.value.range.max} ${this.value.unitMeasure}`}}</small>
|
||||
<div class="slider-container">
|
||||
<div class="slider">
|
||||
<button
|
||||
@mousedown="startDecrement()"
|
||||
v-on:touchstart="startDecrement()"
|
||||
v-on:touchend="confirm()"
|
||||
@mouseup="confirm()"
|
||||
@mouseout="confirm()"
|
||||
>
|
||||
<img src="assets/icons/png/min.png" />
|
||||
</button>
|
||||
<div class="control">
|
||||
<input
|
||||
:disabled="!this.value.status.enabled"
|
||||
:min="this.value.range.min"
|
||||
:max="this.value.range.max"
|
||||
v-model.number="actualvalue"
|
||||
type="range"
|
||||
/>
|
||||
<div class="lines">
|
||||
<span v-for="iter in lines" :key="iter" class="line"></span>
|
||||
</div>
|
||||
<div class="labels">
|
||||
<small>{{`${this.value.range.min} ${this.value.unitMeasure}`}}</small>
|
||||
<small>{{`${(this.value.range.max - this.value.range.min) / 2 + this.value.range.min} ${this.value.unitMeasure}`}}</small>
|
||||
<small>{{`${this.value.range.max} ${this.value.unitMeasure}`}}</small>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
@mousedown="startIncrement()"
|
||||
v-on:touchstart="startIncrement()"
|
||||
v-on:touchend="confirm()"
|
||||
@mouseup="confirm()"
|
||||
@mouseout="confirm()"
|
||||
>
|
||||
<img src="assets/icons/png/max.png" />
|
||||
</button>
|
||||
</div>
|
||||
<button @click="increment()">
|
||||
<img src="assets/icons/png/max.png" />
|
||||
</button>
|
||||
<button
|
||||
class="submit"
|
||||
v-if="softKey"
|
||||
@click="doSoftKeyClick()"
|
||||
>{{softKey.refCallLabel | localize(softKey.refCallLabel)}}</button>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.slider-container {
|
||||
display: grid;
|
||||
grid-row-gap: 1rem;
|
||||
flex-flow: column;
|
||||
justify-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
input[type="range"] {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
input[type="range"]::-webkit-slider-thumb {
|
||||
pointer-events: auto;
|
||||
}
|
||||
</style>
|
||||
<script lang="ts" src="./slider.ts"></script>
|
||||
@@ -56,11 +56,11 @@
|
||||
</div>
|
||||
<div class="col">
|
||||
<small>{{'history-item_mouldEnergyIN' | localize("energia utilizzata in")}}</small>
|
||||
<span>{{value.mouldEnergyIN | round(1)}}kW</span>
|
||||
<span>{{value.mouldEnergyIN | round(1)}}kWh</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<small>{{'history-item_mouldEnergyOUT' | localize("energia utilizzata out")}}</small>
|
||||
<span>{{value.mouldEnergyOUT | round(1)}}kW</span>
|
||||
<span>{{value.mouldEnergyOUT | round(1)}}kWh</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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";
|
||||
@@ -12,6 +12,8 @@ import { prodService } from '@/services/prodService';
|
||||
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: {
|
||||
@@ -25,7 +27,6 @@ import hitem from "./base-components/item.vue";
|
||||
})
|
||||
export default class Dashboard extends Vue {
|
||||
|
||||
|
||||
get panel() {
|
||||
return (this.$store.state as AppModel).prod.panel;
|
||||
}
|
||||
@@ -54,7 +55,7 @@ export default class Dashboard extends Vue {
|
||||
}
|
||||
|
||||
get remainingTime() {
|
||||
return this.endEstimation.diff(this.now);
|
||||
return Math.max(this.endEstimation.diff(this.now), 0);
|
||||
}
|
||||
|
||||
get currentUser() {
|
||||
@@ -65,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() {
|
||||
@@ -80,13 +93,13 @@ export default class Dashboard extends Vue {
|
||||
getColor(nome, cognome) {
|
||||
return getColorFromName(nome, cognome);
|
||||
}
|
||||
|
||||
isDarkColor(color) {
|
||||
return isDarkColor(color);
|
||||
}
|
||||
|
||||
|
||||
async mounted() {
|
||||
await prodService.GetProdPanel();
|
||||
prodService.GetProdPanel();
|
||||
|
||||
let $this = this;
|
||||
setInterval(() => {
|
||||
@@ -95,7 +108,6 @@ export default class Dashboard extends Vue {
|
||||
}
|
||||
|
||||
public get ribbonStatus(): ribbonStatusEnum {
|
||||
|
||||
// Controllo se ci sono allarmi
|
||||
let s = this.$store.state as AppModel;
|
||||
|
||||
@@ -103,7 +115,6 @@ export default class Dashboard extends Vue {
|
||||
if (s.alarms.warnings.length > 0) return ribbonStatusEnum.Warning;
|
||||
if (s.process.running) return ribbonStatusEnum.Working;
|
||||
return ribbonStatusEnum.Idle;
|
||||
|
||||
}
|
||||
|
||||
public get alarmTitle() {
|
||||
@@ -120,7 +131,6 @@ export default class Dashboard extends Vue {
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public get alarmCount() {
|
||||
@@ -148,6 +158,13 @@ export default class Dashboard extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
sendSoftKey(id: string) {
|
||||
debugger
|
||||
var sk = this.allSoftKeys.find(s => s.refCallParam == id);
|
||||
if (sk)
|
||||
Hub.Current.sendUserSoftKey(sk.id);
|
||||
}
|
||||
|
||||
public sendMessage(name: string) {
|
||||
messageService.publishToChannel(name);
|
||||
}
|
||||
@@ -155,7 +172,6 @@ export default class Dashboard extends Vue {
|
||||
close() {
|
||||
appModelActions.ShowDashboard(this.$store);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
enum ribbonStatusEnum {
|
||||
|
||||
@@ -99,7 +99,12 @@
|
||||
</div>
|
||||
<div class="end">
|
||||
<small>{{'dashboard-timing-end' | localize('fine')}}</small>
|
||||
<time v-if="panel.stimaDurata">~{{endEstimation | date('HH:mm')}}</time>
|
||||
<time v-if="panel.stimaDurata">
|
||||
<span>~{{endEstimation | date('HH:mm')}}</span>
|
||||
<small
|
||||
style="text-transform:lowercase"
|
||||
>+{{Math.floor(remainingTime /1000 / 3600 /24)}} {{'remainging__days' | localize("gg")}}</small>
|
||||
</time>
|
||||
<time v-else>--:--</time>
|
||||
</div>
|
||||
</div>
|
||||
@@ -107,14 +112,14 @@
|
||||
<div class="setpoint">
|
||||
<img src="assets/icons/png/inv.png" />
|
||||
<label>{{panel.tempAct}}°C</label>
|
||||
<button>
|
||||
<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>
|
||||
<button @click="sendSoftKey('dash_setpoint_plus')">
|
||||
<i class="fa fa-plus"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -124,7 +129,9 @@
|
||||
<gauge></gauge>
|
||||
<div class="remaining_time">
|
||||
<small>{{'dashboard-remaining-time' | localize('tempo rimanente')}}</small>
|
||||
<time v-if="panel.stimaDurata">{{remainingTime | date('HH:mm:ss')}}</time>
|
||||
<time
|
||||
v-if="panel.stimaDurata"
|
||||
>{{Math.floor(remainingTime /1000 / 3600)}}:{{remainingTime | date('mm:ss')}}</time>
|
||||
<time v-else>--:--:--</time>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+60
@@ -4,6 +4,19 @@ import { Prop, InjectReactive } from 'vue-property-decorator';
|
||||
import { IGanttOptions } from './gantt';
|
||||
import { store } from '@/store';
|
||||
import { RecipeGetters } from '@/store/recipe.store';
|
||||
import { ModalHelper } from '@/components/modals';
|
||||
|
||||
import ShowRiscaldamentoInfo from "@/app_modules_thermo/setup/riscaldi/components/show-riscaldi-info.vue";
|
||||
import ShowFormatoInfo from "@/app_modules_thermo/setup/formato/components/show-formato-info.vue";
|
||||
import ShowPirometroInfo from "@/app_modules_thermo/setup/pirometro/components/show-pirometro-info.vue";
|
||||
import ShowCicloInfo from "@/app_modules_thermo/setup/ciclo/components/show-ciclo-info.vue";
|
||||
import ShowRaffreddamentoInfo from "@/app_modules_thermo/setup/raffreddamento/components/show-raffreddamento-info.vue";
|
||||
import ShowControstampoInfo from "@/app_modules_thermo/setup/controstampo_setup/components/show-controstampo-info.vue";
|
||||
import ShowQuoteVelocitaInfo from "@/app_modules_thermo/setup/quote-velocita/components/show-quote-velocita-info.vue";
|
||||
import ShowEstrazioneInfo from "@/app_modules_thermo/setup/estrazione/components/show-estrazione-info.vue";
|
||||
import ShowVuotoInfo from "@/app_modules_thermo/setup/vuoto/show-vuoto-info.vue";
|
||||
import ShowImbutituraInfo from "@/app_modules_thermo/setup/imbutitura/show-imbutitura-info.vue";
|
||||
import ShowOpzioniInfo from "@/app_modules_thermo/setup/opzioni/show-opzioni-info.vue";
|
||||
|
||||
@Component({})
|
||||
export default class GanttComponent extends Vue {
|
||||
@@ -71,6 +84,53 @@ export default class GanttComponent extends Vue {
|
||||
return this.showStatus ? this.ganttOptions.block_status_minDuration : 0;
|
||||
}
|
||||
|
||||
|
||||
openModal() {
|
||||
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, subcategory: string) {
|
||||
try {
|
||||
let next = await this.showModalStep(step, subcategory);
|
||||
if (next == null) return;
|
||||
this.showModalAtStep(step + next, null);
|
||||
} catch {
|
||||
}
|
||||
}
|
||||
|
||||
showModalStep(step: number, subcategory: string): Promise<number> {
|
||||
switch (step) {
|
||||
case 0: return ModalHelper.ShowModalAsync(ShowFormatoInfo, { subcategory });
|
||||
case 1: return ModalHelper.ShowModalAsync(ShowQuoteVelocitaInfo, { subcategory });
|
||||
case 2: return ModalHelper.ShowModalAsync(ShowCicloInfo, { subcategory });
|
||||
case 3: return ModalHelper.ShowModalAsync(ShowRiscaldamentoInfo, { subcategory });
|
||||
case 4: return ModalHelper.ShowModalAsync(ShowPirometroInfo, { subcategory });
|
||||
case 5: return ModalHelper.ShowModalAsync(ShowImbutituraInfo, { subcategory });
|
||||
case 6: return ModalHelper.ShowModalAsync(ShowControstampoInfo, { subcategory });
|
||||
case 7: return ModalHelper.ShowModalAsync(ShowRaffreddamentoInfo, { subcategory });
|
||||
case 8: return ModalHelper.ShowModalAsync(ShowVuotoInfo, { subcategory });
|
||||
case 9: return ModalHelper.ShowModalAsync(ShowEstrazioneInfo, { subcategory });
|
||||
case 10: return ModalHelper.ShowModalAsync(ShowOpzioniInfo, { subcategory });
|
||||
// case 11: return ModalHelper.ShowModalAsync(AvvioProduzione);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// mounted() {
|
||||
// this.value.showDelay = true;
|
||||
// }
|
||||
|
||||
+6
-3
@@ -36,7 +36,7 @@
|
||||
x="0"
|
||||
y="0"
|
||||
>
|
||||
<div class="body-header">{{value.label | localize(value.label)}}</div>
|
||||
<div class="body-header" @click="openModal()">{{value.label | localize(value.label)}}</div>
|
||||
</foreignObject>
|
||||
<foreignObject
|
||||
:width="(duration - (showStatus && recipeValue?statusDuration:0)) * ganttOptions.secondSize"
|
||||
@@ -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"
|
||||
|
||||
+33
-3
@@ -1,6 +1,6 @@
|
||||
import Component from "vue-class-component";
|
||||
import Vue from "vue";
|
||||
import { Prop, InjectReactive } from "vue-property-decorator";
|
||||
import { Prop, InjectReactive, Watch } from "vue-property-decorator";
|
||||
import { IGanttOptions } from "./gantt";
|
||||
import block from "./gantt-component.vue";
|
||||
import { relativeTimeRounding } from "moment";
|
||||
@@ -32,10 +32,29 @@ 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;
|
||||
}
|
||||
|
||||
get ActiveBlocks() {
|
||||
return this.blocksInSection.filter(i => !i.terminated);
|
||||
}
|
||||
|
||||
@Watch('ActiveBlocks')
|
||||
firstActiveBlockChanged(n, o) {
|
||||
if (n && n != o) {
|
||||
this.$emit('firstBlockChanged', this.$el.getBoundingClientRect().top, Math.min(...this.ActiveBlocks.map(i => this.verticalPosition(i))));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Questa funzione calcola la posizione verticale di ogni blocco seguendo l'ordine dei blocchi ed utilizza
|
||||
@@ -54,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
|
||||
@@ -71,7 +91,16 @@ export default class GanttRow extends Vue {
|
||||
get rowHeight() {
|
||||
let result = Math.max(...this.blocksInSection.map(b => this.verticalPosition(b) + this.ganttOptions.elementHeight + this.ganttOptions.elementPadding * 2)) * this.zoomFactor;
|
||||
if (!Number.isNaN(result) && Number.isFinite(result)) return result;
|
||||
return 0;
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Watch("rowHeight")
|
||||
rowHeightChanged(n, o) {
|
||||
if (n != o) this.$emit("heightChanged");
|
||||
}
|
||||
|
||||
mounted() {
|
||||
this.rowHeightChanged(0, this.rowHeight);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,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;
|
||||
|
||||
|
||||
+19
-13
@@ -1,18 +1,24 @@
|
||||
<template>
|
||||
<g class="gantt-row" :transform="`translate(0 ${paddingVertical})`">
|
||||
<g
|
||||
:transform="`translate(${ganttOptions.stepDuration * ganttOptions.secondSize + paddingHorizontal} 0) scale(${zoomFactor} ${zoomFactor})`"
|
||||
>
|
||||
<template v-for="b in blocksInSection.filter( i=> i.visible)">
|
||||
<block
|
||||
:key="b.id"
|
||||
:value="b"
|
||||
:x="startPosition(b)"
|
||||
:y="verticalPosition(b) + ganttOptions.elementPadding"
|
||||
stroke="#999"
|
||||
stroke-width="2"
|
||||
/>
|
||||
</template>
|
||||
<g>
|
||||
<rect x="0" y="0" width="100%" :height="rowHeight" class="background"></rect>
|
||||
</g>
|
||||
<g :transform="`scale(${zoomFactor} ${zoomFactor})`">
|
||||
<g
|
||||
class="pad"
|
||||
:transform="`translate(${ganttOptions.stepDuration * ganttOptions.secondSize + paddingHorizontal} 0)`"
|
||||
>
|
||||
<template v-for="b in blocksInSection.filter( i=> i.visible)">
|
||||
<block
|
||||
:key="b.id"
|
||||
:value="b"
|
||||
:x="startPosition(b)"
|
||||
:y="verticalPosition(b) + ganttOptions.elementPadding"
|
||||
stroke="#999"
|
||||
stroke-width="2"
|
||||
/>
|
||||
</template>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="0" y="0" width="25" :height="rowHeight " fill="#cfcfcf"></rect>
|
||||
|
||||
@@ -4,6 +4,24 @@ 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", "rx", "ry"],
|
||||
"path": ["fill", "stroke", "stroke-width"],
|
||||
"circle": ["fill", "stroke", "stroke-width"],
|
||||
"line": ["stroke", "stroke-width"],
|
||||
"text": ["fill", "font-size", "text-anchor"],
|
||||
"polygon": ["stroke", "fill"],
|
||||
"foreignobject": [],
|
||||
"div": [
|
||||
"align-items", "justify-content", "font-family", "flex-flow", "font-size",
|
||||
"height", "padding", "color", "display", "width", "border-radius",
|
||||
"background-color", "transform"],
|
||||
"span": ["letter-spacing", "text-transform", "background-color"]
|
||||
};
|
||||
|
||||
@Component({
|
||||
components: {
|
||||
@@ -18,6 +36,96 @@ 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;
|
||||
|
||||
this.$nextTick(() => {
|
||||
|
||||
|
||||
var oDOM = (this.$refs.mainContainer as SVGElement).cloneNode(true)
|
||||
this.exportSVGWithStyle(oDOM, this.$refs.mainContainer)
|
||||
var data = new XMLSerializer().serializeToString(oDOM);
|
||||
|
||||
var DOMURL = (window.URL || window.webkitURL);
|
||||
|
||||
var svgBlob = new Blob([data], { type: 'image/svg+xml;charset=utf-8' });
|
||||
// var url = DOMURL.createObjectURL(svgBlob);
|
||||
recipeService.UploadImage(svgBlob, this.panel.nomeRicetta.replace('.rcp', '') + ".svg");
|
||||
this.ganttOptions.printing = false;
|
||||
// window.open(url, '_blank')
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
exportSVGWithStyle(ParentNode, OrigData) {
|
||||
var Children = ParentNode.childNodes;
|
||||
var OrigChildDat = OrigData.childNodes;
|
||||
|
||||
for (var cd = 0; cd < Children.length; cd++) {
|
||||
var Child = Children[cd];
|
||||
|
||||
var TagName = (Child.tagName as string)?.toLowerCase();
|
||||
|
||||
if (ContainerElements.indexOf(TagName) != -1) {
|
||||
this.exportSVGWithStyle(Child, OrigChildDat[cd])
|
||||
} else if (TagName in RelevantStyles) {
|
||||
var StyleDef = window.getComputedStyle(OrigChildDat[cd]);
|
||||
|
||||
var StyleString = "";
|
||||
for (var st = 0; st < RelevantStyles[TagName].length; st++) {
|
||||
StyleString += RelevantStyles[TagName][st] + ":" + StyleDef.getPropertyValue(RelevantStyles[TagName][st]) + "; ";
|
||||
}
|
||||
|
||||
Child.setAttribute("style", StyleString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get PadX() {
|
||||
let w = ((this.$refs.mainContainer as any)?.clientWidth ?? 0) / 3;
|
||||
if (this.follow && w && this.currentTime * this.ganttOptions.secondSize > w)
|
||||
return -(this.currentTime * this.ganttOptions.secondSize - w);
|
||||
return this.padX;
|
||||
}
|
||||
|
||||
set PadX(value: number) {
|
||||
if (!this.follow)
|
||||
this.padX = value;
|
||||
}
|
||||
|
||||
get PadY() {
|
||||
return this.padY;
|
||||
}
|
||||
set PadY(value: number) {
|
||||
this.padY = value;
|
||||
}
|
||||
|
||||
follow: boolean = false;
|
||||
|
||||
get canFollow() {
|
||||
if (this.follow && this.currentTime > 1)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
activeBlockYPosition = 0;
|
||||
updateVerticalPosition(b, e) {
|
||||
this.activeBlockYPosition = b + e;
|
||||
}
|
||||
|
||||
@Prop({ default: 1 })
|
||||
zoomFactor: number;
|
||||
|
||||
@@ -38,7 +146,8 @@ export default class Gantt extends Vue {
|
||||
block_body_Vacuum_minDuration: 5,
|
||||
block_body_Cooling_minDuration: 10,
|
||||
block_body_Extraction_minDuration: 5,
|
||||
block_padding: 0.01
|
||||
block_padding: 0.01,
|
||||
printing: false
|
||||
};
|
||||
|
||||
@Prop({ default: 0 })
|
||||
@@ -48,10 +157,6 @@ export default class Gantt extends Vue {
|
||||
return element?.rowHeight || 0;
|
||||
}
|
||||
|
||||
mounted() {
|
||||
this.$nextTick(() => this.$forceUpdate())
|
||||
}
|
||||
|
||||
startPan(event: MouseEvent | TouchEvent) {
|
||||
this.lastPosition = this.getSvgCoords(event);
|
||||
}
|
||||
@@ -66,8 +171,8 @@ export default class Gantt extends Vue {
|
||||
if (event.type == "touchmove" || (event.type == "mousemove" && (event as MouseEvent).buttons)) {
|
||||
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.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);
|
||||
|
||||
|
||||
|
||||
@@ -110,6 +215,17 @@ export default class Gantt extends Vue {
|
||||
return { x, y };
|
||||
}
|
||||
|
||||
updateRow() {
|
||||
this.$forceUpdate()
|
||||
}
|
||||
|
||||
toggleFollow() {
|
||||
this.follow = !this.follow;
|
||||
|
||||
if (this.follow)
|
||||
this.padX = 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -141,4 +257,5 @@ export interface IGanttOptions {
|
||||
block_body_Cooling_minDuration: number;
|
||||
block_body_Extraction_minDuration: number;
|
||||
block_padding: number;
|
||||
printing: boolean;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user