Compare commits

...

260 Commits

Author SHA1 Message Date
Samuele Locatelli 125532639a Merge branch 'develop' of https://bitbucket.org/ncarminati/cms_thermo_active into develop 2020-06-16 18:04:43 +02:00
Samuele Locatelli fac2b5fa8d Merge branch 'develop' into feature/add/risk 2020-06-16 18:03:45 +02:00
Samuele Locatelli 928c0d20f9 Fixed method for WebAPI + signal-r interference 2020-06-16 18:02:42 +02:00
= 685c77e721 Merge remote-tracking branch 'CMS/develop' into develop 2020-06-16 15:59:14 +02:00
= 808e3f1223 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-16 15:58:52 +02:00
Alessio 3c2bc0a48e fix a slider 2020-06-16 15:33:24 +02:00
Alessio ef98320bdc fixing colors 2020-06-16 15:20:01 +02:00
Alessio 9094d3eb50 other add and fix for svgchart 2020-06-16 15:08:15 +02:00
Alessio a4c704fad6 add svgchart to other modals 2020-06-16 14:42:53 +02:00
= 7915adfc3c fix prevuoto 2020-06-16 14:13:45 +02:00
= be7f268d2f fix layout 2020-06-16 14:04:58 +02:00
= 5064d30221 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-16 13:52:40 +02:00
= f0ceb42b92 svgchart 2020-06-16 13:52:32 +02:00
Alessio a135ad689a fix chart 2020-06-16 12:13:11 +02:00
Alessio 29020bb948 add chart 2020-06-16 11:44:36 +02:00
Alessio e0bd76d0b7 fix unit of measure 2020-06-16 11:44:25 +02:00
Alessio 3a18b0e5d3 fix avvio-produzione 2020-06-16 08:55:44 +02:00
Samuele Locatelli 87703058ac Merge branch 'develop' into feature/add/risk 2020-06-16 08:29:44 +02:00
Samuele Locatelli 6776a4894d Added readout for area + fix others 2020-06-16 08:29:27 +02:00
Alessio cd478f16e4 autoscroll and focus 2020-06-16 08:27:56 +02:00
Samuele Locatelli 695d6841f0 Merge branch 'develop' into feature/add/risk 2020-06-15 19:31:25 +02:00
Samuele Locatelli 6f81be6ebe Removed old method + fix startup 2020-06-15 19:29:17 +02:00
Samuele Locatelli 41563cc332 Removed old single param write method 2020-06-15 19:12:22 +02:00
= 2493f0117e Merge remote-tracking branch 'CMS/develop' into develop 2020-06-15 17:13:28 +02:00
= 8370141583 fix 2020-06-15 17:13:05 +02:00
= 7fe7539fe8 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-15 17:12:57 +02:00
= 8f7c780edd fix binding 2020-06-15 17:12:07 +02:00
Alessio 040eed1fcd autoscroll and focus on formato and pirometro 2020-06-15 16:55:36 +02:00
Samuele E. Locatelli f5f41e4c65 Merge branch 'develop' of https://bitbucket.org/ncarminati/cms_thermo_active into develop 2020-06-15 16:46:34 +02:00
Samuele E. Locatelli 2043417668 changed thread period (250->500) for recipe 2020-06-15 16:44:46 +02:00
= 579fa79bb6 autoscroll and focus 2020-06-15 16:37:40 +02:00
= d482a7551b Merge remote-tracking branch 'CMS/develop' into develop 2020-06-15 16:20:34 +02:00
= d3a9de2a3b Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-15 16:10:40 +02:00
= 9347ed95b7 fix recipe confirm & signarl comunications 2020-06-15 16:10:32 +02:00
Alessio 90e03e2160 add data bounding on the svg images 2020-06-15 15:45:35 +02:00
Samuele Locatelli ec6ba38e8b Merge branch 'feature/add/risk' into develop 2020-06-15 14:47:50 +02:00
Samuele Locatelli 6de2453bb4 Merge branch 'develop' of https://bitbucket.org/ncarminati/cms_thermo_active into develop 2020-06-15 14:47:40 +02:00
Samuele Locatelli 935d7879e7 Added signal-r send for data 2020-06-15 14:46:25 +02:00
= c0306d9644 Merge remote-tracking branch 'CMS/develop' into develop 2020-06-15 13:30:28 +02:00
= 80e67bb793 fix scritture signalr... 2020-06-15 13:30:04 +02:00
Alessio ebd0921753 writing data server side (other modals) 2020-06-15 12:38:15 +02:00
Samuele Locatelli fa54e5d1e9 Merge branch 'feature/add/risk' into develop 2020-06-15 11:40:48 +02:00
Samuele Locatelli 55e1961cf2 Added methods for mode selection 2020-06-15 11:40:30 +02:00
Samuele Locatelli 1f110b009b fixed ScaleFactor mgmt 2020-06-15 10:25:55 +02:00
Samuele Locatelli 6fafed419f INitial ScaleFactor setup 2020-06-15 10:19:51 +02:00
Alessio 4c5a61d69f Merge remote-tracking branch 'origin/develop' into develop 2020-06-15 10:03:23 +02:00
Alessio cd18c6a9d3 adding and fix positioning of labels in the svg 2020-06-15 10:03:06 +02:00
Alessio 23df0dbc24 adding and fix positioning of label for the data 2020-06-15 10:01:23 +02:00
Samuele Locatelli fbe3f68397 Merge branch 'develop' of https://bitbucket.org/ncarminati/cms_thermo_active into develop 2020-06-15 09:05:06 +02:00
Samuele E. Locatelli 0a1400389f update try-catch on NcAdapter for status strb/ack 2020-06-15 09:03:40 +02:00
Samuele E. Locatelli ae6767a89d Merge branch 'develop' of https://bitbucket.org/ncarminati/cms_thermo_active into develop 2020-06-12 22:26:59 +02:00
Samuele E. Locatelli d3f48fdcdd added try/catch on str decode 2020-06-12 22:26:35 +02:00
Samuele Locatelli 903f1a9638 ok MsgBlock setup, not ok type/section serializ 2020-06-12 21:01:03 +02:00
Samuele Locatelli 1155cf1680 Merge branch 'feature/add/risk' into develop 2020-06-12 19:17:41 +02:00
Samuele Locatelli 6f51ff274a note on error on reading 2020-06-12 19:16:44 +02:00
Samuele Locatelli 4030919f9e Preliminary add of ModBlock configurazion and load 2020-06-12 19:16:31 +02:00
Samuele Locatelli e56a5daefc added modules error msg 2020-06-12 18:42:32 +02:00
Samuele Locatelli 6d2ffff97b fix recipe error msg 2020-06-12 18:42:20 +02:00
Samuele Locatelli 134aaf31d4 refresh classname step --> thermo 2020-06-12 18:42:00 +02:00
Samuele Locatelli 7b76ea602e Fix logging in warmers WebApi 2020-06-12 18:32:21 +02:00
Samuele Locatelli 108cd688cd Added log in recipe WebApi methods 2020-06-12 18:22:53 +02:00
Samuele Locatelli 06eb1a4bc8 fix logger class name 2020-06-12 18:22:29 +02:00
Samuele Locatelli 08dd11701e Merge branch 'feature/add/risk' into develop 2020-06-12 17:50:19 +02:00
Samuele Locatelli 2f5eaed707 start new version 2020-06-12 17:49:09 +02:00
Samuele E. Locatelli 7d072f9bd6 check condition for recipeLiveData consistence 2020-06-12 17:45:15 +02:00
Samuele Locatelli cb72e13724 Merge branch 'feature/add/risk' into develop 2020-06-12 17:18:56 +02:00
Samuele Locatelli 6e5bf0888f change LiveData init 2020-06-12 17:17:33 +02:00
Samuele Locatelli 4fa253fd3b fixn recipe editing for action required too early 2020-06-12 17:17:05 +02:00
Samuele Locatelli 169c07fc1a new method for material dimension % calc 2020-06-12 17:00:15 +02:00
= fbe619e498 scrittura dati lato server (formato) 2020-06-12 16:59:03 +02:00
= e3f9a09063 layout select 2020-06-12 16:33:51 +02:00
= 097de061bf fix layout box in article 2020-06-12 16:19:19 +02:00
= 1c623cf512 Merge remote-tracking branch 'CMS/develop' into develop 2020-06-12 16:08:05 +02:00
= cbaa4bb359 fix loading stylecss 2020-06-12 16:06:05 +02:00
= 1e5fd252d4 fix layout bordered labels 2020-06-12 15:55:07 +02:00
Alessio d8580afd77 Merge remote-tracking branch 'origin/develop' into develop 2020-06-12 15:45:45 +02:00
Alessio ce5869f90a add label 2020-06-12 15:45:30 +02:00
Alessio dd8793a31d add class for the svg's labels 2020-06-12 15:44:52 +02:00
= 5c17d598bb fix import togglebutton 2020-06-12 15:29:43 +02:00
Samuele Locatelli 82a25ae070 completed test for ACK to PLC 2020-06-12 15:07:22 +02:00
= 614105c35a fix layout raffreddamento 2020-06-12 15:01:18 +02:00
= fd6648432f fix layout controstampo 2020-06-12 14:56:02 +02:00
= 4a17830c07 controstampo 2020-06-12 14:25:20 +02:00
Alessio 0b5a49122d Merge remote-tracking branch 'origin/develop' into develop 2020-06-12 14:16:08 +02:00
Alessio 407d95e8e3 add some cards in the modals 2020-06-12 14:15:55 +02:00
= 6032712414 fix imbutitura 2020-06-12 14:11:04 +02:00
= 1fb1bba657 fix layout pirometro 2020-06-12 13:59:16 +02:00
= 75b4337c75 fix riscalti rendering delay 2020-06-12 13:02:07 +02:00
= 40664d6136 fix riscaldi 2020-06-12 13:00:36 +02:00
= 73d5b93c59 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-12 12:54:13 +02:00
= bb80dc5a38 fix layout riscaldi 2020-06-12 12:52:47 +02:00
Alessio e070a6be6e add some cards in the modals 2020-06-12 12:29:06 +02:00
= 34779f5a31 fix layout ciclo 2020-06-12 12:13:51 +02:00
= c80cdb8644 fix layout quote 2020-06-12 11:48:18 +02:00
Samuele Locatelli 50d0c4a948 Added flux for recipe/risk setup conf on request 2020-06-12 11:39:26 +02:00
= a5436bb717 fix layout formato 2020-06-12 11:33:00 +02:00
Alessio 2f9dbd8111 fix 2020-06-12 11:12:02 +02:00
= 8abc6f00c0 fix modal height 2020-06-12 10:55:58 +02:00
= a282429e3c Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-12 10:46:46 +02:00
Alessio 49c85f347a delete previous buttons zoom 2020-06-12 10:45:24 +02:00
Alessio f58068b4f7 Merge remote-tracking branch 'origin/develop' into develop 2020-06-12 10:41:51 +02:00
Alessio 11fb2c2355 fix binding riscaldi 2020-06-12 10:41:29 +02:00
= ba3a340815 .keyboard layout 2020-06-12 09:58:17 +02:00
= 8a1b28020e pan & zoom su riscaldi 2020-06-12 09:51:30 +02:00
= 00dcc638fc fix footer 2020-06-12 09:37:22 +02:00
Samuele Locatelli cd2f21fe01 preliminary management of config request strb/ack 2020-06-11 19:45:31 +02:00
= ebbaa76054 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-11 18:32:17 +02:00
= 8324bcf297 riscaldi 2020-06-11 18:28:50 +02:00
Alessio f9de12a971 various fix in the modals 2020-06-11 16:38:28 +02:00
Alessio 2f8c6d643a add some property 2020-06-11 15:04:35 +02:00
Samuele Locatelli b14d506eb2 Merge branch 'feature/add/risk' into develop 2020-06-11 14:33:18 +02:00
= ccf8cd265e warmers 2020-06-11 14:31:20 +02:00
Samuele Locatelli 82e400b08d COmpleted warmers read/save data 2020-06-11 14:31:03 +02:00
= dd6f280c96 Merge remote-tracking branch 'teamdev/newfeature/Warmers' into develop 2020-06-11 14:20:47 +02:00
Alessio ade296ce56 Merge remote-tracking branch 'origin/develop' into develop 2020-06-11 14:02:50 +02:00
Alessio 8dd26f73d1 fix numerics, sliders and labels 2020-06-11 14:00:00 +02:00
Samuele Locatelli a03571793e Added partial methods for warmers sale post edit 2020-06-11 13:18:08 +02:00
Samuele Locatelli 1d77adc01c Fix recipe load / save with warmers 2020-06-11 13:17:33 +02:00
= 73be1bb58b rimozione commenti di property non più usate 2020-06-11 12:44:33 +02:00
= a5a76d35c4 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-11 12:43:50 +02:00
= 782caef28a quote 2020-06-11 12:42:39 +02:00
= 61a5c50476 formato & quote. 2020-06-11 12:29:30 +02:00
Alessio 9fac539cfd fix numerics, sliders and labels 2020-06-11 12:28:08 +02:00
= d0276438a4 fix binding formato 2020-06-11 12:01:19 +02:00
= 4f947f0b65 fix slider 2020-06-11 11:17:49 +02:00
Samuele Locatelli c7b96e4d78 Merge branch 'feature/add/risk' into develop 2020-06-11 11:11:14 +02:00
Samuele Locatelli 3a17e13224 fix div0 for VUMin and warmers config setup tested 2020-06-11 11:10:39 +02:00
Samuele Locatelli f28cbfe2ec fix board config: 16 channels 2020-06-11 11:10:15 +02:00
= 3efcfef9d8 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-11 10:56:21 +02:00
= e5961d7685 keyboard postion on focus 2020-06-11 10:54:21 +02:00
Alessio 01ac4b071e fix get on the service 2020-06-11 10:48:03 +02:00
Alessio 06f85a3e3e fix buttons of the footer 2020-06-11 10:44:44 +02:00
Alessio 2a51a1535d add put functions to the service 2020-06-11 10:09:55 +02:00
Alessio d987cef604 add service and store for Warmers 2020-06-11 10:07:40 +02:00
Samuele Locatelli 5400408355 start new versione (to check warmers config) 2020-06-10 19:21:36 +02:00
Samuele Locatelli 78c046f117 Merge branch 'feature/add/risk' into develop 2020-06-10 19:15:31 +02:00
Samuele Locatelli 339c9e1220 Setup params write methods added 2020-06-10 19:14:32 +02:00
= c3b211fa01 layout footer bar 2020-06-10 17:52:53 +02:00
= eca0787248 fix minifooter 2020-06-10 17:31:28 +02:00
= 0bda8aa748 layout... 2020-06-10 17:26:51 +02:00
= 2f8277924a modali e fix disegno 2020-06-10 16:29:40 +02:00
Samuele Locatelli 1862fe641b Fix & test write for CH load (1..1024) 2020-06-10 16:29:27 +02:00
= fd0c51a72d pulizia 2020-06-10 16:18:27 +02:00
= 4a3dba9399 pulizia 2020-06-10 16:13:45 +02:00
= eaff5729dc Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-10 15:25:02 +02:00
= aa2bd2d1a1 fix formato 2020-06-10 15:24:54 +02:00
Alessio 6586840f27 fix some property 2020-06-10 14:48:45 +02:00
= 8b447ade4a fix footer buttons layout 2020-06-10 14:46:39 +02:00
Alessio 20a864bfb5 fix all the numeric 2020-06-10 14:19:19 +02:00
Alessio 819051002e fix formato 2020-06-10 13:44:10 +02:00
= d2e0a4eb15 fix loop modali 2020-06-10 12:53:55 +02:00
= c6a108d29a refactoring processo apertura modale 2020-06-10 12:48:05 +02:00
= 133bec82e4 fix 2020-06-10 12:22:22 +02:00
= 9aff944b49 Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-10 12:21:27 +02:00
= d51c900173 fix 2020-06-10 12:20:50 +02:00
= a87b2623e0 refactoring formato e chiamata modali 2020-06-10 12:19:27 +02:00
Alessio 6d98d185f7 cancelled showTast 2020-06-10 12:13:42 +02:00
Alessio 8743f1f924 replaced input with numeric and deleted default from the property 2020-06-10 12:10:58 +02:00
= 0d042b8698 rimozione del tastierino ovunque 2020-06-10 11:40:31 +02:00
= e29358c4ef Merge remote-tracking branch 'teamdev/develop' into develop 2020-06-10 11:28:43 +02:00
= 44bb957508 components 2020-06-10 11:28:25 +02:00
Alessio 5f7941f479 add sliders to stampo on formato modal 2020-06-10 10:37:11 +02:00
Samuele Locatelli d21efcb78f Merge branch 'feature/add/prodData' into feature/add/risk 2020-06-09 19:14:29 +02:00
Samuele Locatelli 6d52ccdc9c Continuing warmers & recipe fix & config 2020-06-09 19:13:57 +02:00
= c857cffbe5 fix modal height 2020-06-09 12:36:05 +02:00
= d71bfe36ba binding gauge header 2020-06-09 12:32:11 +02:00
= b52c2d740f fix input edit 2020-06-09 12:08:09 +02:00
= 2fd2012dd3 fix layout 2020-06-09 11:29:27 +02:00
= d7859a61fa fix layout maschera principale 2020-06-09 11:11:09 +02:00
= 835ba31638 Merge remote-tracking branch 'teamdev/newfeature/ricetta' into develop 2020-06-09 10:40:34 +02:00
= 1ea2f3182a Merge branch 'newfeature/riscaldi' into develop 2020-06-09 10:28:34 +02:00
Samuele Locatelli bdc0ce1aa5 Added method for Prod Info & Cycle data read 2020-06-08 22:30:37 +02:00
Samuele Locatelli 31519c303b Added signal-r prod data push 2020-06-08 22:07:37 +02:00
Samuele Locatelli 0cfbbe069a Fix Filesystem IO 4 recipe 2020-06-08 21:22:14 +02:00
Samuele E. Locatelli 04f9a8155e Update vers number 2020-06-08 19:46:04 +02:00
Samuele Locatelli de8daee8f9 Merge branch 'feature/add/risk' into develop 2020-06-08 19:41:22 +02:00
Samuele Locatelli 8ccd5fc06b Added load save update methods 2020-06-08 19:41:02 +02:00
Alessio d653391253 fix riscaldi modal 2020-06-08 16:37:52 +02:00
Alessio 7ba5090dd3 fix riscaldi superiori 2020-06-08 16:24:22 +02:00
Samuele Locatelli 698fd47177 Added file method for template/current/load/save 2020-06-08 15:44:59 +02:00
Alessio 08c6ca521a fix sub-menù 2020-06-08 14:38:39 +02:00
Alessio 8d661f0bda fix sub-menù 2020-06-08 12:21:15 +02:00
Alessio a44813c8a4 add the sub-menù to the components in production 2020-06-08 11:34:03 +02:00
Samuele Locatelli f48ee73ede Merge branch 'feature/add/risk' into develop 2020-06-08 11:14:39 +02:00
Samuele Locatelli 3dedafd43f update load/save call from WebApi 2020-06-08 11:02:18 +02:00
Samuele Locatelli 020d8304a5 DRAFT: Recipe local persistence file 2020-06-05 23:13:46 +02:00
Samuele Locatelli 2a66160e84 Added warmers resistances output 2020-06-05 21:28:25 +02:00
Samuele Locatelli a52d76bb5b Abbozzata gestione esterna x warmers 2020-06-05 19:54:38 +02:00
Samuele Locatelli 112f6ed697 refresh state machine status 2020-06-05 19:47:17 +02:00
Samuele Locatelli 9798b5a993 Added overview real calculation 2020-06-05 19:38:30 +02:00
Samuele Locatelli c28c77bec9 Merge branch 'feature/add/risk' into develop 2020-06-05 18:51:35 +02:00
Samuele Locatelli 9232597888 UPdate methods for recipe edit confirm/cancel 2020-06-05 18:51:15 +02:00
Alessio f3b3028167 fix gauge positioning and dimensions 2020-05-25 16:28:24 +02:00
Damiano 6dc2678ecb Svg modifies dashboard 2020-05-22 16:29:16 +02:00
Alessio 99ea0958cd fix input tag 2020-05-22 15:47:25 +02:00
Alessio 2c578a7944 add function to tastierino 2020-05-22 15:15:44 +02:00
Alessio 2237e78dd0 fix call for tastierino and add prop for value 2020-05-22 13:01:09 +02:00
Alessio 71e16325b9 fix and add tastierino to other modals 2020-05-22 10:33:07 +02:00
Alessio 5f2540210f Merge branch 'newfeature/dashboard' into newfeature/ricetta 2020-05-22 08:31:48 +02:00
Damiano 42d162c029 Merge remote-tracking branch 'origin/newfeature/dashboard' into newfeature/dashboard 2020-05-21 16:05:47 +02:00
Damiano 3b1528fd07 fix modifies dashboard3 component 2020-05-21 16:02:54 +02:00
Alessio ef2f3d7874 fix style archinterface 2020-05-21 15:08:38 +02:00
Alessio 16782271a4 fix dashboard and archinterface 2020-05-21 13:52:10 +02:00
Damiano 955d52b977 fix position elements dashboard 2020-05-21 12:00:33 +02:00
Alessio 439c70f70d fix typing for tag input 2020-05-21 11:17:41 +02:00
Alessio d86e6b053a fix reference of recipe in the modals 2020-05-21 10:38:22 +02:00
Alessio 36099630a9 add hr to the dashboard 2020-05-21 09:58:46 +02:00
Alessio e42266ffc2 fix reference of recipe in the modals 2020-05-21 09:47:54 +02:00
Alessio d0fabaac69 add recipeService calls to main 2020-05-20 16:47:13 +02:00
Alessio 22310fa8a7 add recipeService 2020-05-20 16:19:23 +02:00
Alessio 0365bfd7b2 Merge branch 'develop' into newfeature/ricetta 2020-05-20 14:54:52 +02:00
Alessio 786a0b234d fix dashboard 2020-05-20 12:59:21 +02:00
Alessio 7a52c9ffa5 fix dashboard 2020-05-20 11:39:25 +02:00
Alessio eeded21849 Merge branch 'newfeature/programmazione-preriscaldo' into newfeature/dashboard 2020-05-20 09:38:13 +02:00
Alessio 414d8ab889 rename dashboard.less 2020-05-20 09:35:23 +02:00
Alessio a353a0f628 delete row.svg 2020-05-20 09:30:39 +02:00
Alessio 5ed8386e2b fix dashboard 2020-05-20 09:29:16 +02:00
Francesco Guerrieri 74c85acd2b fix styles svg dashboard 2020-05-19 20:02:54 +02:00
Alessio a39cefbfba fix z-index 2020-05-19 15:51:25 +02:00
Alessio 328d5f618e fix button close of prerisclado dashboard 2020-05-19 15:22:38 +02:00
Alessio ada12efca2 fix preriscaldo dashboard 2020-05-19 15:19:13 +02:00
Alessio 20a271290d fix preriscaldo dashboard 2020-05-19 15:15:44 +02:00
Damiano 74a998696f optimization dashboard component 2020-05-18 17:48:45 +02:00
Alessio 2e8f0f6066 fix svg dashboard 2020-05-18 15:21:58 +02:00
Alessio 2199c86229 add second dashboard 2020-05-18 15:09:06 +02:00
Damiano e93711fc96 fix background color dashboard 2020-05-18 14:55:55 +02:00
Alessio f4223d6de0 fix opening dashboard 2020-05-18 12:51:24 +02:00
Damiano 61ad9a934f Merge remote-tracking branch 'origin/newfeature/programmazione-preriscaldo' into newfeature/programmazione-preriscaldo 2020-05-18 12:24:48 +02:00
Alessio fcab3a8e3d fix dashboard gauge 2020-05-18 12:20:00 +02:00
Damiano 769699a130 add-components-dashboard 2020-05-18 11:54:52 +02:00
Alessio 02a8dc4ef7 fix positioning dashboard 2020-05-18 11:54:14 +02:00
Alessio 8efdf51863 fix background dashboard 2020-05-18 11:51:16 +02:00
Alessio bbec4b5306 fix the merge of the dashboard 2020-05-18 11:42:52 +02:00
Francesco Guerrieri 06d4dc316d Merge remote-tracking branch 'origin/newfeature/programmazione-preriscaldo' into newfeature/programmazione-preriscaldo 2020-05-18 11:30:35 +02:00
Francesco Guerrieri 1bf5534380 fix styles svg 2020-05-18 11:27:12 +02:00
Alessio 1fb1445677 Merge branch 'newfeature/paddle' into newfeature/dashboard 2020-05-18 11:16:24 +02:00
Damiano 39bd0a2eb8 modify dashboard3 drawing 2020-05-18 11:04:20 +02:00
Alessio b41417da56 fix dashboard 2020-05-18 11:03:53 +02:00
Damiano 7d496ee811 fix row svg-dashboard 2020-05-18 09:56:24 +02:00
Francesco Guerrieri 1a3f7972a1 fixed styles dashboard header 2020-05-15 16:45:23 +02:00
Alessio 535082d311 fix svg dashboard 2020-05-15 15:49:42 +02:00
Damiano ead2383084 fix path-svg 2020-05-15 15:41:19 +02:00
Francesco Guerrieri 627fd320ae fix style dashboard 2020-05-15 15:09:11 +02:00
Francesco Guerrieri c14e24caa2 fix status dashboard 2020-05-15 10:02:24 +02:00
Francesco Guerrieri 492836c2eb fix styles dashboard 2020-05-15 09:32:54 +02:00
Alessio fe3374c16a fix dashboard 2020-05-14 16:59:29 +02:00
Alessio 69767cf627 fix dashboard 2020-05-14 16:43:25 +02:00
Damiano f46e818d18 Auto stash before merge of "newfeature/programmazione-preriscaldo" and "origin/newfeature/programmazione-preriscaldo" 2020-05-14 16:40:56 +02:00
Alessio 4b3b0b6228 fix dashboard 2020-05-14 11:13:48 +02:00
Alessio 2a030da24a fix archinterface and dashboard 2020-05-14 11:02:47 +02:00
Francesco Guerrieri 98ecbe05de fix arch interface 2020-05-14 09:48:49 +02:00
Alessio 0c48eec85c fix dashboard 2020-05-14 09:44:44 +02:00
Damiano eb631908bf svg drawings dashboard 2020-05-13 16:56:27 +02:00
Francesco Guerrieri a2fa132ee2 insert arch interface in header dashboard 2020-05-13 12:23:19 +02:00
Francesco Guerrieri 92380255a6 fix component dashboard 2020-05-13 11:57:58 +02:00
francesco.guerrieri 3532ef89f5 add dashboard component 2020-05-11 14:11:17 +02:00
Alessio 9a21aae816 fix dashboard 2020-05-08 15:24:21 +02:00
Damiano 4830160763 fix "circle-dashboard" 2020-05-08 12:31:31 +02:00
Alessio 821f0276c7 fix style dashboard 2020-05-08 12:00:12 +02:00
Alessio 4b2553056c add dashboard 2020-05-07 16:25:36 +02:00
294 changed files with 14649 additions and 8887 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -14,6 +14,7 @@
<xs:element name="name" type="xs:string" />
<xs:element name="description" type="xs:string" />
<xs:element name="format" type="xs:string" />
<xs:element name="scaleFactor" type="xs:int" default="1"/>
</xs:all>
</xs:complexType>
</xs:element>
+28
View File
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Thermo.Active.Config
{
/// <summary>
/// Live data for Thermo Active
/// </summary>
public class LiveData
{
/// <summary>
/// Current loaded recipe
/// </summary>
public string RecipeName = "current.json";
/// <summary>
/// Dictionary of all parameters and values
/// </summary>
public Dictionary<string, double> RecipeParameters;
/// <summary>
/// Dictionary of all channels and relative setpoints
/// </summary>
public Dictionary<int, int> ChannelSetpoints;
}
}
@@ -0,0 +1 @@

+13 -4
View File
@@ -32,10 +32,8 @@ namespace Thermo.Active.Config
public static List<NcSoftKeysModel> NcSoftKeysConfig;
public static List<AlarmsConfigModel> InitialAlarmsConfig;
public static List<HeadsConfigModel> HeadsConfig;
public static List<RecipeConfigModel> RecipeConfig;
public static List<ModBlockConfigModel> ModBlockConfig;
public static List<RiskResistModel> RiskResistConfig;
public static List<RiskChannelModel> RiskChannelConfig;
public static CmsConnectConfigModel CmsConnectConfig;
public static AreasConfigModel ProductionConfig;
@@ -55,5 +53,16 @@ namespace Thermo.Active.Config
public static List<string> MacrosConfig;
public static string CMSMainProgramContent;
// Thermo
public static List<RecipeConfigModel> RecipeConfig;
public static List<ModBlockConfigModel> ModBlockConfig;
public static List<RiskResistModel> RiskResistConfig;
public static List<RiskChannelModel> RiskChannelConfig;
public static List<RiskBoardModel> RiskBoardConfig;
public static LiveData RecipeLiveData = new LiveData();
}
}
+244 -12
View File
@@ -15,6 +15,7 @@ using System.Xml.Serialization;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using static Thermo.Active.Utils.SupportFunctions;
using Newtonsoft.Json;
namespace Thermo.Active.Config
{
@@ -39,7 +40,28 @@ namespace Thermo.Active.Config
// ReadCMSConnectConfig();
ReadMacros();
ReadScadaFile();
//ReadMainProgram();
}
catch (XmlException ex)
{
ExceptionManager.ManageError(ERROR_LEVEL.FATAL,
"Error while reading file: " + ex.SourceUri +
"\n Error: " + ex.Message,
true
);
}
catch (Exception ex)
{
var message = ex.Message;
if (ex.InnerException != null)
message += "\n" + ex.InnerException.Message;
ExceptionManager.ManageError(ERROR_LEVEL.FATAL, message, true);
}
}
public static void ReadLastRecipe()
{
try
{
ReadLiveData();
}
catch (XmlException ex)
{
@@ -594,7 +616,8 @@ namespace Thermo.Active.Config
SubCategory_2 = x.Element("subCategory_2").Value,
Name = x.Element("name").Value,
Description = x.Element("description").Value,
Format = x.Element("format").Value
Format = x.Element("format").Value,
ScaleFactor = Convert.ToInt16(x.Element("scaleFactor").Value)
})
.ToList();
}
@@ -644,7 +667,8 @@ namespace Thermo.Active.Config
{
Id = Convert.ToInt16(x.Value),
Dimensione = Convert.ToInt16(x.Attribute("dimensione").Value),
Potenza = Convert.ToInt16(x.Attribute("potenza").Value)
Potenza = Convert.ToInt16(x.Attribute("potenza").Value),
Modello = x.Attribute("modello").Value
})
.ToList();
@@ -671,23 +695,52 @@ namespace Thermo.Active.Config
int numCol = -1;
int ResistId = 0;
int oldRow = 0;
int currRow = 0;
RiskChannelConfig = new List<RiskChannelModel>();
int currIdBoard = 0;
RiskBoardConfig = new List<RiskBoardModel>();
RiskResistConfig = new List<RiskResistModel>();
RiskChannelConfig = new List<RiskChannelModel>();
// inizializzo le 64 schede a 0 canali...
for (int idxBoard = 0; idxBoard < 64; idxBoard++)
{
RiskBoardConfig.Add(new RiskBoardModel()
{
IdBoard = idxBoard,
NumChannels = 0
});
}
// ciclo x calcolare i canali
foreach (var riflettore in Riflettori)
{
// ciclo sulle resistente
// ciclo sulle resistenze
foreach (var resistenza in riflettore.Resistenze)
{
// cerco la scheda dato il canale... 16 ch x ogni scheda
currIdBoard = (resistenza.Canale - 1) / 16;
// cerco se ho già la scheda
var boardFound = RiskBoardConfig.Find(item => item.IdBoard == currIdBoard);
if (boardFound == null)
{
RiskBoardConfig.Add(new RiskBoardModel()
{
IdBoard = currIdBoard,
NumChannels = 1
});
}
else
{
boardFound.NumChannels += 1;
}
// cerco se ho già il canale
var found = RiskChannelConfig.Find(item => item.IdChannel == resistenza.Canale);
if (found == null)
var chanFound = RiskChannelConfig.Find(item => item.IdChannel == resistenza.Canale);
if (chanFound == null)
{
// cerco il TIPO...
var riferimento = Riferimenti.Find(x => x.Id == resistenza.Tipo);
if(riferimento!=null)
if (riferimento != null)
{
RiskChannelConfig.Add(new RiskChannelModel()
{
@@ -695,10 +748,15 @@ namespace Thermo.Active.Config
IdReflector = riflettore.Tipo,
SetpointRecipe = 0,
SetpointThermo = 0,
MaxPower = riferimento.Potenza
MaxPower = riferimento.Potenza,
NumResist = 1,
CalcIchMin = riferimento.Modello.Contains("Quarzo")
});
}
else
{
chanFound.NumResist += 1;
}
}
}
@@ -790,15 +848,189 @@ namespace Thermo.Active.Config
.Select(x => x.Value)
.ToList();
}
/// <summary>
/// Try to load live data from json persistence file
/// </summary>
public static bool ReadLiveData()
{
bool answ = false;
if (File.Exists(LIVE_RECIPE_PATH))
{
// load all text data
var rawData = File.ReadAllText(LIVE_RECIPE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
}
catch
{ }
answ = true;
}
else
{
// reload from template...
var rawData = File.ReadAllText(RECIPE_TEMPLATE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
}
catch
{ }
// write template to current data...
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
answ = true;
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to load selected recipe to live data (memory and json persistence file)
/// </summary>
public static bool LoadRecipe(string filePath)
{
bool answ = false;
// check file extension
string fileName = Path.GetFileName(filePath);
if (!fileName.EndsWith(".json"))
{
fileName += ".json";
filePath += ".json";
}
// check filePath...
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
{
// aggiungo base path!
filePath = RECIPE_DIRECTORY + 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);
}
catch
{ }
// update current live data!
SaveRecipeCurrent();
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to load template recipe
/// </summary>
public static bool LoadTemplate()
{
bool answ = false;
// check filePath...
if (File.Exists(RECIPE_TEMPLATE_PATH))
{
answ = true;
// load all text data
var rawData = File.ReadAllText(RECIPE_TEMPLATE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
// update NAME
RecipeLiveData.RecipeName = $"{DateTime.Now:yyyyMMss_HHmmss}.json";
}
catch
{ }
// update current live data!
SaveRecipeCurrent();
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to write live data to json persistence file
/// </summary>
public static bool SaveRecipeCurrent()
{
bool answ = false;
try
{
answ = true;
// serialize
string rawData = JsonConvert.SerializeObject(RecipeLiveData);
// save live!
var dir = Path.GetDirectoryName(LIVE_RECIPE_PATH);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
}
catch
{ }
// rendo se fatto
return answ;
}
/// <summary>
/// Try to save live recipe as NEW template
/// </summary>
public static bool SaveRecipeTemplate()
{
RecipeLiveData.RecipeName = "template.json";
return SaveRecipe(RECIPE_TEMPLATE_PATH);
}
/// <summary>
/// Try to save live recipe to selected filePath
/// </summary>
public static bool SaveRecipe(string filePath)
{
bool answ = false;
try
{
answ = true;
string fileName = Path.GetFileName(filePath);
if (!fileName.EndsWith(".json"))
{
fileName += ".json";
filePath += ".json";
}
// fix name!
RecipeLiveData.RecipeName = fileName;
// serialize
string rawData = JsonConvert.SerializeObject(RecipeLiveData);
// save live!
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
// check filePath...
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
{
// aggiungo base path!
filePath = RECIPE_DIRECTORY + filePath;
}
// save!
File.WriteAllText(filePath, rawData);
}
catch
{ }
// rendo se fatto
return answ;
}
#if false
public static void ReadMainProgram()
{
if (File.Exists(MAIN_PROGRAM_CONFIG_PATH))
{
CMSMainProgramContent = File.ReadAllText(MAIN_PROGRAM_CONFIG_PATH);
}
}
}
#endif
public static string CalculateHash(string filename)
{
@@ -32,6 +32,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
@@ -52,9 +55,13 @@
<SubType>Designer</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Compile Include="LiveData.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ServerConfig.cs" />
<Compile Include="ServerConfigController.cs" />
<Content Include="Recipes\.placeholder.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<EmbeddedResource Include="Report\Programs.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
@@ -175,5 +182,12 @@
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Content Include="Config\Recipes\template.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net462" />
</packages>
+264 -31
View File
@@ -27,6 +27,7 @@ using Thermo.Active.Model.DTOModels.Recipe;
public static class ThreadsFunctions
{
public static int recipeRtCounter = 0;
public static int modulesRtCounter = 0;
public static bool reconnectionIsRunning = false;
private static ConcurrentDictionary<string, long> Timers = new ConcurrentDictionary<string, long>();
@@ -51,11 +52,6 @@ public static class ThreadsFunctions
{
sw.Restart();
//if(errorCounter == MAX_NUM_OF_WATCHDOG_ERROR)
//{
//}
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
@@ -87,6 +83,132 @@ public static class ThreadsFunctions
}
}
/// <summary>
/// Manage status/command words for actions
/// </summary>
public static void ManageStatusCommand()
{
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
ManageLibraryError(libraryError);
while (true)
{
sw.Restart();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Manage status command
libraryError = ncAdapter.ManageStatusCommand();
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException ex)
{
ncAdapter.Dispose();
}
}
/// <summary>
/// Manage action for conf request
/// </summary>
public static void ManageConfRequest()
{
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
ManageLibraryError(libraryError);
while (true)
{
sw.Restart();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Manage status command
libraryError = ncAdapter.ManageConfRequest();
if (libraryError.errorCode != 0)
ManageLibraryError(libraryError);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(2000, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException ex)
{
ncAdapter.Dispose();
}
}
/// <summary>
/// Manage action for conf request
/// </summary>
public static void ManageProdUpdate()
{
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
ManageLibraryError(libraryError);
while (true)
{
sw.Restart();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Manage status command
libraryError = ncAdapter.ManageProdUpdate();
if (libraryError.errorCode != 0)
ManageLibraryError(libraryError);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(1000, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException ex)
{
ncAdapter.Dispose();
}
}
public static void ReadAlarms()
{
NcAdapter ncAdapter = new NcAdapter();
@@ -694,12 +816,94 @@ public static class ThreadsFunctions
ncAdapter.Dispose();
}
}
public static void ReadRecipeData()
public static void ReadProdInfoData()
{
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();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Get new data from PLC
libraryError = ncAdapter.ReadProdInfoData(out ThermoModels.ProdInfoModel prodInfoData);
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_THERMO_PROD_INFO_DATA, null, prodInfoData);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException)
{
ncAdapter.Dispose();
}
}
public static void ReadProdCycleData()
{
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();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Get new data from PLC
libraryError = ncAdapter.ReadProdCycleData(out ThermoModels.ProdCycleModel prodCycleData);
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_THERMO_PROD_CYCLE_DATA, null, prodCycleData);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException)
{
ncAdapter.Dispose();
}
}
public static void ReadRecipeData()
{
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
// Try connection
@@ -713,7 +917,7 @@ public static class ThreadsFunctions
recipeRtCounter--;
bool onlyRt = recipeRtCounter > 0;
//check reset...
recipeRtCounter = recipeRtCounter < 0 ? 5 : recipeRtCounter;
recipeRtCounter = recipeRtCounter < 0 ? 4 : recipeRtCounter;
sw.Restart();
@@ -735,7 +939,7 @@ public static class ThreadsFunctions
// Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException)
@@ -745,11 +949,8 @@ public static class ThreadsFunctions
}
public static void ReadWarmersData()
{
// TODO FIXME
#if false
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
// Try connection
@@ -764,21 +965,60 @@ public static class ThreadsFunctions
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
List<ScadaSchemaModel> scadaToRead = ProductionScadaSchema.Concat(SubscribedScada).ToList();
// Get new data from PLC
libraryError = ncAdapter.ReadScadasData(scadaToRead, out List<DTOScadaModel> scadas);
libraryError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_SCADA_DATA, null, scadas);
// pubblico
MessageServices.Current.Publish(SEND_THERMO_WARMERS_DATA, null, currWarmers);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
// Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(1000, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException)
{
ncAdapter.Dispose();
}
}
public static void ReadAreaData()
{
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();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
// Get new data from PLC... info x area lastra... la % di X / Y
libraryError = ncAdapter.GetWarmMaterialArea(out Dictionary<string, double> currAreaPerc);
if (libraryError.IsError())
ManageLibraryError(libraryError);
// pubblico
MessageServices.Current.Publish(SEND_THERMO_AREA_DATA, null, currAreaPerc);
}
else
RestoreConnection();
sw.Stop();
// Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
@@ -787,16 +1027,12 @@ public static class ThreadsFunctions
catch (ThreadAbortException)
{
ncAdapter.Dispose();
}
#endif
}
}
public static void ReadModulesData()
{
// TODO FIXME
#if false
NcAdapter ncAdapter = new NcAdapter();
Stopwatch sw = new Stopwatch();
try
{
// Try connection
@@ -811,31 +1047,28 @@ public static class ThreadsFunctions
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{
List<ScadaSchemaModel> scadaToRead = ProductionScadaSchema.Concat(SubscribedScada).ToList();
// Get new data from PLC
libraryError = ncAdapter.ReadScadasData(scadaToRead, out List<DTOScadaModel> scadas);
libraryError = ncAdapter.ReadModulesBlock(out Dictionary<int, DTOModulesBlock> currModules);
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_SCADA_DATA, null, scadas);
MessageServices.Current.Publish(SEND_THERMO_MODULE_DATA, null, currModules);
}
else
RestoreConnection();
sw.Stop();
//Update thread timer
// Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait
Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds));
Thread.Sleep(CalcSleepTime(250, (int)sw.ElapsedMilliseconds));
}
}
catch (ThreadAbortException)
{
ncAdapter.Dispose();
}
#endif
}
}
public static void ReadM154Data()
{
@@ -1191,7 +1424,7 @@ public static class ThreadsFunctions
{
if (ThreadsHandler.RunningThreadStatus.ContainsKey(value.Key) && Counter[value.Key] != 0)
{
ThreadsHandler.RunningThreadStatus[value.Key] = (Timers[value.Key] / Counter[value.Key]) + " mS";
ThreadsHandler.RunningThreadStatus[value.Key] = $"{(Timers[value.Key] / Counter[value.Key])} ms x {Counter[value.Key]}";
Timers[value.Key] = 0;
Counter[value.Key] = 0;
}
+12 -6
View File
@@ -11,25 +11,31 @@ namespace Thermo.Active.Core
private static List<Action> ThreadsFunctionsList = new List<Action>
{
ThreadsFunctions.ManageWatchdog,
ThreadsFunctions.ManageStatusCommand,
ThreadsFunctions.ManageConfRequest,
ThreadsFunctions.ManageProdUpdate,
ThreadsFunctions.ReadAlarms,
ThreadsFunctions.ReadPowerOnData,
ThreadsFunctions.StatThread,
ThreadsFunctions.ReadProcessesPPStatus,
//ThreadsFunctions.ReadProcessesPPStatus,
ThreadsFunctions.ReadEnabledFunctionality,
ThreadsFunctions.ReadExpiredMaintenances,
ThreadsFunctions.ReadAxesPositionsData,
//ThreadsFunctions.ReadAxesPositionsData,
ThreadsFunctions.ReadUserSoftKeysData,
//ThreadsFunctions.ReadHeadsData,
ThreadsFunctions.ReadAxesNamesData,
//ThreadsFunctions.ReadAxesNamesData,
//ThreadsFunctions.ReadActiveProgramData,
//ThreadsFunctions.ReadPartProgramQueueData,
ThreadsFunctions.ReadScadaData,
ThreadsFunctions.ReadM154Data, // levare?
// ThreadsFunctions.ReadNcSoftKeysData,
ThreadsFunctions.ReadGaugeData,
ThreadsFunctions.ReadProdInfoData,
ThreadsFunctions.ReadProdCycleData,
ThreadsFunctions.ReadRecipeData,
ThreadsFunctions.ReadWarmersData,
ThreadsFunctions.ReadModulesData
ThreadsFunctions.ReadAreaData,
ThreadsFunctions.ReadModulesData,
ThreadsFunctions.ReadScadaData,
ThreadsFunctions.ReadM154Data // levare?
};
private static Action ThreadSetupCmsConnect = ThreadsFunctions.SetupCmsConnect;
@@ -12,5 +12,6 @@ namespace Thermo.Active.Model.ConfigModels
public string Name { get; set; }
public string Description { get; set; }
public string Format { get; set; }
public int ScaleFactor { get; set; }
}
}
@@ -19,6 +19,7 @@ namespace Thermo.Active.Model.ConfigModels
public int Id;
public int Potenza;
public int Dimensione;
public string Modello;
}
public class RiskResistModel
{
@@ -35,5 +36,12 @@ namespace Thermo.Active.Model.ConfigModels
public int SetpointRecipe;
public int SetpointThermo;
public int MaxPower;
public int NumResist;
public bool CalcIchMin;
}
public class RiskBoardModel
{
public int IdBoard;
public int NumChannels;
}
}
+7
View File
@@ -210,6 +210,9 @@ namespace Thermo.Active.Model
public static string WEBSITE_DIRECTORY = BASE_PATH + "\\view";
#endif
public const string CONFIG_DIRECTORY = "Config\\";
public const string RECIPE_DIRECTORY = "Recipes\\";
public const string RECIPE_TEMPLATE_PATH = CONFIG_DIRECTORY + RECIPE_DIRECTORY + "template.json";
public const string LIVE_RECIPE_PATH = TEMP_FOLDER + RECIPE_DIRECTORY + "current.json";
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";
@@ -252,6 +255,7 @@ namespace Thermo.Active.Model
public const string MAIN_PROGRAM_CONFIG_PATH = CONFIG_DIRECTORY + "customMainProgram.txt";
public static string LANGUAGE_PACK_DIRECTORY = BASE_PATH + "\\languages\\";
public static string LANGUAGE_SCHEMA_PATH = BASE_PATH + "\\LanguageValidator.xsd";
@@ -294,7 +298,10 @@ namespace Thermo.Active.Model
public const string SEND_THERMO_RECIPE_OVERWIEW = "SEND_THERMO_RECIPE_OVERWIEW";
public const string SEND_THERMO_MODULE_DATA = "SEND_THERMO_MODULE_DATA";
public const string SEND_THERMO_WARMERS_DATA = "SEND_THERMO_WARMERS_DATA";
public const string SEND_THERMO_AREA_DATA = "SEND_THERMO_AREA_DATA";
public const string SEND_THERMO_GAUGE_DATA = "SEND_THERMO_GAUGE_DATA";
public const string SEND_THERMO_PROD_INFO_DATA = "SEND_THERMO_PROD_INFO_DATA";
public const string SEND_THERMO_PROD_CYCLE_DATA = "SEND_THERMO_PROD_CYCLE_DATA";
public const string BROADCAST_DATA = "BROADCAST_DATA";
@@ -3,18 +3,28 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Model.DTOModels.Recipe
{
public class DTOModulesBlock
{
public int Id { get; set; } = 0;
public double SetpointHMI { get; set; } = 0;
public double SetpointPLC { get; set; } = 0;
//public RPRange Range { get; set; }
//public RPStatus Status { get; set; }
public string UnitMeasure { get; set; }
public double ValueAct { get; set; }
public string LocalizedLabel { get; set; } = "";
public TACT_MBLOCK_TYPE Type { get; set; } = TACT_MBLOCK_TYPE.ND;
public TACT_MBLOCK_SECTION Section { get; set; } = TACT_MBLOCK_SECTION.ND;
public int IdParam { get; set; } = 0;
public bool ShowDelay { get; set; } = false;
public int Priority { get; set; } = 0;
public int ActualDelay { get; set; } = 0;
public int ActualDuration { get; set; } = 0;
public int EstimatedDelay { get; set; } = 0;
public int EstimatedDuration { get; set; } = 0;
public List<short> PrecedingId { get; set; } = new List<short>();
public bool Visible { get; set; } = false;
public bool Running { get; set; } = false;
public bool HasError { get; set; } = false;
public override bool Equals(object obj)
{
@@ -23,17 +33,33 @@ namespace Thermo.Active.Model.DTOModels.Recipe
if (Id!= item.Id)
return false;
if (SetpointHMI != item.SetpointHMI)
if (LocalizedLabel != item.LocalizedLabel)
return false;
if (SetpointPLC != item.SetpointPLC)
if (Type != item.Type)
return false;
//if (!Range.Equals(item.Range))
// return false;
//if (!Status.Equals(item.Status))
// return false;
if (UnitMeasure != item.UnitMeasure)
if (Section != item.Section)
return false;
if (ValueAct != item.ValueAct)
if (IdParam != item.IdParam)
return false;
if (ShowDelay != item.ShowDelay)
return false;
if (Priority != item.Priority)
return false;
if (ActualDelay != item.ActualDelay)
return false;
if (ActualDuration != item.ActualDuration)
return false;
if (EstimatedDelay != item.EstimatedDelay)
return false;
if (EstimatedDuration != item.EstimatedDuration)
return false;
if (!Enumerable.SequenceEqual(PrecedingId,item.PrecedingId))
return false;
if (Visible != item.Visible)
return false;
if (Running != item.Running)
return false;
if (HasError != item.HasError)
return false;
return true;
@@ -13,5 +13,6 @@ namespace Thermo.Active.Model.DTOModels.Recipe
public string Description;
public string Format;
public string Label;
public int ScaleFactor;
}
}
@@ -15,6 +15,7 @@ namespace Thermo.Active.Model.DTOModels.Recipe
public RPStatus Status { get; set; }
public string UnitMeasure { get; set; }
public double ValueAct { get; set; }
public int ScaleFactor { get; set; }
public override bool Equals(object obj)
{
@@ -35,6 +36,8 @@ namespace Thermo.Active.Model.DTOModels.Recipe
return false;
if (ValueAct != item.ValueAct)
return false;
if (ScaleFactor != item.ScaleFactor)
return false;
return true;
}
@@ -8,32 +8,39 @@ namespace Thermo.Active.Model.DTOModels.Recipe
{
public class DTOWarmers
{
public int Id { get; set; } = 0;
public double SetpointHMI { get; set; } = 0;
public double SetpointPLC { get; set; } = 0;
//public RPRange Range { get; set; }
//public RPStatus Status { get; set; }
public string UnitMeasure { get; set; }
public double ValueAct { get; set; }
public int IdChannel { get; set; } = 0;
public int IdReflector { get; set; } = 0;
public int SetpointHMI { get; set; } = 0;
public int SetpointTermocam { get; set; } = 0;
public int SetpointPLC { get; set; } = 0;
public int ChannelStatus { get; set; } = 0;
public double ActualCurrent { get; set; } = 0;
public int ActualPerc { get; set; } = 0;
public int MaxPower { get; set; } = 0;
public override bool Equals(object obj)
{
if (!(obj is DTOWarmers item))
return false;
if (Id!= item.Id)
if (IdChannel != item.IdChannel)
return false;
if (IdReflector != item.IdReflector)
return false;
if (SetpointHMI != item.SetpointHMI)
return false;
if (SetpointTermocam != item.SetpointTermocam)
return false;
if (SetpointPLC != item.SetpointPLC)
return false;
//if (!Range.Equals(item.Range))
// return false;
//if (!Status.Equals(item.Status))
// return false;
if (UnitMeasure != item.UnitMeasure)
if (ChannelStatus != item.ChannelStatus)
return false;
if (ValueAct != item.ValueAct)
if (ActualCurrent != item.ActualCurrent)
return false;
if (ActualPerc != item.ActualPerc)
return false;
if (MaxPower != item.MaxPower)
return false;
return true;
@@ -45,53 +52,4 @@ namespace Thermo.Active.Model.DTOModels.Recipe
}
}
#if false
public struct RPRange
{
public double Min { get; set; }
public double Max { get; set; }
public override bool Equals(object obj)
{
if (!(obj is RPRange item))
return false;
if (Min != item.Min)
return false;
if (Max != item.Max)
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
public struct RPStatus
{
public bool Visible { get; set; }
public bool Enabled { get; set; }
public bool HasError { get; set; }
public override bool Equals(object obj)
{
if (!(obj is RPStatus item))
return false;
if (Visible != item.Visible)
return false;
if (Enabled != item.Enabled)
return false;
if (HasError != item.HasError)
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
#endif
}
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Thermo.Active.Model.DTOModels.ThermoProd
{
public enum Status
{
ND = 0,
IDLE,
RUNNING,
HOLD,
ALARM
}
public enum Mode
{
ND = -1,
NOT_READY,
MANUAL,
AUTO,
SETUP
}
public enum SubMode
{
ND = 0,
SHEET,
CYCLE_EMPTY,
PRE_WARM
}
public class DTOProdCycle
{
}
}
@@ -142,6 +142,7 @@
<Compile Include="DTOModels\MaintenanceModels\DTOMaintenanceNoteModel.cs" />
<Compile Include="DTOModels\MaintenanceModels\DTONewMaintenanceModel.cs" />
<Compile Include="DatabaseModels\MaintenanceNoteModel.cs" />
<Compile Include="DTOModels\ThermoProd\DTOProdCycle.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="DatabaseModels\UserModel.cs">
<Generator>DtsGenerator</Generator>
@@ -166,6 +167,11 @@
<Name>CMS_CORE_Library</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="DTOModels\ThermoModules\" />
<Folder Include="DTOModels\ThermoRecipe\" />
<Folder Include="DTOModels\ThermoWarmers\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
+563 -64
View File
@@ -28,6 +28,7 @@ namespace Thermo.Active.NC
{
public class NcAdapter : IDisposable
{
public NcThermo numericalControl;
public NcAdapter() =>
@@ -66,6 +67,92 @@ namespace Thermo.Active.NC
return null;
}
#region StatusCommand words
// variabili delle richieste da PLC: tutte nella status command
private static List<ushort> statusCmd = new List<ushort>();
/// <summary>
/// Check bit on word
/// </summary>
/// <param name="value"></param>
/// <param name="numBit"></param>
/// <returns></returns>
protected static bool checkBitOnWord(ushort value, int numBit)
{
bool answ = false;
try
{
ushort pow = (ushort)(1 << numBit);
answ = (value & pow) == pow;
}
catch
{ }
return answ;
}
private static bool ThermoReqConfWarmerStr
{
get
{
bool answ = false;
if (statusCmd.Count > 0)
{
try
{
answ = checkBitOnWord(statusCmd[0], 7);
}
catch
{ }
}
return answ;
}
}
private static bool ThermoReqConfRecipeStr
{
get
{
bool answ = false;
if (statusCmd.Count > 0)
{
try
{
answ = checkBitOnWord(statusCmd[0], 8);
}
catch
{ }
}
return answ;
}
}
private static bool ThermoProdUpdatedStr
{
get
{
bool answ = false;
if (statusCmd != null)
{
if (statusCmd.Count > 0)
{
try
{
answ = checkBitOnWord(statusCmd[0], 3);
}
catch
{ }
}
}
return answ;
}
}
#endregion
#region cached data
protected static Dictionary<string, DTORecipeParam> lastRecipe = new Dictionary<string, DTORecipeParam>();
#endregion
#region Read Data
#region Axes
@@ -168,6 +255,93 @@ namespace Thermo.Active.NC
return numericalControl.PLC_RWManageWatchdog();
}
public CmsError ManageStatusCommand()
{
CmsError cmsError = NO_ERROR;
// recupero i dati
//statusCmd = new List<ushort>();
cmsError = numericalControl.PLC_RStatusCommand(ref statusCmd);
if (cmsError.IsError())
return cmsError;
// restituisco errore
return cmsError;
}
public CmsError ManageConfRequest()
{
CmsError cmsError = NO_ERROR;
if (RecipeLiveData != null)
{
// controllo SE HO richieste di configurazione
if (ThermoReqConfWarmerStr)
{
if (RecipeLiveData.ChannelSetpoints != null)
{
// se si in questo caso scrivo configurazione...
WriteRecipeWarmConfig();
// Ack !
cmsError = numericalControl.PLC_WAckConfRiskRequest();
}
}
if (ThermoReqConfRecipeStr)
{
if (RecipeLiveData.RecipeParameters != null)
{
// copy data to PLC
cmsError = ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (cmsError.IsError())
return cmsError;
// save parameters to PLC!!!
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
foreach (var item in RecipeLiveData.RecipeParameters)
{
if (prevRecipe.ContainsKey(item.Key))
{
// aggiorno il valore HMI nel parametro
var currParam = prevRecipe[item.Key];
currParam.SetpointHMI = item.Value;
// salvo (1 parametro, potrei fare N...)
updtRecipe.Add(item.Key, currParam);
}
else
{
return NOT_FOUND_ERROR;
}
}
// se si in questo caso scrivo configurazione attuale...
WriteRecipeParams(updtRecipe);
// Ack !
cmsError = numericalControl.PLC_WAckConfRecipeRequest();
}
}
}
return cmsError;
}
public CmsError ManageProdUpdate()
{
CmsError cmsError = NO_ERROR;
// controllo SE HO segnalazioni produzione
if (ThermoProdUpdatedStr)
{
// se si in questo caso leggo il record produzione...
/// e quindi lo gestisco (salvataggio su DB)
// do il bit di ack
cmsError = numericalControl.PLC_WAckProdUpdate();
}
else
{
// se è zero e il mio ack fosse 1 --> resetto il mio!
}
return cmsError;
}
public CmsError GetNcGenericData(out DTONcGenericDataModel genericData)
{
genericData = new DTONcGenericDataModel(MachineConfig.Model);
@@ -901,6 +1075,7 @@ namespace Thermo.Active.NC
return cmsError;
}
#if false
// !!!FARE!!! è copia delle heads
public CmsError GetRecipeData(out List<DTOHeadModel> heads)
{
@@ -973,6 +1148,7 @@ namespace Thermo.Active.NC
return cmsError;
}
#endif
public CmsError GetM155Data(out List<DTOM155InputModel> data)
{
data = new List<DTOM155InputModel>();
@@ -1063,6 +1239,20 @@ namespace Thermo.Active.NC
return cmsError;
}
public CmsError ReadProdInfoData(out ThermoModels.ProdInfoModel prodInfoData)
{
prodInfoData = new ThermoModels.ProdInfoModel();
CmsError cmsError = numericalControl.PLC_RProdInfo(ref prodInfoData);
return cmsError;
}
public CmsError ReadProdCycleData(out ThermoModels.ProdCycleModel prodCycleData)
{
prodCycleData = new ThermoModels.ProdCycleModel();
CmsError cmsError = numericalControl.PLC_RProdCycle(ref prodCycleData);
return cmsError;
}
/// <summary>
/// Vero metodo lettura ricetta da 2 aree memoria PLC
/// </summary>
@@ -1081,15 +1271,18 @@ namespace Thermo.Active.NC
{
Dictionary<int, ThermoModels.RecipeParam> currPlcRecipe = new Dictionary<int, ThermoModels.RecipeParam>();
CmsError cmsError = NO_ERROR;
if (useLastRead)
if (useLastRead && lastRecipe.Count > 0)
{
cmsError = numericalControl.PLC_RRecipeParamList(false, ref currPlcRecipe);
currentRecipe = lastRecipe;
return cmsError;
}
else
{
cmsError = numericalControl.PLC_RRecipeParamList(refreshOnlyRT, ref currPlcRecipe);
if (cmsError.IsError())
return cmsError;
}
if (cmsError.IsError())
return cmsError;
@@ -1098,6 +1291,7 @@ namespace Thermo.Active.NC
List<DTORecipeConfigModel> recipeConfig = RecipeConfig.Select(x => new DTORecipeConfigModel()
{
Id = x.Id,
ScaleFactor = x.ScaleFactor,
Category = x.Category.ToString(),
SubCategory_1 = x.SubCategory_1,
SubCategory_2 = x.SubCategory_2,
@@ -1115,8 +1309,8 @@ namespace Thermo.Active.NC
ThermoModels.RecipeParam paramPLC = currPlcRecipe[item.Id];
currRange = new RPRange()
{
Min = paramPLC.ValMin,
Max = paramPLC.ValMax
Min = paramPLC.ValMin / item.ScaleFactor,
Max = paramPLC.ValMax / item.ScaleFactor
};
currStatus = new RPStatus()
{
@@ -1131,9 +1325,10 @@ namespace Thermo.Active.NC
Range = currRange,
Status = currStatus,
UnitMeasure = "",
ValueAct = paramPLC.ValueAct,
SetpointHMI = paramPLC.SetpointHMI,
SetpointPLC = paramPLC.SetpointPLC
ValueAct = paramPLC.ValueAct / item.ScaleFactor,
SetpointHMI = paramPLC.SetpointHMI / item.ScaleFactor,
SetpointPLC = paramPLC.SetpointPLC / item.ScaleFactor,
ScaleFactor = item.ScaleFactor
};
}
else
@@ -1156,45 +1351,64 @@ namespace Thermo.Active.NC
Range = currRange,
Status = currStatus,
UnitMeasure = "",
ValueAct = 0
ValueAct = 0,
ScaleFactor = 1
};
}
currentRecipe.Add(item.Label, currParam);
}
// salvo!
lastRecipe = currentRecipe;
}
else
{
currentRecipe = new Dictionary<string, DTORecipeParam>();
lastRecipe = currentRecipe;
}
return NO_ERROR;
}
/// <summary>
/// SCrittura memoria (SOLO SetpointHMI invero)
/// Recipe Parameters write to PLC (only SetpointHMI)
/// </summary>
/// <param name="updtRecipe"></param>
/// <returns></returns>
public CmsError WriteRecipeData(Dictionary<string, DTORecipeParam> updtRecipe)
public CmsError WriteRecipeParametersToPLC(Dictionary<string, DTORecipeParam> updtRecipe)
{
Dictionary<int, int> newParameters = new Dictionary<int, int>();
// solo x S7...
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
// ciclo x ogni valore della ricetta aggiornata ricevuto
ThermoModels.RecipeParam currParam;
foreach (var item in updtRecipe)
{
// salvo SOLO il setpoint HMI...
currParam = new ThermoModels.RecipeParam()
{
Id = (short)item.Value.Id,
SetpointHMI = item.Value.SetpointHMI
};
// scrivo!
CmsError cmsError = numericalControl.PLC_WRecipeParam(currParam);
if (cmsError.IsError())
return cmsError;
newParameters.Add(item.Value.Id, (int)(item.Value.SetpointHMI * item.Value.ScaleFactor));
}
// scrivo!
CmsError cmsError = numericalControl.PLC_WRecipeParameters(newParameters);
if (cmsError.IsError())
return cmsError;
}
else
{
return FUNCTION_NOT_ALLOWED_ERROR;
}
return NO_ERROR;
}
/// <summary>
/// Comando conferma dati ricetta
/// </summary>
/// <param name="confirmUpdate">true: HMI --> PLC, false: PLC --> HMI</param>
/// <returns></returns>
public CmsError ConfirmRecipeData(bool confirmUpdate)
{
// solo x S7...
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
// call NC for update
CmsError cmsError = numericalControl.PLC_WRecipeEdit(confirmUpdate);
if (cmsError.IsError())
return cmsError;
}
else
{
@@ -1203,6 +1417,70 @@ namespace Thermo.Active.NC
return NO_ERROR;
}
/// <summary>
/// Vero metodo lettura Warmers data da memoria PLC
/// </summary>
/// <param name="currentWarmers"></param>
/// <returns></returns>
public CmsError ReadWarmersData(out Dictionary<int, DTOWarmers> currentWarmers)
{
// init obj
currentWarmers = new Dictionary<int, DTOWarmers>();
// solo x S7...
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
CmsError cmsError = NO_ERROR;
// leggo stato ricetta da PLC
Dictionary<int, ThermoModels.WarmerChannel> currPlcWarmers = new Dictionary<int, ThermoModels.WarmerChannel>();
cmsError = numericalControl.PLC_RWarmerChannelList(ref currPlcWarmers);
if (cmsError.IsError())
return cmsError;
// compongo con il resto delle info da config... do x scontato di avere TUTIT i 1024 channels
List<DTOWarmers> warmersConfig = RiskChannelConfig.Select(x => new DTOWarmers()
{
IdChannel = x.IdChannel,
IdReflector = x.IdReflector,
SetpointHMI = x.SetpointRecipe,
SetpointTermocam = 0, // FIXME TODO x.SetpointTer,
SetpointPLC = currPlcWarmers[x.IdChannel].SetpointPLC,
ChannelStatus = currPlcWarmers[x.IdChannel].ChStatus,
ActualCurrent = currPlcWarmers[x.IdChannel].CurrAct,
ActualPerc = currPlcWarmers[x.IdChannel].PercAct,
MaxPower = x.MaxPower
}).ToList();
}
else
{
currentWarmers = new Dictionary<int, DTOWarmers>();
}
return NO_ERROR;
}
/// <summary>
/// Gestione strobe richiesta cambio modo
/// </summary>
/// <returns></returns>
public CmsError StrobeMode(Model.DTOModels.ThermoProd.Mode mode)
{
// solo x S7...
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
// call NC for update
CmsError cmsError = numericalControl.PLC_WModeSel((int)mode);
if (cmsError.IsError())
return cmsError;
}
else
{
return FUNCTION_NOT_ALLOWED_ERROR;
}
return NO_ERROR;
}
public CmsError ReadNcScada(ScadaSchemaModel scadaSchema, out DTOScadaModel scadaValue)
@@ -1565,8 +1843,6 @@ namespace Thermo.Active.NC
currRecipe = new Dictionary<string, DTORecipeParam>();
DTORecipeParam currParam = new DTORecipeParam();
RPRange currRange = new RPRange();
RPStatus currStatus = new RPStatus();
// gestione errore
cmsError = ReadRecipeData(false, true, out currRecipe);
@@ -1584,7 +1860,7 @@ namespace Thermo.Active.NC
/// <returns></returns>
public CmsError WriteRecipeParams(Dictionary<string, DTORecipeParam> updtRecipe)
{
CmsError cmsError = WriteRecipeData(updtRecipe);
CmsError cmsError = WriteRecipeParametersToPLC(updtRecipe);
return cmsError;
}
@@ -1599,20 +1875,17 @@ namespace Thermo.Active.NC
CmsError cmsError = NO_ERROR;
currOverview = new Dictionary<string, RecipeCatStatus>();
// !!!FARE davvero!!!
#if false
// gestione errore
cmsError = ReadScadaData(schema, out currParam);
// leggo la ricetta!
var currRecipe = new Dictionary<string, DTORecipeParam>();
cmsError = ReadFullRecipe(out currRecipe);
if (cmsError.IsError())
return cmsError;
#endif
// calcolo!
return cmsError;
// leggo l'intero array delle DB... QUI FAKE sulle DB configurate...
List<DTORecipeConfigModel> recipeConfig = RecipeConfig.Select(x => new DTORecipeConfigModel()
{
Id = x.Id,
ScaleFactor = x.ScaleFactor,
Category = x.Category.ToString(),
SubCategory_1 = x.SubCategory_1,
SubCategory_2 = x.SubCategory_2,
@@ -1623,34 +1896,51 @@ namespace Thermo.Active.NC
}).ToList();
RecipeCatStatus currStatus = RecipeCatStatus.Unchanged;
int countCat = 0;
// percorro conf ricetta...
foreach (var item in recipeConfig)
{
// ogni 20 incremento...
if (countCat < 20)
currStatus = RecipeCatStatus.Unchanged;
// cerco SE ci sia già uno status...
if (currOverview.ContainsKey(item.Category))
{
currStatus = RecipeCatStatus.Unchanged;
currStatus = currOverview[item.Category];
}
else if (countCat < 40)
// se lo stato è errore --> esco...
if (currStatus == RecipeCatStatus.HasError)
{
currStatus = RecipeCatStatus.ChangedOk;
continue;
}
// altrimenti controllo
else
{
currStatus = RecipeCatStatus.HasError;
// se in errore --> registro...
if (currRecipe[item.Label].Status.HasError)
{
currStatus = RecipeCatStatus.HasError;
}
// FARE verificare il significato di questo changed (se è da file o da HMI/PLC)
else if (currRecipe[item.Label].SetpointHMI != currRecipe[item.Label].SetpointPLC)
{
currStatus = RecipeCatStatus.ChangedOk;
}
else
{
currStatus = RecipeCatStatus.Unchanged;
}
}
// se non c'è aggiungo
// ora verifico overview finale: se non c'è aggiungo
if (!currOverview.ContainsKey(item.Category))
{
currOverview.Add(item.Category, currStatus);
countCat = 0;
}
else
{
// se il valore è maggiore --> aggiorno
currOverview[item.Category] = (int)currStatus > (int)currOverview[item.Category] ? currStatus : currOverview[item.Category];
}
countCat++;
}
// restituisco cod errore se trovato
@@ -1667,48 +1957,257 @@ namespace Thermo.Active.NC
CmsError cmsError = NO_ERROR;
currModules = new Dictionary<int, DTOModulesBlock>();
// FIXME TODO
#if false
DTORecipeParam currParam = new DTORecipeParam();
RPRange currRange = new RPRange();
RPStatus currStatus = new RPStatus();
// gestione errore
cmsError = ReadModBlock(out currModules);
if (cmsError.IsError())
return cmsError;
// restituisco cod errore se trovato
return cmsError;
}
public CmsError ReadModBlock(out Dictionary<int, DTOModulesBlock> currModules)
{
CmsError cmsError = NO_ERROR;
currModules = new Dictionary<int, DTOModulesBlock>();
DTOModulesBlock currVal = new DTOModulesBlock();
// read and return warmers data
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
Dictionary<int, ThermoModels.ModuleBlock> currModBlock = new Dictionary<int, ThermoModels.ModuleBlock>();
cmsError = numericalControl.PLC_RModulesBlockList(false, ref currModBlock);
foreach (var item in ModBlockConfig)
{
try
{
ThermoModels.ModuleBlock currModule = currModBlock[item.Id];
currVal = new DTOModulesBlock()
{
Id = item.Id,
LocalizedLabel = item.LocalizedLabels["it"], // FIXME TODO check come gestire traduzione!!!
Type = item.Type,
Section = item.Section,
IdParam = item.IdParam,
ShowDelay = item.ShowDelay,
Priority = item.Priority,
ActualDelay = currModule.ActualDelay,
ActualDuration = currModule.ActualDuration,
EstimatedDelay = currModule.EstimatedDelay,
EstimatedDuration = currModule.EstimatedDuration,
PrecedingId = currModule.PrecedingId,
Visible = currModule.Visible,
Running = currModule.Running,
HasError = currModule.HasError
};
currModules.Add(item.Id, currVal);
}
catch (Exception exc)
{
// FIXME TODO...
}
}
}
return cmsError;
}
/// <summary>
/// GEt all warmers data by channel
/// </summary>
/// <param name="currWarmers">List of <= 1024 warmers channels</param>
/// <returns></returns>
public CmsError ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers)
{
CmsError cmsError = NO_ERROR;
currWarmers = new Dictionary<int, DTOWarmers>();
DTOWarmers currVal = new DTOWarmers();
// read and return warmers data
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
Dictionary<int, ThermoModels.WarmerChannel> currPlcWarmChan = new Dictionary<int, ThermoModels.WarmerChannel>();
cmsError = numericalControl.PLC_RWarmerChannelList(ref currPlcWarmChan);
foreach (var item in RiskChannelConfig)
{
try
{
ThermoModels.WarmerChannel currWarm = currPlcWarmChan[item.IdChannel];
currVal = new DTOWarmers()
{
IdChannel = item.IdChannel,
IdReflector = item.IdReflector,
SetpointHMI = currWarm.SetpointHMI,
SetpointTermocam = currWarm.SetpointThermoCam,
SetpointPLC = currWarm.SetpointPLC,
ChannelStatus = currWarm.ChStatus,
ActualCurrent = currWarm.CurrAct,
ActualPerc = currWarm.PercAct,
MaxPower = item.MaxPower
};
currWarmers.Add(item.IdChannel, currVal);
}
catch
{ }
}
}
// gestione errore
cmsError = ReadRecipeData(false, true, out currModules);
if (cmsError.IsError())
return cmsError;
#endif
return cmsError;
// restituisco cod errore se trovato
return cmsError;
}
/// <summary>
/// Legge tutti i parametri della ricetta
/// Returns resistances configuration
/// </summary>
/// <param name="currWarmers">Oggetto elenco 1024 ch riscaldi</param>
/// <param name="currWarmersResistances">List of configured resistances</param>
/// <returns></returns>
public CmsError ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers)
public CmsError GetWarmersResistances(out Dictionary<int, Model.ConfigModels.RiskResistModel> currWarmersResistances)
{
CmsError cmsError = NO_ERROR;
currWarmers = new Dictionary<int, DTOWarmers>();
currWarmersResistances = new Dictionary<int, Model.ConfigModels.RiskResistModel>();
// FIXME TODO
#if false
// read and return config
if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{
foreach (var item in RiskResistConfig)
{
currWarmersResistances.Add(item.Id, item);
}
}
// restituisco cod errore se trovato
return cmsError;
}
/// <summary>
/// Get area for material from parameters list
/// </summary>
/// <param name="currAreaPerc">dictionary X/Y and double value</param>
/// <returns></returns>
public CmsError GetWarmMaterialArea(out Dictionary<string, double> currAreaPerc)
{
CmsError cmsError = NO_ERROR;
currAreaPerc = new Dictionary<string, double>();
DTORecipeParam currParam = new DTORecipeParam();
RPRange currRange = new RPRange();
RPStatus currStatus = new RPStatus();
var currRecipe = new Dictionary<string, DTORecipeParam>();
// gestione errore
cmsError = ReadRecipeData(false, true, out currModules);
// read recipe
cmsError = ReadRecipeData(false, true, out currRecipe);
if (cmsError.IsError())
return cmsError;
#endif
return cmsError;
// use 2 fixed data for calculus: general_sizes_sheet_dim_x / general_sizes_sheet_dim_y
currAreaPerc.Add("X", getDimRatio(currRecipe["general_sizes_sheet_dim_x"]));
currAreaPerc.Add("Y", getDimRatio(currRecipe["general_sizes_sheet_dim_y"]));
// restituisco cod errore se trovato
return cmsError;
}
protected double getDimRatio(DTORecipeParam singlePar)
{
double ratio = 1;
if (singlePar != null)
{
try
{
if (singlePar.Range.Max > 0)
ratio = singlePar.SetpointPLC / singlePar.Range.Max;
}
catch
{ }
}
return ratio;
}
/// <summary>
/// Write all warmers load for recipe
/// </summary>
/// <param name="updtSetpHmi">Oggetto parametri da aggiornare (from HMI)</param>
/// <returns></returns>
public CmsError WriteRecipeWarmChSetpHMI(Dictionary<int, int> updtSetpHmi)
{
CmsError cmsError = numericalControl.PLC_WWarmerChSetpHmi(updtSetpHmi);
return cmsError;
}
/// <summary>
/// Write all warmers termocam data for recipe
/// </summary>
/// <param name="updtSetpTCam">Oggetto parametri da aggiornare (from HMI)</param>
/// <returns></returns>
public CmsError WriteRecipeWarmChSetpTermoCam(Dictionary<int, int> updtSetpTCam)
{
CmsError cmsError = numericalControl.PLC_WWarmerChSetpTCam(updtSetpTCam);
return cmsError;
}
/// <summary>
/// Write all warmers CONFIG data
/// </summary>
/// <param name="updtSetpTCam">Oggetto parametri da aggiornare (from HMI)</param>
/// <returns></returns>
public CmsError WriteRecipeWarmConfig()
{
Dictionary<int, int> newData = new Dictionary<int, int>();
CmsError cmsError = NO_ERROR;
// scrivo l'abilitazione dei canali...
foreach (var item in RiskBoardConfig)
{
newData.Add(item.IdBoard, item.NumChannels > 0 ? 1 : 0);
}
cmsError = numericalControl.PLC_WWarmerConfBoardEnabl(newData);
if (cmsError.IsError())
return cmsError;
// processo riflettori...
newData = new Dictionary<int, int>();
foreach (var item in RiskChannelConfig)
{
newData.Add(item.IdChannel, item.IdReflector);
}
cmsError = numericalControl.PLC_WWarmerConfRefl(newData);
if (cmsError.IsError())
return cmsError;
// recupero parametro VUMin...
ushort VUMin = 1;
cmsError = numericalControl.PLC_RWarmerConfVUMin(ref VUMin);
if (cmsError.IsError())
return cmsError;
// check div0!
if (VUMin == 0)
{
VUMin = 1;
}
// processo corrente minima!
var newFloatTData = new Dictionary<int, double>();
double minICh = 0;
int calcPower = 0;
foreach (var item in RiskChannelConfig)
{
minICh = 0;
if (item.CalcIchMin)
{
calcPower = (item.NumResist - 1) + item.MaxPower + item.MaxPower / 2;
minICh = (double)calcPower / VUMin;
}
newFloatTData.Add(item.IdChannel, minICh);
}
cmsError = numericalControl.PLC_WWarmerConfMinCurr(newFloatTData);
if (cmsError.IsError())
return cmsError;
return cmsError;
}
#endregion Read Data
+57 -2
View File
@@ -19,6 +19,61 @@ namespace Thermo.Active.NC
{
public class NcFileAdapter : NcAdapter
{
/// <summary>
/// Read file from local devices ad give back string content
/// </summary>
/// <param name="path"></param>
/// <param name="fileContent"></param>
/// <returns></returns>
public CmsError ReadFileContent(string path, out string fileContent)
{
// init
fileContent = "";
if (!string.IsNullOrEmpty(path))
{
// check existing
if (File.Exists(path))
{
// read all lines as string
fileContent = File.ReadAllText(path);
}
else
{
return FILE_NOT_FOUND_ERROR;
}
}
else
{
return FILE_NOT_FOUND_ERROR;
}
return NO_ERROR;
}
/// <summary>
/// Save string content to file
/// </summary>
/// <param name="path"></param>
/// <param name="fileContent"></param>
/// <returns></returns>
public CmsError WriteFileContent(string path, string fileContent)
{
if (!string.IsNullOrEmpty(path))
{
if (!string.IsNullOrEmpty(fileContent))
{
File.WriteAllText(path, fileContent);
}
}
else
{
return FILE_NOT_FOUND_ERROR;
}
return NO_ERROR;
}
public CmsError GetFileList(string path, out List<PreviewFileModel> fileList)
{
fileList = new List<PreviewFileModel>();
@@ -41,8 +96,8 @@ namespace Thermo.Active.NC
if (cmsError.IsError())
return cmsError;
string [] names = fileInfo.Name.Split('/');
if(names.Length > 0)
string[] names = fileInfo.Name.Split('/');
if (names.Length > 0)
{
string name = names.Last();
if (!String.IsNullOrWhiteSpace(name))
+13 -13
View File
@@ -40,6 +40,7 @@ namespace Thermo.Active.UI
this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
this.resetSpindleHoursToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.resetCountersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.resetMachineWorkingHoursToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.StopServerItem = new System.Windows.Forms.ToolStripMenuItem();
this.TXTstatus = new System.Windows.Forms.TextBox();
@@ -67,7 +68,6 @@ namespace Thermo.Active.UI
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.resetSpindleHoursToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.resetCountersToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.resetMachineWorkingHoursToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.resetMachineWorkingHoursToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.NotifyIconMenu.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
@@ -146,6 +146,14 @@ namespace Thermo.Active.UI
this.resetCountersToolStripMenuItem.Visible = false;
this.resetCountersToolStripMenuItem.Click += new System.EventHandler(this.resetCountersToolStripMenuItem_Click);
//
// resetMachineWorkingHoursToolStripMenuItem
//
this.resetMachineWorkingHoursToolStripMenuItem.Name = "resetMachineWorkingHoursToolStripMenuItem";
this.resetMachineWorkingHoursToolStripMenuItem.Size = new System.Drawing.Size(234, 22);
this.resetMachineWorkingHoursToolStripMenuItem.Text = "Reset Machine Working Hours";
this.resetMachineWorkingHoursToolStripMenuItem.Visible = false;
this.resetMachineWorkingHoursToolStripMenuItem.Click += new System.EventHandler(this.resetMachineWorkingHoursToolStripMenuItem_Click);
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
@@ -315,6 +323,7 @@ namespace Thermo.Active.UI
this.columnHeader2});
this.tableLayoutPanel1.SetColumnSpan(this.LISTThreadStatus, 2);
this.LISTThreadStatus.Dock = System.Windows.Forms.DockStyle.Fill;
this.LISTThreadStatus.HideSelection = false;
this.LISTThreadStatus.Location = new System.Drawing.Point(3, 3);
this.LISTThreadStatus.Name = "LISTThreadStatus";
this.LISTThreadStatus.Size = new System.Drawing.Size(438, 283);
@@ -355,14 +364,14 @@ namespace Thermo.Active.UI
// closeCMSServerToolStripMenuItem
//
this.closeCMSServerToolStripMenuItem.Name = "closeCMSServerToolStripMenuItem";
this.closeCMSServerToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.closeCMSServerToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
this.closeCMSServerToolStripMenuItem.Text = "Close Active Server";
this.closeCMSServerToolStripMenuItem.Click += new System.EventHandler(this.closeCMSServerToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6);
this.toolStripSeparator2.Size = new System.Drawing.Size(171, 6);
//
// serviceToolStripMenuItem
//
@@ -374,7 +383,7 @@ namespace Thermo.Active.UI
this.resetCountersToolStripMenuItem1,
this.resetMachineWorkingHoursToolStripMenuItem1});
this.serviceToolStripMenuItem.Name = "serviceToolStripMenuItem";
this.serviceToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.serviceToolStripMenuItem.Size = new System.Drawing.Size(174, 22);
this.serviceToolStripMenuItem.Text = "Service";
//
// passwordToolStripMenuItem1
@@ -416,14 +425,6 @@ namespace Thermo.Active.UI
this.resetCountersToolStripMenuItem1.Visible = false;
this.resetCountersToolStripMenuItem1.Click += new System.EventHandler(this.resetCountersToolStripMenuItem1_Click);
//
// resetMachineWorkingHoursToolStripMenuItem
//
this.resetMachineWorkingHoursToolStripMenuItem.Name = "resetMachineWorkingHoursToolStripMenuItem";
this.resetMachineWorkingHoursToolStripMenuItem.Size = new System.Drawing.Size(234, 22);
this.resetMachineWorkingHoursToolStripMenuItem.Text = "Reset Machine Working Hours";
this.resetMachineWorkingHoursToolStripMenuItem.Visible = false;
this.resetMachineWorkingHoursToolStripMenuItem.Click += new System.EventHandler(this.resetMachineWorkingHoursToolStripMenuItem_Click);
//
// resetMachineWorkingHoursToolStripMenuItem1
//
this.resetMachineWorkingHoursToolStripMenuItem1.Name = "resetMachineWorkingHoursToolStripMenuItem1";
@@ -440,7 +441,6 @@ namespace Thermo.Active.UI
this.Controls.Add(this.menuStrip1);
this.Controls.Add(this.tableLayoutPanel1);
this.ForeColor = System.Drawing.SystemColors.ControlText;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1;
this.Margin = new System.Windows.Forms.Padding(2);
+1 -1
View File
@@ -6,7 +6,7 @@ using System.Windows.Forms;
using Thermo.Active.Model;
using TeamDev.SDK.MVVM;
using static Thermo.Active.Model.Constants;
using static Thermo.Active.Utils.StepLogger;
using static Thermo.Active.Utils.ThermoActiveLogger;
namespace Thermo.Active.Utils
{
@@ -69,7 +69,7 @@
<Compile Include="ExceptionManager.cs" />
<Compile Include="LanguageController.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="StepLogger.cs" />
<Compile Include="ThermoActiveLogger.cs" />
<Compile Include="SupportFunctions.cs" />
</ItemGroup>
<ItemGroup>
@@ -4,7 +4,7 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Utils
{
public static class StepLogger
public static class ThermoActiveLogger
{
private static Logger Log = LogManager.GetCurrentClassLogger();
+1 -1
View File
@@ -33,7 +33,7 @@ namespace Thermo.Active
// hold additional metadata for an API. Version and title are required but you can also provide
// additional fields by chaining methods off SingleApiVersion.
//
c.SingleApiVersion("v1", "Step");
c.SingleApiVersion("v1", "ThermoActive");
// If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option.
//
@@ -109,6 +109,7 @@ namespace Thermo.Active.Controllers.WebApi
List<DTORecipeConfigModel> recipeConfig = RecipeConfig.Select(x => new DTORecipeConfigModel()
{
Id = x.Id,
ScaleFactor = x.ScaleFactor,
Category = x.Category.ToString(),
SubCategory_1 = x.SubCategory_1,
SubCategory_2 = x.SubCategory_2,
@@ -13,6 +13,7 @@ using static CMS_CORE_Library.Models.DataStructures;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using Thermo.Active.Model.DTOModels.Recipe;
using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi
{
@@ -27,11 +28,17 @@ namespace Thermo.Active.Controllers.WebApi
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
return NotFound();
{
ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentModules | {libraryError.exception}");
return InternalServerError();
}
CmsError cmsError = ncAdapter.ReadModulesBlock(out Dictionary<int, DTOModulesBlock> currModules);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetRecipeOverview error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currModules);
}
@@ -0,0 +1,173 @@
using CMS_CORE_Library.Models;
using Thermo.Active.Model.DTOModels;
using Thermo.Active.NC;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using static CMS_CORE_Library.Models.DataStructures;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using Thermo.Active.Model.DTOModels.Recipe;
using Thermo.Active.Config;
using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi
{
[RoutePrefix("api/prod")]
public class ProdController : ApiController
{
/// <summary>
/// Request mode SETUP
/// </summary>
/// <returns></returns>
[Route("mode/manual"), HttpPut]
public IHttpActionResult RequestManual()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | RequestManual | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando strobe richiesta AUTO!
CmsError cmsError = ncAdapter.StrobeMode(Model.DTOModels.ThermoProd.Mode.MANUAL);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"RequestManual error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Request mode AUTO
/// </summary>
/// <returns></returns>
[Route("mode/auto"), HttpPut]
public IHttpActionResult RequestAuto()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | RequestAuto | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando strobe richiesta AUTO!
CmsError cmsError = ncAdapter.StrobeMode(Model.DTOModels.ThermoProd.Mode.AUTO);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"RequestAuto error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Request mode SETUP
/// </summary>
/// <returns></returns>
[Route("mode/setup"), HttpPut]
public IHttpActionResult RequestSetup()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | RequestSetup | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando strobe richiesta AUTO!
CmsError cmsError = ncAdapter.StrobeMode(Model.DTOModels.ThermoProd.Mode.SETUP);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"RequestSetup error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Request start production
/// </summary>
/// <returns></returns>
[Route("prod/start"), HttpPut]
public IHttpActionResult StartProd(int requestQty, bool newWorkOrder)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | StartProd | {libraryError.exception}");
return InternalServerError();
}
//// scrivo sul PLC il comando strobe richiesta AUTO!
//CmsError cmsError = ncAdapter.StrobeMode(Model.DTOModels.ThermoProd.Mode.SETUP);
//if (cmsError.IsError())
//{
// ThermoActiveLogger.LogError($"RequestSetup error | {cmsError.exception}");
// return BadRequest(cmsError.localizationKey);
//}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Request production data from indexStart record for numRecord items (DESCENDING)
/// </summary>
/// <returns></returns>
[Route("prod/get"), HttpPut]
public IHttpActionResult GetProd(int indexStart, int numRecord)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | StartProd | {libraryError.exception}");
return InternalServerError();
}
//// scrivo sul PLC il comando strobe richiesta AUTO!
//CmsError cmsError = ncAdapter.StrobeMode(Model.DTOModels.ThermoProd.Mode.SETUP);
//if (cmsError.IsError())
//{
// ThermoActiveLogger.LogError($"RequestSetup error | {cmsError.exception}");
// return BadRequest(cmsError.localizationKey);
//}
// ritorno solo fatto!
return Ok();
}
}
}
}
@@ -13,6 +13,8 @@ using static CMS_CORE_Library.Models.DataStructures;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using Thermo.Active.Model.DTOModels.Recipe;
using Thermo.Active.Config;
using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi
{
@@ -27,11 +29,17 @@ namespace Thermo.Active.Controllers.WebApi
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
return NotFound();
{
ThermoActiveLogger.LogError($"NC Not connected! | GetOverview | {libraryError.exception}");
return InternalServerError();
}
CmsError cmsError = ncAdapter.GetRecipeOverview(out Dictionary<string, RecipeCatStatus> currOverview);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetRecipeOverview error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currOverview);
}
@@ -44,33 +52,425 @@ namespace Thermo.Active.Controllers.WebApi
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
return NotFound();
{
ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentParameters | {libraryError.exception}");
return InternalServerError();
}
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetRecipeOverview error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currRecipe);
}
}
[Route("update"), HttpPut]
public IHttpActionResult WriteParameters(Dictionary<string, double> parametersList)
{
if (parametersList != null)
{
if (RecipeLiveData != null)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | WriteParameters | {libraryError.exception}");
return InternalServerError();
}
// read recipe!
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetRecipeOverview error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
foreach (var item in parametersList)
{
if (prevRecipe.ContainsKey(item.Key))
{
// aggiorno il valore HMI nel parametro
var currParam = prevRecipe[item.Key];
currParam.SetpointHMI = item.Value;
// salvo (1 parametro, potrei fare N...)
updtRecipe.Add(item.Key, currParam);
}
else
{
ThermoActiveLogger.LogError($"WriteParameters error | key not found: {item.Key}");
return NotFound();
}
}
// scrivo sul PLC
ncAdapter.WriteRecipeParams(updtRecipe);
// ritorno solo fatto!
return Ok();
}
}
else
{
// non pronto!
ThermoActiveLogger.LogError($"RecipeLiveData null | WriteParameters");
return InternalServerError();
}
}
else
{
ThermoActiveLogger.LogError($"RecipeLiveData null | Empty Parameters");
return BadRequest();
}
}
/// <summary>
/// Confirm recipe modification (parameters: HMI --> PLC)
/// </summary>
/// <returns></returns>
[Route("confirm"), HttpPut]
public IHttpActionResult ConfirmEdit()
{
if (RecipeLiveData != null)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Recipe ConfirmEdit | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando conferma!
CmsError cmsError = ncAdapter.ConfirmRecipeData(true);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// recupero i dati LIVE dei parametri HMI della ricetta...
cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// rileggo la ricetta
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointHMI);
}
SaveCurrentRecipeParams(currParams);
// ritorno solo fatto!
return Ok();
}
}
else
{
// non pronto!
ThermoActiveLogger.LogError($"RecipeLiveData null | Empty");
return InternalServerError();
}
}
/// <summary>
/// Cancel recipe modification (parameters: PLC --> HMI)
/// </summary>
/// <returns></returns>
[Route("cancel"), HttpPut]
public IHttpActionResult CancelEdit()
{
if (RecipeLiveData != null)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando annula!
CmsError cmsError = ncAdapter.ConfirmRecipeData(false);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// recupero i dati LIVE dei parametri HMI della ricetta...
cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointPLC);
}
// ora salvo ANCHE i dati live...
SaveCurrentRecipeParams(currParams);
// ritorno solo fatto!
return Ok();
}
}
else
{
// non pronto!
ThermoActiveLogger.LogError($"RecipeLiveData null | Empty");
return InternalServerError();
}
}
/// <summary>
/// load recipe from file and send to PLC
/// </summary>
/// <returns></returns>
[Route("load"), HttpPut]
public IHttpActionResult Load(string newName)
{
using (NcFileAdapter ncAdapter = new NcFileAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Load | {libraryError.exception}");
return InternalServerError();
}
// chiamo metodo di lettura...
//CmsError cmsError = ServerConfigController.LoadRecipe(newName);
bool fatto = ServerConfigController.LoadRecipe(newName);
if (!fatto)
{
ThermoActiveLogger.LogError($"LoadRecipe error");
return NotFound();
}
CmsError cmsError = WriteCurrentRecipeToPlc();
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Load tempalte recipe from file and save as new current...
/// </summary>
/// <returns></returns>
[Route("new"), HttpPut]
public IHttpActionResult NewRecipe()
{
using (NcFileAdapter ncAdapter = new NcFileAdapter())
{
// chiamo metodo di lettura...
bool fatto = ServerConfigController.LoadTemplate();
if (!fatto)
{
ThermoActiveLogger.LogError($"LoadRecipe error");
return NotFound();
}
CmsError cmsError = WriteCurrentRecipeToPlc();
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ConfirmEdit error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
}
// ritorno solo fatto!
return Ok();
}
/// <summary>
/// Save current recipe from PLC to default
/// </summary>
/// <returns></returns>
[Route("save"), HttpPut]
public IHttpActionResult Save()
{
using (NcFileAdapter ncAdapter = new NcFileAdapter())
{
// recupero i dati LIVE dei parametri HMI della ricetta...
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointPLC);
}
// ora salvo ANCHE i dati live...
SaveCurrentRecipeParams(currParams);
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Save current recipe from PLC with new name
/// </summary>
/// <returns></returns>
[Route("saveAs"), HttpPut]
public IHttpActionResult SaveAs(string newName)
{
using (NcFileAdapter ncAdapter = new NcFileAdapter())
{
// recupero i dati LIVE dei parametri HMI della ricetta...
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"SaveAs error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointPLC);
}
// ora salvo ANCHE i dati live...
RecipeLiveData.RecipeParameters = currParams;
// e salvo su disco
ServerConfigController.SaveRecipe(newName);
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Save current recipe from PLC to Template
/// </summary>
/// <returns></returns>
[Route("saveTemplate"), HttpPut]
public IHttpActionResult SaveTemplate()
{
using (NcFileAdapter ncAdapter = new NcFileAdapter())
{
// recupero i dati LIVE dei parametri HMI della ricetta...
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"SaveTemplate error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// recupero i dati LIVE dei carichi load dei cahnnels di riscaldo...
cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ReadWarmers error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// uso i valopri HMI...
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointHMI);
}
// ora salvo nei dati live...
RecipeLiveData.RecipeParameters = currParams;
// carico i dati dei riscaldi...
var currChSet = new Dictionary<int, int>();
foreach (var item in currWarmers)
{
currChSet.Add(item.Key, item.Value.SetpointHMI);
}
RecipeLiveData.ChannelSetpoints = currChSet;
// e salvo su disco
ServerConfigController.SaveRecipeTemplate();
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Do actual recipe parameters FileSave
/// </summary>
/// <param name="currParams"></param>
private static void SaveCurrentRecipeParams(Dictionary<string, double> currParams)
{
try
{
// ora salvo ANCHE i dati live...
RecipeLiveData.RecipeParameters = currParams;
// e salvo su disco
ServerConfigController.SaveRecipeCurrent();
}
catch(Exception exc)
{
ThermoActiveLogger.LogError($"Recipe | SaveCurrentRecipeParams exception | {exc}");
}
}
public static CmsError WriteCurrentRecipeToPlc()
{
CmsError checkError = NO_ERROR;
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Load | {libraryError.exception}");
return libraryError;
}
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
// copy data to PLC
checkError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (checkError.IsError())
{
ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | ReadFullRecipe error | {checkError.exception}");
return checkError;
}
// save parameters to PLC!!!
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
foreach (var item in parametersList)
foreach (var item in RecipeLiveData.RecipeParameters)
{
if (prevRecipe.ContainsKey(item.Key))
{
@@ -82,17 +482,44 @@ namespace Thermo.Active.Controllers.WebApi
}
else
{
return NotFound();
ThermoActiveLogger.LogError($"prevRecipe not found | key: {item.Key}");
return NOT_FOUND_ERROR;
}
}
// scrivo sul PLC
ncAdapter.WriteRecipeParams(updtRecipe);
// write to PLC
checkError = ncAdapter.WriteRecipeParams(updtRecipe);
if (checkError.IsError())
{
ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeParams error | {checkError.exception}");
return checkError;
}
// ritorno solo fatto!
return Ok();
// process ch load setup...
Dictionary<int, int> newRisk = new Dictionary<int, int>();
foreach (var item in RecipeLiveData.ChannelSetpoints)
{
newRisk.Add(item.Key, item.Value);
}
// write to PLC
checkError = ncAdapter.WriteRecipeWarmChSetpHMI(newRisk);
if (checkError.IsError())
{
ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeWarmChSetpHMI error | {checkError.exception}");
return checkError;
}
// enable recipe! scrivo sul PLC il comando conferma!
CmsError cmsError = ncAdapter.ConfirmRecipeData(true);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"ReadWarmers error | {cmsError.exception}");
return checkError;
}
}
return checkError;
}
}
}
@@ -42,7 +42,7 @@ namespace Thermo.Active.Controllers.WebApi
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.All.logout(new { id = userId.Value });
StepLogger.LogMessage("Logout: " + userId.Value + "Date:" + DateTime.Now, ERROR_LEVEL.INFO);
ThermoActiveLogger.LogMessage("Logout: " + userId.Value + "Date:" + DateTime.Now, ERROR_LEVEL.INFO);
return Ok();
}
@@ -13,71 +13,260 @@ using static CMS_CORE_Library.Models.DataStructures;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using Thermo.Active.Model.DTOModels.Recipe;
using Thermo.Active.Config;
using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi
{
[RoutePrefix("api/warmers")]
public class WarmersController : ApiController
{
[Route("current"), HttpGet]
public IHttpActionResult GetCurrentWarmers()
[Route("channels"), HttpGet]
public IHttpActionResult GetCurrentWarmersChannels()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
return NotFound();
{
ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentWarmersChannels | {libraryError.exception}");
return InternalServerError();
}
CmsError cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetRecipeOverview error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currWarmers);
}
}
// FIXME TODO determinare IN PRIMIS nel modello COSA e come aggiornare...
#if false
[Route("update"), HttpPut]
public IHttpActionResult WriteWarmers(Dictionary<string, double> parametersList)
[Route("resistances"), HttpGet]
public IHttpActionResult GetCurrentWarmersResistances()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
foreach (var item in parametersList)
if (libraryError.errorCode != 0)
{
if (prevRecipe.ContainsKey(item.Key))
{
// aggiorno il valore HMI nel parametro
var currParam = prevRecipe[item.Key];
currParam.SetpointHMI = item.Value;
// salvo (1 parametro, potrei fare N...)
updtRecipe.Add(item.Key, currParam);
}
else
{
return NotFound();
}
ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentWarmersResistances | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC
ncAdapter.WriteRecipeParams(updtRecipe);
CmsError cmsError = ncAdapter.GetWarmersResistances(out Dictionary<int, Model.ConfigModels.RiskResistModel> currWarmers);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetCurrentWarmersResistances error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currWarmers);
}
}
[Route("area"), HttpGet]
public IHttpActionResult GetCurrentAreaPerc()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentAreaPerc | {libraryError.exception}");
return InternalServerError();
}
// recupera aree % X / Y
CmsError cmsError = ncAdapter.GetWarmMaterialArea(out Dictionary<string, double> currAreaPerc);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"GetCurrentAreaPerc error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
return Ok(currAreaPerc);
}
}
[Route("update"), HttpPut]
public IHttpActionResult WriteSetpoints(Dictionary<int, int> channelsLoad)
{
// scrive su CHp da ricetta oppure da override x parametri utente...
if (channelsLoad != null)
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | WriteSetpoints | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC
CmsError cmsError = ncAdapter.WriteRecipeWarmChSetpHMI(channelsLoad);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"WriteSetpoints error | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
else
{
return NotFound();
}
}
/// <summary>
/// Confirm recipe modification (parameters: HMI --> PLC)
/// </summary>
/// <returns></returns>
[Route("confirm"), HttpPut]
public IHttpActionResult ConfirmEdit()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Warmers ConfirmEdit | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando conferma!
CmsError cmsError = ncAdapter.ConfirmRecipeData(true);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ConfirmRecipeData | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// recupero i dati LIVE dei parametri HMI dei riscaldi...
cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// rileggo la ricetta
var currParams = new Dictionary<int, int>();
foreach (var item in currWarmers)
{
currParams.Add(item.Key, item.Value.SetpointHMI);
}
saveCurrentRecipeWarmers(currParams);
// ritorno solo fatto!
return Ok();
}
}
#endif
}
/// <summary>
/// Cancel recipe modification (parameters: PLC --> HMI)
/// </summary>
/// <returns></returns>
[Route("cancel"), HttpPut]
public IHttpActionResult CancelEdit()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC il comando annula!
CmsError cmsError = ncAdapter.ConfirmRecipeData(false);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"Warmers CancelEdit error | ConfirmRecipeData | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// recupero i dati LIVE dei parametri HMI dei riscaldi...
cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// rileggo la ricetta
var currParams = new Dictionary<int, int>();
foreach (var item in currWarmers)
{
currParams.Add(item.Key, item.Value.SetpointHMI);
}
saveCurrentRecipeWarmers(currParams);
// ritorno solo fatto!
return Ok();
}
}
[Route("setConfig"), HttpPut]
public IHttpActionResult SetConfig()
{
// scrive configurazioni RISK
using (NcAdapter ncAdapter = new NcAdapter())
{
// Try connection
CmsError libraryError = ncAdapter.Connect();
if (libraryError.errorCode != 0)
{
ThermoActiveLogger.LogError($"NC Not connected! | SetConfig | {libraryError.exception}");
return InternalServerError();
}
// scrivo sul PLC
CmsError cmsError = ncAdapter.WriteRecipeWarmConfig();
if (cmsError.IsError())
{
ThermoActiveLogger.LogError($"Warmers SetConfig error | WriteRecipeWarmConfig | {cmsError.exception}");
return BadRequest(cmsError.localizationKey);
}
// ritorno solo fatto!
return Ok();
}
}
/// <summary>
/// Do actual recipe warmers setpoints FileSave
/// </summary>
/// <param name="chSetpoints"></param>
private static void saveCurrentRecipeWarmers(Dictionary<int, int> chSetpoints)
{
try
{
// ora salvo ANCHE i dati live...
RecipeLiveData.ChannelSetpoints = chSetpoints;
// e salvo su disco
ServerConfigController.SaveRecipeCurrent();
}
catch (Exception exc)
{
ThermoActiveLogger.LogError($"Warmers | SaveCurrentRecipeParams exception | {exc}");
}
}
}
}
+12 -4
View File
@@ -109,14 +109,22 @@ namespace Thermo.Active.Listeners
{
SignalRListener.SendThermoWarmersData(a);
}));
infos.Add(MessageServices.Current.Subscribe(SEND_THERMO_AREA_DATA, (a, b) =>
{
SignalRListener.SendThermoAreaData(a);
}));
infos.Add(MessageServices.Current.Subscribe(SEND_THERMO_GAUGE_DATA, (a, b) =>
{
SignalRListener.SendThermoGaugeData(a);
}));
// FIXME TODO ADD ProdCycle
// FIXME TODO ADD ProdInfo
infos.Add(MessageServices.Current.Subscribe(SEND_THERMO_PROD_INFO_DATA, (a, b) =>
{
SignalRListener.SendThermoProdInfoData(a);
}));
infos.Add(MessageServices.Current.Subscribe(SEND_THERMO_PROD_CYCLE_DATA, (a, b) =>
{
SignalRListener.SendThermoProdCycleData(a);
}));
// Broadcast
infos.Add(MessageServices.Current.Subscribe(BROADCAST_DATA, (a, b) =>
@@ -256,44 +256,22 @@ namespace Thermo.Active.Listeners.SignalR
public static void SendThermoRecipeFullData(object recipeFull)
{
Dictionary<string, DTORecipeParam> currRecipeFull = recipeFull as Dictionary<string, DTORecipeParam>;
Dictionary<string, DTORecipeParam> diffData = new Dictionary<string, DTORecipeParam>();
// calcola ed invia SOLO le differenze...
if (false)
foreach (var item in currRecipeFull)
{
Parallel.ForEach(currRecipeFull, item =>
if (!LastRecipeFullData.ContainsKey(item.Key))
{
if (!LastRecipeFullData.ContainsKey(item.Key))
{
diffData.Add(item.Key, item.Value);
}
else
{
// comparazione
if (!item.Value.Equals(LastRecipeFullData[item.Key]))
{
diffData[item.Key] = item.Value;
}
}
});
}
else
{
foreach (var item in currRecipeFull)
diffData.Add(item.Key, item.Value);
}
else
{
if (!LastRecipeFullData.ContainsKey(item.Key))
// comparazione
if (!item.Value.Equals(LastRecipeFullData[item.Key]))
{
//diffData[item.Key] = item.Value;
diffData.Add(item.Key, item.Value);
}
else
{
// comparazione
if (!item.Value.Equals(LastRecipeFullData[item.Key]))
{
diffData[item.Key] = item.Value;
}
}
}
}
@@ -306,7 +284,6 @@ namespace Thermo.Active.Listeners.SignalR
context.Clients.Group("ncData").recipeFullData(diffData);
}
}
public static void SendThermoRecipeOverviewData(object recipeOver)
{
Dictionary<string, RecipeCatStatus> currRecipeOver = recipeOver as Dictionary<string, RecipeCatStatus>;
@@ -322,12 +299,28 @@ namespace Thermo.Active.Listeners.SignalR
public static void SendThermoModulesData(object modules)
{
Dictionary<string, DTORecipeParam> currModules = modules as Dictionary<string, DTORecipeParam>;
// FIXME TODO: usare un foreach comparer?
if (!LastRecipeFullData.SequenceEqual(currModules))
Dictionary<int, DTOModulesBlock> currModules = modules as Dictionary<int, DTOModulesBlock>;
Dictionary<int, DTOModulesBlock> diffData = new Dictionary<int, DTOModulesBlock>();
foreach (var item in currModules)
{
LastRecipeFullData = currModules;
if (!LastModulesData.ContainsKey(item.Key))
{
diffData.Add(item.Key, item.Value);
}
else
{
// comparazione
if (!item.Value.Equals(LastModulesData[item.Key]))
{
diffData[item.Key] = item.Value;
}
}
}
if (diffData.Count > 0)
{
LastModulesData = currModules;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").modulesData(currModules);
@@ -336,17 +329,65 @@ namespace Thermo.Active.Listeners.SignalR
public static void SendThermoWarmersData(object warmers)
{
Dictionary<string, DTORecipeParam> currWarmers = warmers as Dictionary<string, DTORecipeParam>;
Dictionary<int, DTOWarmers> currWarmers = warmers as Dictionary<int, DTOWarmers>;
Dictionary<int, DTOWarmers> diffData = new Dictionary<int, DTOWarmers>();
// FIXME TODO: usare un foreach comparer?
if (!LastRecipeFullData.SequenceEqual(currWarmers))
foreach (var item in currWarmers)
{
LastRecipeFullData = currWarmers;
if (!LastWarmersData.ContainsKey(item.Key))
{
diffData.Add(item.Key, item.Value);
}
else
{
// comparazione
if (!item.Value.Equals(LastWarmersData[item.Key]))
{
diffData[item.Key] = item.Value;
}
}
}
if (diffData.Count > 0)
{
LastWarmersData = currWarmers;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").warmersData(currWarmers);
}
}
public static void SendThermoAreaData(object area)
{
Dictionary<string, double> currArea = area as Dictionary<string, double>;
Dictionary<string, double> diffData = new Dictionary<string, double>();
foreach (var item in currArea)
{
if (!LastAreaData.ContainsKey(item.Key))
{
diffData.Add(item.Key, item.Value);
}
else
{
// comparazione
if (!item.Value.Equals(LastAreaData[item.Key]))
{
diffData[item.Key] = item.Value;
}
}
}
if (diffData.Count > 0)
{
LastAreaData = currArea;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").areaData(currArea);
}
}
public static void SendThermoGaugeData(object gaugeData)
{
GaugeModel currGauge = gaugeData as GaugeModel;
@@ -359,6 +400,30 @@ namespace Thermo.Active.Listeners.SignalR
context.Clients.Group("ncData").gaugeData(currGauge);
}
}
public static void SendThermoProdInfoData(object prodInfoData)
{
ProdInfoModel currProdInfo = prodInfoData as ProdInfoModel;
if (!LastProdInfoData.Equals(currProdInfo))
{
LastProdInfoData = currProdInfo;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").prodInfoData(currProdInfo);
}
}
public static void SendThermoProdCycleData(object prodCycleData)
{
ProdCycleModel currProdCycle = prodCycleData as ProdCycleModel;
if (!LastProdCycleData.Equals(currProdCycle))
{
LastProdCycleData = currProdCycle;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").prodCycleData(currProdCycle);
}
}
public static void SetGatewayRebootStatus(object status)
{
@@ -428,11 +493,16 @@ namespace Thermo.Active.Listeners.SignalR
group.recipeFullData(LastRecipeFullData);
group.recipeOverData(LastRecipeOverData);
// Send THERMO Modules data
group.recipeModulesData(LastModulesData);
group.modulesData(LastModulesData);
// Send THERMO Warmers data
group.recipeWarmersData(LastWarmersData);
group.warmersData(LastWarmersData);
group.areaData(LastAreaData);
// THERMO Gauges
group.gaugeData(LastGaugeData);
// THERMO prod info data
group.prodInfoData(LastProdInfoData);
// THERMO prod cycle data
group.prodCycleData(LastProdCycleData);
Debug.WriteLine(string.Format("{0} {1} Broadcast..completed", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"), DateTime.Now.Millisecond));
Monitor.Exit(_broadcastlock);
@@ -30,9 +30,14 @@ namespace Thermo.Active.Listeners
// FIXME TODO inserire oggetti corretti per THERMO
public static Dictionary<string, DTORecipeParam> LastRecipeFullData = new Dictionary<string, DTORecipeParam>();
public static Dictionary<string, RecipeCatStatus> LastRecipeOverData = new Dictionary<string, RecipeCatStatus>();
public static List<DTOScadaModel> LastModulesData = new List<DTOScadaModel>();
public static List<DTOScadaModel> LastWarmersData = new List<DTOScadaModel>();
public static Dictionary<int, DTOModulesBlock> LastModulesData = new Dictionary<int, DTOModulesBlock>();
public static Dictionary<int, DTOWarmers> LastWarmersData = new Dictionary<int, DTOWarmers>();
public static Dictionary<string, double> LastAreaData = new Dictionary<string, double>();
public static ThermoModels.GaugeModel LastGaugeData = new ThermoModels.GaugeModel();
public static ThermoModels.ProdCycleModel LastProdCycleData = new ThermoModels.ProdCycleModel();
public static ThermoModels.ProdInfoModel LastProdInfoData = new ThermoModels.ProdInfoModel();
public static bool LastIsNcConnected = false;
+1 -1
View File
@@ -31,4 +31,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.3.2")]
[assembly: AssemblyVersion("0.8.1")]
+1
View File
@@ -223,6 +223,7 @@
<Compile Include="Controllers\SignalR\NcHub.cs" />
<Compile Include="Controllers\WebApi\ApiAlarmController.cs" />
<Compile Include="Controllers\WebApi\ModulesController.cs" />
<Compile Include="Controllers\WebApi\ProdController.cs" />
<Compile Include="Controllers\WebApi\WarmersController.cs" />
<Compile Include="Controllers\WebApi\RecipeController.cs" />
<Compile Include="Controllers\WebApi\AuthorizationController.cs" />
+7 -1
View File
@@ -16,8 +16,9 @@ using System.Windows.Forms;
using TeamDev.SDK.MVVM;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using static Thermo.Active.Utils.StepLogger;
using static Thermo.Active.Utils.ThermoActiveLogger;
using static Thermo.Active.Utils.ExceptionManager;
using Thermo.Active.Controllers.WebApi;
namespace Thermo.Active
{
@@ -84,6 +85,11 @@ namespace Thermo.Active
if (!string.IsNullOrWhiteSpace(ServerStartupConfig.ServerAddress.ToString()))
opt.Urls.Add("http://" + ServerStartupConfig.ServerAddress.ToString() + ":" + ServerStartupConfig.ServerPort.ToString());
// read and save last CURRENT RECIPE data...
ServerConfigController.ReadLastRecipe();
RecipeController.WriteCurrentRecipeToPlc();
//starts threads
using (WebApp.Start<App_Start.Startup>(opt))
{
if (databaseStatus)
Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
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"
width="1210mm"
height="395mm"
viewBox="0 0 1210 395"
version="1.1"
id="svg837"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="svg-dashboard.svg">
<defs
id="defs831" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.175"
inkscape:cx="2014.3602"
inkscape:cy="807.48659"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1" />
<metadata
id="metadata834">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,98)">
<path
style="fill:#99cfff;fill-opacity:1;stroke:#0000ff;stroke-width:17.45055199;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 141.52222,272.36505 C 94.580005,264.01354 52.798415,227.68959 30.964914,176.24941 16.635779,142.48946 11.117361,90.23297 17.884451,52.385032 c 6.837198,-38.240097 20.372985,-69.021254 40.570884,-92.260626 14.9277,-17.175622 28.66517,-26.878813 50.573525,-35.722393 l 16.78008,-6.77341 103.18759,-1.00415 c 56.75329,-0.55393 279.02426,-0.60988 493.9358,-0.1278 214.91118,0.48292 361.44767,-2.04651 423.23837,-0.38138 l 20.3048,0.17827 v 0 0 0 C 991.70053,16.313901 958.98623,139.33213 936.88307,266.17661 v 0 c -5.14363,9.27342 32.42106,7.85482 -459.6572,8.23526 -279.43676,0.21596 -320.03499,0.74215 -335.70457,-2.0336 z"
id="path1456"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccccccccccccscc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
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"
width="1206mm"
height="395mm"
viewBox="0 0 1206 395"
version="1.1"
id="svg860"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="svg-dashboard2.svg">
<defs
id="defs854">
<inkscape:path-effect
effect="bspline"
id="path-effect1493-1"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1435-1"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1493-1-2"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1435-1-6"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1493-1-3"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1435-1-4"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.12374369"
inkscape:cx="-141.5134"
inkscape:cy="518.4563"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1" />
<metadata
id="metadata857">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,98)">
<path
style="fill:#99cfff;fill-opacity:1;stroke:#0000ff;stroke-width:17.42772102;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 143.24538,-73.855172 C 96.293637,-65.52689 54.503637,-29.303801 32.665745,21.993484 18.333725,55.659659 12.81419,107.77106 19.582647,145.51389 c 6.838563,38.13392 20.377099,68.82957 40.579052,92.0044 14.930725,17.12793 28.670954,26.80415 50.583741,35.62318 l 16.78352,6.7546 103.20833,1.00137 c 56.76476,0.5524 279.08053,0.60816 494.03542,0.12727 214.9545,-0.48157 361.52059,2.04088 423.32369,0.38037 l 20.3092,-0.1778 v 0 0 0 C 993.59512,181.48484 960.87422,58.808234 938.76657,-67.68394 v 0 c 0,0 16.26609,-4.018334 -459.74984,-8.21239 -279.48083,-2.462432 -320.09952,-0.7401 -335.77228,2.027933 z"
id="path1456"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccccccccccccscc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
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"
sodipodi:docname="svg-dashboard3.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
id="svg2161"
version="1.1"
viewBox="0 0 920 94"
height="94mm"
width="920mm">
<defs
id="defs2155">
<inkscape:path-effect
only_selected="false"
apply_with_weight="true"
apply_no_weight="true"
helper_size="0"
steps="2"
weight="33.333333"
is_visible="true"
id="path-effect1493-1"
effect="bspline" />
<inkscape:path-effect
only_selected="false"
apply_with_weight="true"
apply_no_weight="true"
helper_size="0"
steps="2"
weight="33.333333"
is_visible="true"
id="path-effect1435-1"
effect="bspline" />
</defs>
<sodipodi:namedview
inkscape:document-rotation="0"
inkscape:window-maximized="1"
inkscape:window-y="-9"
inkscape:window-x="-9"
inkscape:window-height="1001"
inkscape:window-width="1920"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:document-units="mm"
inkscape:cy="-169.24053"
inkscape:cx="1863.1839"
inkscape:zoom="0.30578698"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base" />
<metadata
id="metadata2158">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-203)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Livello 1">
<path
inkscape:connector-curvature="0"
id="path844"
d="m 6.125405,210.10492 c 54.690648,31.20908 66.397365,63.57562 72.109211,81.27882 v 0"
style="fill:none;stroke:#0000ff;stroke-width:8.69768238;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="ccc" />
<path
inkscape:connector-curvature="0"
id="path846"
d="m 74.797676,291.49749 c 274.379674,-1.68455 569.282634,0.0693 853.718824,0.0851"
style="fill:none;stroke:#0000ff;stroke-width:8.69768238;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
id="path848"
d="M 4.4387748,209.64992 924.86717,210.86705"
style="fill:none;stroke:#0000ff;stroke-width:8.69768238;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
id="path852"
d="m 64.831554,253.9737 c -17.389756,-21.62927 -7.539172,-11.26644 -50.667108,-42.06328 3.521079,-0.0839 907.899034,1.79363 909.257894,2.88249 0.60108,0.48165 4.06725,56.6157 4.27366,69.82023 l 0.07,4.50521 -423.39903,-0.26844 c -141.05057,-0.11751 -280.12534,-0.6218 -422.634623,0.54985 -0.01626,-0.0709 0.592478,-0.79198 0.592478,-0.79198 -2.535322,-9.70363 -11.44174,-25.39396 -11.44174,-25.39396 z"
style="fill:#b6d6f3;fill-rule:evenodd;stroke:none;stroke-width:0.43488413;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
sodipodi:nodetypes="cccccccscc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -1,305 +1,72 @@
// out: false, sourceMap: false, main: ../style.less
@import "colors.less";
.kW {
width: 16px;
height: 11px;
font-family: WorkSans;
font-size: 12px;
font-weight: 800;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
margin-left:20px ;
color: @color-darkish-blue;
}
.Potenza {
width: 65px;
height: 65px;
font-family: WorkSans;
font-size: 14px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
margin-left: -8px;
color: @color-darkish-blue;
}
// }
// #SecondArchInfo
// .Combined-Shape {
// width: 68px;
// height: 50px;
// box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.5);
// background-color: var(--light-grey-blue);
// }
// .Combined-Shape-Copy-3 {
// width: 55px;
// height: 21px;
// background-color: var(--darkish-blue);
// }
// .Valor2{
// width: 27px;
// height: 23px;
// font-family: WorkSans;
// font-size: 18.9px;
// font-weight: 500;
// font-stretch: normal;
// font-style: normal;
// line-height: normal;
// letter-spacing: normal;
// text-align: center;
// color: var(--darkish-blue);
// }
.Bar {
width: 16px;
height: 11px;
font-family: WorkSans;
font-size: 9.7px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: @color-darkish-blue;
}
.Aria {
width: 23px;
height: 14px;
font-family: WorkSans;
font-size: 10px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: end;
color: @color-darkish-blue;
}
// #ThirdArchInfo
// .Combined-Shape-Copy-3 {
// width: 64px;
// height: 49px;
// background-color: var(--darkish-blue);
// }
// .Valor3{
// width: 50px;
// height: 23px;
// font-family: WorkSans;
// font-size: 18.9px;
// font-weight: 500;
// font-stretch: normal;
// font-style: normal;
// line-height: normal;
// letter-spacing: normal;
// text-align: center;
// color: @color-darkish-blue;
// }
// .bar {
// width: 16px;
// height: 11px;
// font-family: WorkSans;
// font-size: 9.7px;
// font-weight: 500;
// font-stretch: normal;
// font-style: normal;
// line-height: normal;
// letter-spacing: normal;
// text-align: center;
// color: @color-darkish-blue;
// }
// .Vuoto {
// width: 35px;
// height: 14px;
// font-family: WorkSans;
// font-size: 12px;
// font-weight: normal;
// font-stretch: normal;
// font-style: normal;
// line-height: normal;
// letter-spacing: normal;
// text-align: center;
// color: @color-darkish-blue;
// }
// .divider-columnt {
// width: 2px;
// height: 48px;
// // background-color: @color-light-grey-blue;
// }
// .wrapper {
// position: relative;
// margin: auto;
// }
//da scommentare
// .wrapper{
// width: 90px;
// height: 90px;
// display:flex;
// }
// .meter {
// width: 50%; height: 50%;
// transform: rotateX(180deg);
// }
// //da scommentare
// .meter{
// width: 50%; height: 50%;
// margin-top:200px;
// // width: 300%;
// // height: 100%;
// transform: rotateX(180deg);
@import "colors.less";
// }
.arch {
display: flex;
justify-content: flex-end;
flex: 1;
// .outline, #mask {
// stroke: white;
// stroke-width: 65;
// }
// .range {
// stroke-width: 60;
// }
// .lbl {
// background-color: #4B4C51;
// border-radius: 2px;
// color: white;
// font-family: 'courier new';
// font-size: 15pt;
// font-weight: bold;
// padding: 4px 4px 2px 4px;
// right: -48px;
// top: 57%;
// }
// .meter_needle {
// height: 40%;
// left: 0;
// margin: auto;
// position: absolute;
// right: 0;
// top: 10%;
// transform-origin: bottom center;
// /*orientation fix*/
// transform: rotate(270deg);
// }
// .backgound-circle{
// stroke-width: 10;
// fill: none;
// stroke-dasharray: 145,80;
// stroke:gray ;
// }
// .value-circle{
// stroke-width: 10;
// stroke-dasharray: 145,80;
// fill: none;
// stroke:blue ;
// }
// //da scommentare
// path {
// stroke-width: 7;
// stroke-dasharray: none;
// fill: none;
// }
// #background-circle {
// stroke: grey;
.box-gauge {
width: 68px;
// }
div {
// #value-circle {
// stroke: blue;
// }
&:last-of-type {
margin-top: -25px;
display: flex;
flex-direction: column;
text-align: center;
body {
// background-color: rgba(0,0,0,0.8);
color:@color-darkish-blue;
font-family: Hevletica, sans-serif;
}
label {
font-size: 12px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: @color-darkish-blue;
}
}
.info {
clear: both;
padding: 10px;
font-size: 0.9em;
}
}
/* ------ Default Style ---------- */
.gauge-container {
width: 90px;
height: 90px;
display: block;
float: left;
padding: -130px;
// background-color: rgb(167, 154, 154); background container
margin: 56px;
border-radius: 3px;
position: relative;
margin-top:60px;
margin-left: -10px;
}
.label {
// display: inline-block;
color:@color-darkish-blue;
font-family: monospace;
font-size: 1.5em;
// padding: 5px 10px;
margin-left:10px;
}
.gauge-container > .gauge > .dial {
stroke:@color-darkish-blue;
stroke-width: 2;
// fill: rgba(0,0,0,0);
}
.gauge-container > .gauge > .value {
stroke:@color-darkish-blue;
stroke-width: 2;
// fill: rgba(0,0,0,0);
}
.gauge-container > .gauge > .value-text { //valore sotto l'arco
color:@color-darkish-blue;
font-family: sans-serif;
font-weight: bold;
font-size: 3.9px;
margin-top:10px;
.gauge-container {
width: 68px;
height: 68px;
display: block;
border-radius: 3px;
}
}
.gauge-container>.gauge>.dial {
stroke: @color-darkish-blue;
stroke-width: 2;
}
/* ------- Alternate Style ------- */
.wrapper {
height: 20px;
float: left;
margin: 10px;
overflow: hidden;
}
.wrapper > .gauge-container {
margin: 0;
}
.gauge-container>.gauge>.value {
stroke: @color-darkish-blue;
stroke-width: 2;
}
.gauge-container.three > .gauge > .dial {
stroke:@color-silver;
stroke-width: 4;
}
.gauge-container.three > .gauge > .value {
stroke: @color-darkish-blue;
stroke-width: 5;
}
.gauge-container.three > .gauge > .value-text {
fill: color-darkish-blue;
}
.labels{
display:flex;
flex-direction:column;
margin-left: 19px;
margin-top:-94px;
}
.arch{
display:flex;
flex-direction:column;
}
.gauge-container>.gauge>.value-text {
color: @color-darkish-blue;
font-weight: bold;
font-size: 20px;
}
.gauge-container.three>.gauge>.dial {
stroke: @color-silver;
stroke-width: 4;
}
.gauge-container.three>.gauge>.value {
stroke: @color-darkish-blue;
stroke-width: 5;
}
.gauge-container.three>.gauge>.value-text {
fill: @color-darkish-blue;
}
}
}
@@ -1,10 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.estrazione-info {
width: 560px;
height: 411px;
}
@@ -2,33 +2,33 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.avvio-produzione-info {
margin-top: 100px;
width: 653px;
height: 616px;
section.body{
.modal.avvio-produzione-info {
margin-top: 100px;
width: 653px;
height: 616px;
section{
justify-content: center;
section.body {
.specific{
section {
justify-content: center;
.disabled{
width: 420px;
height: 330px;
}
.specific {
.tast{
margin-left: 25%;
}
}
.disabled {
width: 420px;
height: 330px;
}
.tast {
margin-left: 25%;
}
}
}
}
}
@@ -8,495 +8,502 @@
@button-machine-color-to : #404040;
button:focus {
outline: none;
outline: none;
}
button {
cursor: pointer;
-webkit-tap-highlight-color: transparent;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
button[disabled] {
cursor: not-allowed !important;
cursor: not-allowed !important;
* {
cursor: not-allowed !important;
}
* {
cursor: not-allowed !important;
}
}
button.btn[disabled] {
border-radius: 2px;
border-radius: 2px;
background-color: #dddddd;
background-image: none;
box-shadow: none;
color: @color-warm-grey;
border-radius: 2px;
border-radius: 2px;
background-color: #dddddd;
background-image: none;
box-shadow: none;
color: @color-warm-grey;
&:hover {
box-shadow: none !important;
}
&:hover {
box-shadow: none !important;
}
}
.btn-demo {
color: #fff;
font-size: 22px;
font-weight: bold;
color: #fff;
font-size: 22px;
font-weight: bold;
}
.button.btn {
max-height: 48px;
display: inline-flex;
padding: 12px 20px !important;
min-height: 48px;
max-height: 48px;
display: inline-flex;
padding: 12px 20px !important;
min-height: 48px;
}
button.btn,
.button.btn {
height: @button-height;
box-sizing: border-box;
border-radius: 2px;
margin: 0 8px;
text-align: center;
font-size: 18px;
font-weight: bold;
box-shadow: @button-shadow;
padding: 0 20px;
border: none;
background-image: linear-gradient(to bottom, @color-white2, @color-silver);
color: @color-darkish-blue;
height: @button-height;
box-sizing: border-box;
border-radius: 2px;
margin: 0 8px;
text-align: center;
font-size: 18px;
font-weight: bold;
box-shadow: @button-shadow;
padding: 0 20px;
border: none;
background-image: linear-gradient(to bottom, @color-white2, @color-silver);
color: @color-darkish-blue;
// display: inline-block;
// align-items: flex-start;
&:active:not([disabled]) {
background-image: linear-gradient(to bottom, @color-silver, @color-white2);
border: none !important;
box-shadow: inset @button-shadow !important;
}
// display: inline-block;
// align-items: flex-start;
&:active:not([disabled]) {
background-image: linear-gradient(to bottom, @color-silver, @color-white2);
border: none !important;
box-shadow: inset @button-shadow !important;
}
&:hover {
box-shadow: inset 0px 0px 0px 2px #8eb5e2;
}
&:hover {
box-shadow: inset 0px 0px 0px 2px #8eb5e2;
}
&.dark-blue {
background-color: @color-blue;
color: white;
}
&.btn-danger {
color: @color-scarlet;
}
&.dark-blue:active {
background-color: @color-darkish-blue-two !important;
}
&.pressed {
background-image: linear-gradient(to bottom, @color-silver, @color-white2);
border: none !important;
box-shadow: inset @button-shadow !important;
}
}
button.btn.btn-success {
background-image: linear-gradient(to bottom, @button-success-color-from, @button-success-color-to);
&.dark-blue {
background-color: @color-blue;
color: white;
border: #001e48 1px solid;
}
&:active {
background-image: linear-gradient(to bottom, @button-success-color-to, @button-success-color-from) !important;
box-shadow: inset @button-shadow;
border: #001e48 1px solid !important;
color: #8eb5e2
}
}
&.btn-danger {
color: @color-scarlet;
}
button.btn.btn-success[disabled] {
border-radius: 2px;
border-radius: 2px;
box-shadow: none;
color: @color-warm-grey;
border: none;
&.dark-blue:active {
background-color: @color-darkish-blue-two !important;
}
&:hover {
box-shadow: none !important;
background-image: linear-gradient(to bottom, @button-success-color-from, @button-success-color-to) !important;
}
}
&.pressed {
background-image: linear-gradient(to bottom, @color-silver, @color-white2);
border: none !important;
box-shadow: inset @button-shadow !important;
}
button.under {
width: 208px;
height: 45px;
object-fit: contain;
border-radius: 100px;
background-image: linear-gradient(to bottom, @button-machine-color-from, @button-machine-color-to);
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
border: none;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
img {
max-width: 178px;
max-height: 45px;
}
&.pressed:active,
&:active {
background-image: none;
background-color: @button-machine-color-to;
}
&.pressed {
background-image: linear-gradient(to bottom, @button-machine-color-to, @button-machine-color-from);
box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.4);
}
}
button.square {
// width: @button-height;
// height: @button-height;
border-radius: 2px !important; // background-color: #4b4b4b;
height: @button-height;
width: @button-height;
padding: 0;
margin: 0;
}
&:hover {
background-color: @button-success-color-to;
}
button.btn.btn-success {
background-image: linear-gradient(to bottom, @button-success-color-from, @button-success-color-to);
color: white;
border: #001e48 1px solid;
&:active {
background-image: linear-gradient(to bottom, @button-success-color-to, @button-success-color-from) !important;
box-shadow: inset @button-shadow;
border: #001e48 1px solid !important;
color: #8eb5e2
}
}
button.btn.btn-success[disabled] {
border-radius: 2px;
border-radius: 2px;
box-shadow: none;
color: @color-warm-grey;
border: none;
&:hover {
box-shadow: none !important;
background-image: linear-gradient(to bottom, @button-success-color-from, @button-success-color-to) !important;
}
}
button.under {
width: 208px;
height: 45px;
object-fit: contain;
border-radius: 100px;
background-image: linear-gradient(to bottom, @button-machine-color-from, @button-machine-color-to);
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
border: none;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
img {
max-width: 178px;
max-height: 45px;
}
&.pressed:active,
&:active {
background-image: none;
background-color: @button-machine-color-to;
}
&.pressed {
background-image: linear-gradient(to bottom, @button-machine-color-to, @button-machine-color-from);
box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.4);
}
}
button.square {
// width: @button-height;
// height: @button-height;
border-radius: 2px !important; // background-color: #4b4b4b;
&:hover {
background-color: @button-success-color-to;
}
}
.btn-spacer {
margin: 0 8px;
padding: 0 4px;
display: flex;
margin: 0 8px;
padding: 0 4px;
display: flex;
&.collapsed {
margin: 0;
padding: 0;
}
&.collapsed {
margin: 0;
padding: 0;
}
}
button.modal-close {
width: 28px;
height: 28px;
padding: none;
border-radius: 50%;
border: none;
background-color: #002680;
color: #fff;
width: 28px;
height: 28px;
padding: none;
border-radius: 50%;
border: none;
background-color: #002680;
color: #fff;
i {
font-size: 18px;
}
i {
font-size: 18px;
}
}
.btn-group {
margin: 0 8px;
padding: 0;
display: flex;
margin: 0 8px;
padding: 0;
display: flex;
button {
border-radius: 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
button {
border-radius: 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
&:first-child {
border-top-left-radius: 2px !important;
border-bottom-left-radius: 2px !important;
}
&:last-child {
border-top-right-radius: 2px !important;
border-bottom-right-radius: 2px !important;
}
&:first-child {
border-top-left-radius: 2px !important;
border-bottom-left-radius: 2px !important;
}
&:last-child {
border-top-right-radius: 2px !important;
border-bottom-right-radius: 2px !important;
}
}
}
button.soft {
width: 96px;
height: 48px;
margin: 4px;
background-image: linear-gradient(to bottom, #f1f1f1, @color-silver);
box-sizing: border-box;
border: none;
box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
color: @color-darkish-blue;
font-size: 14px;
border-radius: 2px;
width: 96px;
height: 48px;
margin: 4px;
background-image: linear-gradient(to bottom, #f1f1f1, @color-silver);
box-sizing: border-box;
border: none;
box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
color: @color-darkish-blue;
font-size: 14px;
border-radius: 2px;
&.icon {
display: flex;
padding: 1px 12px;
align-items: center;
text-align: left;
}
&.icon {
display: flex;
padding: 1px 12px;
align-items: center;
text-align: left;
}
&.axes {
width: 54px;
font-size: 1.8em;
display: block;
font-weight: 600;
padding: 0px;
text-align: center;
}
&.axes {
width: 54px;
font-size: 1.8em;
display: block;
font-weight: 600;
padding: 0px;
text-align: center;
}
img {
image-rendering: -webkit-optimize-contrast;
display: inline;
vertical-align: bottom;
margin-right: 6px;
}
&.active {
background-image: linear-gradient(to bottom, @color-cerulean, @color-clear-blue) !important;
color: white !important;
box-shadow: inset 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
img {
width: 18px;
image-rendering: -webkit-optimize-contrast;
display: inline;
vertical-align: bottom;
margin-right: 6px;
filter: grayscale(100%) invert(100) saturate(200);
}
}
&.active {
background-image: linear-gradient(to bottom, @color-cerulean, @color-clear-blue) !important;
color: white !important;
box-shadow: inset 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
&:active {
background-image: linear-gradient(to bottom, @color-silver, #f1f1f1);
box-shadow: inset 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
}
img {
filter: grayscale(100%) invert(100) saturate(200);
}
&.spaced {
margin: 4px 8px;
}
&[disabled]:not(.readonly) {
background-color: #dddddd !important;
// background-image: none !important;
box-shadow: none !important;
color: @color-warm-grey;
img {
filter: grayscale(100%) invert(44%);
}
}
&:active {
background-image: linear-gradient(to bottom, @color-silver, #f1f1f1);
box-shadow: inset 0px 0px 3px 0px rgba(0, 0, 0, 0.5);
}
&.square {
width: 60px;
}
&.spaced {
margin: 4px 8px;
}
&.incremental {
padding: 0px 2px;
margin-right: 0px;
margin-left: 0px;
}
&[disabled]:not(.readonly) {
background-color: #dddddd !important;
// background-image: none !important;
box-shadow: none !important;
color: @color-warm-grey;
&.firstIncr {
margin-left: 4px;
border-radius: 2px 0px 0px 2px !important
}
img {
filter: grayscale(100%) invert(44%);
}
}
&.middleIncr {
border-radius: 0px !important
}
&.square {
width: 60px;
}
&.lastIncr {
border-radius: 0px 2px 2px 0px !important
}
&.incremental {
padding: 0px 2px;
margin-right: 0px;
margin-left: 0px;
}
i.fa {
font-size: 24px;
}
&.firstIncr {
margin-left: 4px;
border-radius: 2px 0px 0px 2px !important
}
&.readonly {
background: transparent;
box-shadow: none;
border: 3px solid #4e585e;
color: #ddd;
cursor: default;
}
&.middleIncr {
border-radius: 0px !important
}
&.lastIncr {
border-radius: 0px 2px 2px 0px !important
}
i.fa {
font-size: 24px;
}
&.readonly {
background: transparent;
box-shadow: none;
border: 3px solid #4e585e;
color: #ddd;
cursor: default;
}
&.inverter {
background: transparent;
box-shadow: none;
border: 3px solid #657178;
color: white
}
&.inverter {
background: transparent;
box-shadow: none;
border: 3px solid #657178;
color: white
}
}
.togglebutton {
vertical-align: middle;
-webkit-tap-highlight-color: transparent;
vertical-align: middle;
-webkit-tap-highlight-color: transparent;
}
.togglebutton,
.togglebutton label,
.togglebutton input,
.togglebutton .toggle {
user-select: none;
user-select: none;
}
.togglebutton label {
cursor: pointer;
color: rgba(0, 0, 0, 0.26);
cursor: pointer;
color: rgba(0, 0, 0, 0.26);
}
.form-group.is-focused .togglebutton label {
color: rgba(0, 0, 0, 0.26);
color: rgba(0, 0, 0, 0.26);
}
.form-group.is-focused .togglebutton label:hover,
.form-group.is-focused .togglebutton label:focus {
color: rgba(0, 0, 0, .54);
color: rgba(0, 0, 0, .54);
}
fieldset[disabled] .form-group.is-focused .togglebutton label {
color: rgba(0, 0, 0, 0.26);
color: rgba(0, 0, 0, 0.26);
}
.togglebutton label input[type=checkbox] {
opacity: 0;
width: 0;
height: 0;
opacity: 0;
width: 0;
height: 0;
display: none;
}
.togglebutton label .toggle {
text-align: left;
margin-left: 5px;
text-align: left;
margin-left: 5px;
}
.togglebutton label .toggle,
.togglebutton label input[type=checkbox][disabled]+.toggle {
content: "";
display: inline-block;
width: 70px;
height: 24px;
background-color: #ddd;
border-radius: 15px;
margin-right: 15px;
transition: background 0.3s ease;
vertical-align: middle;
position: relative;
box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.5);
line-height: 24px;
text-align: center;
color: #979797;
font-size: 10px;
text-transform: uppercase;
content: "";
display: inline-block;
width: 70px;
height: 24px;
background-color: #ddd;
border-radius: 15px;
margin-right: 15px;
transition: background 0.3s ease;
vertical-align: middle;
position: relative;
box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.5);
line-height: 24px;
text-align: center;
color: #979797;
font-size: 10px;
text-transform: uppercase;
}
.togglebutton label .toggle:after {
content: "";
display: inline-block;
width: 20px;
height: 20px;
background-image: linear-gradient(to bottom, #1756ad, #002680);
border-radius: 20px;
position: relative;
box-shadow: 0 1px 1px 0px rgba(0, 0, 0, 0.4);
left: 1px;
top: 2px;
position: absolute;
border: none;
transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease;
content: "";
display: inline-block;
width: 20px;
height: 20px;
background-image: linear-gradient(to bottom, #1756ad, #002680);
border-radius: 20px;
position: relative;
box-shadow: 0 1px 1px 0px rgba(0, 0, 0, 0.4);
left: 1px;
top: 2px;
position: absolute;
border: none;
transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease;
}
.togglebutton label input[type=checkbox][disabled]+.toggle:after,
.togglebutton label input[type=checkbox][disabled]:checked+.toggle:after {
background-color: #BDBDBD;
background-color: #BDBDBD;
}
.togglebutton label input[type=checkbox]+.toggle:active:after,
.togglebutton label input[type=checkbox][disabled]+.toggle:active:after {
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.6), 0 0 0 20px rgba(0, 0, 0, 0.2);
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.6), 0 0 0 20px rgba(0, 0, 0, 0.2);
}
.togglebutton label input[type=checkbox]:checked+.toggle:after {
left: 48px;
left: 48px;
}
.togglebutton label input[type=checkbox]:checked+.toggle {
content: "";
background-image: linear-gradient(to bottom, #3fa4ff, #1791ff);
color: #fff;
content: "";
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;
span.toggle {
height: 40px;
width: 112px;
border-radius: 20px;
font-size: 17px;
line-height: 40px;
font-weight: bold;
&:after {
width: 36px;
height: 36px;
}
&:after {
width: 36px;
height: 36px;
}
}
input[type=checkbox]:checked+.toggle:after {
left: 74px;
}
input[type=checkbox]:checked+.toggle:after {
left: 74px;
}
}
.custom-checkbox {
width: 22px;
height: 22px;
display: flex;
// margin-left: 16px;
align-items: center;
position: relative;
width: 22px;
height: 22px;
display: flex;
// margin-left: 16px;
align-items: center;
position: relative;
}
.custom-checkbox label {
cursor: pointer;
position: absolute;
width: 22px;
height: 22px;
top: 0;
left: 0;
background-color: @color-white2;
box-shadow: inset 0 1px 3px @color-black-50;
border-radius: 2px;
cursor: pointer;
position: absolute;
width: 22px;
height: 22px;
top: 0;
left: 0;
background-color: @color-white2;
box-shadow: inset 0 1px 3px @color-black-50;
border-radius: 2px;
}
.custom-checkbox label:after {
opacity: 0;
content: '';
position: absolute;
width: 16px;
height: 9px;
background: transparent;
top: 3px;
left: 2px;
border: 5px solid #1791ff;
border-top: none;
border-right: none;
transform: rotate(-48deg);
opacity: 0;
content: '';
position: absolute;
width: 16px;
height: 9px;
background: transparent;
top: 3px;
left: 2px;
border: 5px solid #1791ff;
border-top: none;
border-right: none;
transform: rotate(-48deg);
}
.custom-checkbox input[type=checkbox]:checked+label {
cursor: pointer;
position: absolute;
width: 22px;
height: 22px;
top: 0;
left: 0;
background-color: @color-white2;
border: solid 1px @color-clear-blue;
border-radius: 2px;
cursor: pointer;
position: absolute;
width: 22px;
height: 22px;
top: 0;
left: 0;
background-color: @color-white2;
border: solid 1px @color-clear-blue;
border-radius: 2px;
}
.custom-checkbox input[type=checkbox]:checked+label:after {
opacity: 1;
opacity: 1;
}
.custom-checkbox-label {
display: flex;
margin-left: 8px;
font-size: 18px;
line-height: 1.11;
color: @color-greyish-brown;
display: flex;
margin-left: 8px;
font-size: 18px;
line-height: 1.11;
color: @color-greyish-brown;
}
// .togglebutton label input[type=checkbox]:checked+.toggle:after {
@@ -1,96 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.ciclo-info {
section{
.specific{
padding: 0 10px;
.caricatore-buttons{
button{
margin-right: 15px;
margin-left: 5px;
width: 48px;
height: 48px;
object-fit: contain;
border-radius: 2px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.5);
border: none;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
&:last-of-type{
border: solid 1px #001e48;
background-image: linear-gradient(to bottom, #1756ad, #002680);
}
}
}
.svg-area{
.disegnoCaricatore{
flex-shrink: 0;
width: 1137px;
height: 707px;
}
.input-circles{
label{
object-fit: contain;
background-color: #979797;
}
.circle1{
position: relative;
top: 200px;
right: 25px;
}
.circle2{
position: relative;
top: 400px;
right: 25px;
}
.circle3{
width: 135px;
position: relative;
top: 545px;
right: 410px;
}
.circle4{
position: relative;
top: 585px;
right: 200px;
}
}
}
.box {
margin-bottom: 10px;
width: 500px;
.body{
padding: 5px 10px;
}
}
}
}
}
@@ -1,46 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.controstamposetup-info {
width: 1820px;
height: 980px;
section{
.controstampo-cycle{
margin-left: 37%;
}
.specific{
padding-left: 5px;
.box {
margin-bottom: 5px;
background-color: #e5f3ff;
&:first-of-type{
background-color: white;
}
&:last-of-type{
background-color: #b3dbff;
}
}
.input-area{
width: 480px;
}
}
}
}
@@ -0,0 +1,487 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
.dashboard {
height : 100%;
width : 100%;
background-image: url("../../assets/icons/png/bg.png");
position : fixed;
z-index : 1001;
display : flex;
flex-direction : column;
justify-content : flex-start;
.header {
width : 100%;
display: flex;
.ribbon-container {
height : 80px;
z-index: 900;
}
.box-date {
display : flex;
width : 70%;
margin-left: 100px;
div {
flex-shrink: 0;
font-size : 47px;
text-align : right;
font-weight: 500;
}
time {
flex-shrink: 0;
transition : color 200ms ease-in-out;
margin-left: 28px;
display : flex;
font-size : 120px;
}
}
.arch {
width: 100%;
.box-gauge {
height: 150px;
width : 150px;
.gauge-container,
.three {
width : 126px;
height: 92px;
.gauge {
.value {
stroke: #1791ff;
}
.value-text {
fill: #4b4b4b;
}
}
}
div {
&:last-of-type {
margin-top: -10px;
label {
&:first-of-type {
font-size : 18px;
font-weight : 300;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&:last-of-type {
font-size : 26px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1.96;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
}
}
}
}
.header-buttons {
display: inline-block;
.box-close-dashboard {
height : 70px;
text-align: right;
button.modal-close {
background-color: #4B4B4B;
margin : 23px;
}
}
.user-info {
margin-top : 10px;
display : flex;
font-size : 25px;
color : @color-input-light;
flex-grow : 1;
justify-content: flex-end;
margin-right : 21px;
button.profile {
width : 48px;
height : 48px;
background-image: url("../profile.png");
color : #000;
background-size : cover;
border : none;
background-color: transparent;
&.colorWhite {
color: #FFF;
}
}
div {
align-self : center;
margin-right: 10px;
font-size : 18px;
}
}
}
}
section {
margin-top : -400px;
height : 722px;
display : flex;
justify-content: flex-end;
padding-right : 15px;
padding-bottom : 50px;
.specific {
display : flex;
flex-direction : column;
justify-content: flex-end;
div {
display: flex;
}
//inizio sezione style del primo specific
&:first-of-type {
margin-right: 15%;
div {
&:first-of-type {
img {
flex-shrink: 0;
width : 41px;
height : 41px;
object-fit : contain;
}
label {
flex-shrink : 0;
font-size : 54px;
font-weight : normal;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : right;
color : #4b4b4b;
}
}
&:last-of-type {
margin: unset;
button {
flex-shrink : 0;
width : 65px;
height : 65px;
box-shadow : 0 2px 10px 0 rgba(0, 0, 0, 0.5);
border : solid 3px #4b4b4b;
background-color: rgba(255, 255, 255, 0.2);
border-radius : 50%;
color : #4b4b4b;
font-size : 50px;
text-align : center;
}
label {
flex-shrink: 0;
&:first-of-type {
font-size : 12px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&:last-of-type {
font-size : 25px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
}
}
}
//inizio sezione style del secondo specific
label {
flex-shrink: 0;
&:first-of-type {
font-size : 26px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1.96;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&:last-of-type {
font-size : 120px;
font-weight : 300;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
//inizio sezione style del terzo specific
&:last-of-type {
margin-left: 15%;
div {
flex-shrink : 0;
width : 542px;
height : 71px;
background-color: rgba(0, 0, 0, 0.5);
}
.actual {
background-color: unset;
width : unset;
height : unset;
.specific {
background-color: unset;
width : unset;
height : unset;
margin : unset;
label {
flex-shrink: 0;
&:first-of-type {
font-size : 26px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1.96;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&:last-of-type {
font-size : 120px;
font-weight : 300;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
}
}
aside {
margin-top: 5px;
width : 641px;
height : 100%;
overflow-x: hidden;
.component {
width : 621px;
height: 77px;
}
}
.component-info {
width : unset;
height : unset;
background-color: unset;
display : flex;
flex-direction : column;
section {
margin : unset;
padding : unset;
height : unset;
width : unset;
display : flex;
justify-content: flex-end;
section {
margin : unset;
padding : unset;
height : unset;
width : unset;
display : flex;
flex-direction: column;
.component {
width : 478px;
height : 60px;
background-color: #e8e8e8;
div {
flex-shrink: unset;
button {
border-color : black;
width : 50PX;
height : 50px;
border-radius : 50%;
background-color: unset;
}
}
}
}
}
.component {
width : 641px;
height : 84px;
background-color: #e8e8e8;
display : flex;
flex-direction : column;
justify-content : flex-end;
div {
flex-shrink : 0;
margin : auto;
padding : 0px 15px;
width : unset;
height : unset;
background-color: unset;
label {
flex-shrink : 0;
font-size : 54px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : right;
color : #4b4b4b;
}
.specific {
height : unset;
width : unset;
background-color: unset;
margin : unset;
label {
flex-shrink: 0;
&:first-of-type {
font-size : 12px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&:last-of-type {
font-size : 25px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
}
button {
height : 20px;
width : 20px;
background-color: black;
}
}
span {
flex-shrink : 0;
width : 100%;
height : 1px;
background-color: #676767;
}
}
}
}
}
}
}
@@ -1,30 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.estrazione-info {
width: 1820px;
height: 785px;
section.body{
section{
.specific {
justify-content: flex-end;
padding-left: 10px;
.box{
margin:0;
background-color: #e5f3ff;
}
}
}
}
}
@@ -126,7 +126,10 @@ footer {
background-image: url(../icons/png/SCADA-big.png);
background-size: cover;
}
button.ricetta{
background-image: url(../icons/png/gestione-programmi-BIG.png);
background-size: cover;
}
button.jobeditor{
background-image: url(../icons/png/editor-BIG.png);
background-size: cover;
@@ -135,6 +138,14 @@ footer {
background-image: url(../icons/png/users-BIG.png);
background-size: cover;
}
button.progrprerisc{
background-image: url(../icons/png/programmazione.png);
background-size: cover;
}
button.clock{
background-image: url(../icons/png/dashboard.png);
background-size: cover;
}
button:active{
box-shadow: 0px 0px 1px 1px #FFF;
@@ -1,212 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.formato-info {
.radio-buttons{
display: flex;
justify-content: flex-start;
input{
width: 24px;
height: 24px;
object-fit: contain;
border-radius: 12px;
background-color: #f1f1f1;
}
label{
font-size: 18px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 1.11;
letter-spacing: normal;
text-align: right;
color: #4b4b4b;
&:first-of-type{
font-size: 24px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: @color-darkish-blue;
padding-right: 200px;
padding-left: 20px;
}
}
}
.specific{
margin-left: 5px;
width: 1271px;
height: 825px;
.svg-area{
margin-left: 120px;
margin-top: 70px;
width: 999px;
height: 527px;
.disegnoStampo {
height: 473px;
width: 723px;
}
.disegnoLastra {
height: 468px;
width: 854px;
}
.disegnoPiastra {
height: 468px;
width: 751px;
}
.disegnoCornice {
height: 468px;
width: 744px;
}
.disegnoControstampo {
height: 468px;
width: 692px;
}
.border-cornice {
.circle1{
position: relative;
right: 730px;
top: 300px;
}
.circle2{
position: relative;
right: 180px;
top: 230px;
}
}
.border-piastra {
.circle1{
position: relative;
right: 800px;
top: 310px;
}
.circle2{
position: relative;
right: 180px;
top: 220px;
}
}
.border-lastra {
.circle1{
position: relative;
right: 820px;
top: 100px;
}
.circle2{
position: relative;
right: 800px;
top: 240px;
}
.circle3{
position: relative;
right: 200px;
top: 180px;
}
}
.border-stampo {
.circle1{
position: relative;
right: 780px;
top: 80px;
}
.circle2{
position: relative;
right: 870px;
top: 130px;
}
.circle3{
position: relative;
right: 720px;
top: 240px;
}
.circle4{
position: relative;
right: 150px;
top: 190px;
}
.circle5{
position: relative;
top: -50px;
}
}
.border-controstampo {
.circle1{
position: relative;
right: 730px;
top: 140px;
}
}
}
.slides {
margin-top: 45px;
margin-left: 20px;
width: 1241px;
height: 160px;
display: flex;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
img {
flex-shrink: 0;
width: 215px;
height: 140px;
margin-right: 25px;
border: 1px solid #bbbcbc;
}
.imgborder {
border: 1px solid @color-darkish-blue;
}
}
}
}
@@ -0,0 +1,193 @@
// out: false, sourceMap: false, main: ../style.less
@import "colors.less";
@gauge-h: 800px;
@gauge-w: 800px;
@smallgauge-h: @gauge-h - 30px;
@smallgauge-w: @gauge-w - 30px;
.box-graph-dashboard {
height : 610px;
display : flex;
align-items : center;
justify-content: flex-end;
.svg-dashboard {
background-repeat: no-repeat;
display : flex;
flex-direction : column;
justify-content : center;
&.dashboard3 {
margin-left: -150px;
margin-bottom : 250px;
height : 100px;
width : 900px;
background-size : 900px;
background-image: url(/assets/icons/svg/svg-dashboard3.svg);
label {
margin : unset;
font-size : 35px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
}
}
.time-box {
display : flex;
flex-direction : column;
justify-content: center;
height : 100%;
margin-top: 200px;
margin-right: -150px;
.svg-dashboard {
label {
margin-top : 8px;
font-size : 26px;
font-weight : 500;
font-stretch : normal;
font-style : normal;
line-height : 1.96;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
time {
font-size : 120px;
font-weight : 300;
font-stretch : normal;
font-style : normal;
line-height : normal;
letter-spacing: normal;
text-align : center;
color : #4b4b4b;
}
&.dashboard {
background-image: url(/assets/icons/svg/svg-dashboard.svg);
height : 178px;
width : 545px;
background-size : 545px;
position : relative;
}
&.dashboard2 {
height : 178px;
background-size : 545px;
width : 545px;
background-image: url(/assets/icons/svg/svg-dashboard2.svg);
}
}
.box-time-passed {
height : 117px;
margin : 40px 0px;
text-align : center;
display : flex;
justify-content: center;
flex-direction : column;
label {
&:first-of-type {
font-size: 26px;
}
&:last-of-type {
font-size: 54px;
}
}
}
}
.box-circle-piece {
margin-top: 200px;
display : flex;
align-items: center;
position : relative;
height : @gauge-h;
width : @gauge-w;
hr {
margin : auto;
height : 5px;
width : calc(@gauge-w/2);
background-color: gray;
z-index : 1;
border : none;
}
.gauge-container-dashboard {
width : @gauge-w;
height : @gauge-h;
border-radius: 5px;
position : absolute;
top : calc(~"50%" - (@gauge-h/2));
left: calc(~"50%" - (@gauge-w/2));
&.gauge1 {
width : @smallgauge-w;
height: @smallgauge-h;
top : calc(~"50%" - (@smallgauge-h/2));
left : calc(~"50%" - (@smallgauge-w/2));
.gauge {
.dial {
fill : #99CFFF;
stroke: #91A2B1;
}
.value {
stroke: #4DAAFF;
}
.value-text {
fill : black;
alignment-baseline: before-edge;
font-size : 20px;
}
}
}
&.gauge2 {
.gauge {
.value-text {
fill : black;
alignment-baseline: after-edge;
font-size : 20px;
}
.dial {
stroke: #003264;
}
.value {
stroke : #90C03D;
stroke-width: 2;
}
}
}
}
}
}
@@ -1,37 +1,54 @@
// out: false, sourceMap: false, main: ../style.less
@row: row;
@col: col;
.@{row} {
display: flex;
width: 100%;
flex-direction: row;
display: flex;
width: 100%;
flex-direction: row;
}
.@{col} {
display: flex;
flex-direction: column;
display: flex;
flex-direction: column;
}
.relative {
position: relative;
position: relative;
}
.absolute {
position: absolute;
position: absolute;
&.bottom {
bottom: 1rem;
}
&.left {
left: 1rem;
}
&.right {
right: 1rem;
}
&.top {
top: 1rem;
}
}
.full-height {
height: 100%;
height: 100%;
}
.full-width {
width: 100%;
width: 100%;
}
.pull-right {
float: right;
float: right;
}
.pull-left {
float: left;
}
float: left;
}
@@ -4,196 +4,195 @@
@header-button-size: 44px;
#app>header {
display: flex;
flex-flow: row nowrap;
display: flex;
flex-flow: row nowrap;
align-items: center;
height: @header-height;
width: calc(~"100% - 152px");
position: absolute;
z-index: 801;
top: 0;
right: 0;
left: 0;
button {
font-size: 28px;
justify-content: center;
align-items: center;
height: @header-height;
width: calc(~"100% - 152px");
position: absolute;
z-index: 801;
top: 0;
right: 0;
left: 0;
display: flex;
margin: 0 9px;
background-color: @color-header-button-background-color;
box-shadow: @color-header-button-box-shadow;
border-radius: @header-button-size /2;
border: none;
height: @header-button-size;
min-width: @header-button-size;
cursor: pointer;
color: @color-darkish-blue;
z-index: 1;
}
button {
font-size: 28px;
justify-content: center;
display: flex;
margin: 0 9px;
background-color: @color-header-button-background-color;
box-shadow: @color-header-button-box-shadow;
border-radius: @header-button-size /2;
border: none;
height: @header-button-size;
min-width: @header-button-size;
cursor: pointer;
color: @color-darkish-blue;
z-index: 1;
button.save-circle {
background-image: url("../../assets/icons/png/circle@2x.png");
background-size: cover;
}
button.dot-circle {
background-image: url("../../assets/icons/png/circledot@2x.png");
background-size: cover;
}
button:disabled {
filter: grayscale(100%);
}
button>img {
margin: auto;
height: @header-button-size/2;
margin: auto;
display: block;
}
button>img.h-20 {
height: 20px;
}
button>img.h-24 {
height: 24px;
}
button .machine-info small {
display: block;
text-align: left;
margin-left: 5px;
font-size: 11px;
}
button.red {
background-color: @color-scarlet;
color: white;
box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.4), inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
}
button.blue {
background-color: @color-clear-blue;
color: white;
}
button.dark-blue {
background-color: @color-darkish-blue;
color: white;
}
button.dark-blue:active {
background-color: @color-clear-blue;
}
button.gray {
background-color: @color-greyish-brown;
color: white;
}
button.profile {
width: @header-button-size;
background-image: url("../profile.png");
color: #000;
background-size: cover;
&.colorWhite {
color: #FFF;
}
}
button.save-circle {
background-image: url("../../assets/icons/png/circle@2x.png");
background-size: cover;
button.unclickable {
cursor: default;
}
&.turn-up .user-info time {
color: #fff;
}
.user-info {
display: flex;
right: 12px;
font-size: 25px;
color: @color-input-light;
justify-content: flex-end;
.window-buttons,
time {
transition: color 200ms ease-in-out;
margin-left: 10px;
padding: 0 18px;
border-left: 2px solid #bbbcbc;
border-right: 2px solid #bbbcbc;
display: flex;
justify-content: center;
align-items: center;
i {
margin-right: 10px;
}
}
}
button.dot-circle {
background-image: url("../../assets/icons/png/circledot@2x.png");
background-size: cover;
}
button:disabled {
filter: grayscale(100%);
}
button>img {
margin: auto;
height: @header-button-size/2;
margin: auto;
display: block;
}
button>img.h-20 {
height: 20px;
}
button>img.h-24 {
height: 24px;
}
button .machine-info small {
display: block;
text-align: left;
margin-left: 5px;
font-size: 11px;
}
button.red {
background-color: @color-scarlet;
color: white;
box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.4), inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
}
button.blue {
background-color: @color-clear-blue;
color: white;
}
button.dark-blue {
background-color: @color-darkish-blue;
color: white;
}
button.dark-blue:active {
background-color: @color-clear-blue;
}
button.gray {
background-color: @color-greyish-brown;
color: white;
}
button.profile {
width: @header-button-size;
background-image: url("../profile.png");
color: #000;
background-size: cover;
&.colorWhite {
color: #FFF;
}
}
button.unclickable {
cursor: default;
}
&.turn-up .user-info time {
color: #fff;
}
.user-info {
display: flex;
position: absolute;
right: 12px;
font-size: 25px;
color: @color-input-light;
flex-grow: 1;
justify-content: flex-end;
.window-buttons,
time {
transition: color 200ms ease-in-out;
margin-left: 10px;
padding: 0 18px;
border-left: 2px solid #bbbcbc;
border-right: 2px solid #bbbcbc;
display: flex;
justify-content: center;
align-items: center;
i {
margin-right: 10px;
}
}
}
.machine-info {
min-width: 60px;
margin-left: 5px;
margin-right: 5px;
}
.machine-info {
min-width: 60px;
margin-left: 5px;
margin-right: 5px;
}
}
.colorWhite {
color: #fff !important;
color: #fff !important;
}
.window-buttons {
height: 80px;
height: 80px;
display: flex;
flex-flow: row nowrap;
align-items: center;
-webkit-user-select: none;
button {
font-size: 28px;
justify-content: center;
display: flex;
flex-flow: row nowrap;
align-items: center;
-webkit-user-select: none;
margin: 0 9px;
background-color: @color-header-button-background-color;
box-shadow: @color-header-button-box-shadow;
border-radius: @header-button-size /2;
border: none;
height: @header-button-size;
min-width: @header-button-size;
cursor: pointer;
color: @color-darkish-blue;
}
button {
font-size: 28px;
justify-content: center;
display: flex;
margin: 0 9px;
background-color: @color-header-button-background-color;
box-shadow: @color-header-button-box-shadow;
border-radius: @header-button-size /2;
border: none;
height: @header-button-size;
min-width: @header-button-size;
cursor: pointer;
color: @color-darkish-blue;
}
button.gray {
background-color: @color-greyish-brown;
color: white;
}
button.gray {
background-color: @color-greyish-brown;
color: white;
}
position: fixed;
z-index: 1000;
top: 0;
right: 0;
display: flex;
padding-right: 8px !important;
position: fixed;
z-index: 1000;
top: 0;
right: 0;
display: flex;
padding-right: 8px !important;
i {
margin: auto !important;
font-size: 16px;
font-weight: normal;
}
i {
margin: auto !important;
font-size: 16px;
font-weight: normal;
}
.close {
font-size: 32px;
}
.close {
font-size: 32px;
}
.close:hover {
background-color: @button-success-color-to;
}
.close:hover {
background-color: @button-success-color-to;
}
}
@@ -3,25 +3,20 @@
@import "colors.less";
@import "fonts.less";
.@{modal}.imbutitura-info {
width: 1820px;
height: 980px;
.modal.imbutitura-info {
section {
section{
.specific {
padding-left: 5px;
justify-content: flex-end;
.specific{
padding-left: 5px;
justify-content: flex-end;
.box {
margin-bottom: 5px;
background-color: #e5f3ff;
}
.box {
margin-bottom: 5px;
background-color: #e5f3ff;
}
}
}
}
@@ -2,7 +2,7 @@
@import "colors.less";
@import "fonts.less";
@font-family: 'Work Sans',
sans-serif;
sans-serif;
@font-size: 18px;
@font-size-small: 14px;
@input-height: 48px;
@@ -10,97 +10,266 @@
.form-group {
display: block;
margin-bottom: 33px;
label {
display: block;
margin-bottom: 33px;
color: @color-label-grey;
font-size: @font-size;
line-height: 1;
font-family: @font-family;
text-align: left;
margin-bottom: 13px;
}
label {
display: block;
color: @color-label-grey;
font-size: @font-size;
line-height: 1;
font-family: @font-family;
text-align: left;
margin-bottom: 13px;
}
input,
select {
display: block;
border-radius: 2px;
border: solid 1px #dfdfdf;
height: @input-height;
line-height: 1.1;
font-family: @font-family;
color: @color-input-light;
font-size: @font-size;
background-color: @color-input-background;
margin: 0 0px;
padding-right: 0;
padding-left: 20px;
width: calc(~'100% - 20px');
}
input,
select {
display: block;
border-radius: 2px;
border: solid 1px #dfdfdf;
height: @input-height;
line-height: 1.1;
font-family: @font-family;
color: @color-input-light;
font-size: @font-size;
background-color: @color-input-background;
margin: 0 0px;
padding-right: 0;
padding-left: 20px;
width: calc(~'100% - 20px');
}
textarea {
box-sizing: border-box;
resize: none;
display: block;
border-radius: 2px;
border: solid 1px #dfdfdf;
height: 120px;
font-family: @font-family;
color: @color-input-light;
font-size: 16px;
background-color: @color-input-background;
margin: 0 0px;
padding-right: 0;
width: 100%;
padding: 10px 5px;
}
textarea {
box-sizing: border-box;
resize: none;
display: block;
border-radius: 2px;
border: solid 1px #dfdfdf;
height: 120px;
font-family: @font-family;
color: @color-input-light;
font-size: 16px;
background-color: @color-input-background;
margin: 0 0px;
padding-right: 0;
width: 100%;
padding: 10px 5px;
}
select {
padding: 0;
width: 100%;
}
select {
padding: 0;
width: 100%;
}
input.invalid:not([readonly]),
input[aria-invalid="true"]:not([readonly]) {
box-shadow: inset 0px 0px 0px 1px @color-scarlet !important;
}
input.invalid:not([readonly]),
input[aria-invalid="true"]:not([readonly]) {
box-shadow: inset 0px 0px 0px 1px @color-scarlet !important;
}
small.error {
text-align: left;
display: block;
color: @color-scarlet;
font-size: @font-size-small;
font-family: @font-family;
line-height: 1;
padding-left: 16px;
margin: 2px 0;
}
small.error {
text-align: left;
display: block;
color: @color-scarlet;
font-size: @font-size-small;
font-family: @font-family;
line-height: 1;
padding-left: 16px;
margin: 2px 0;
}
}
.text-center {
text-align: center;
text-align: center;
}
.block {
display: block;
display: block;
}
.block-center {
margin: auto !important;
margin: auto !important;
}
input.invalid:not([readonly]),
input[aria-invalid="true"]:not([readonly]) {
box-shadow: inset 0px 0px 0px 1px @color-scarlet !important;
box-shadow: inset 0px 0px 0px 1px @color-scarlet !important;
}
input:focus {
outline: 5px #1791ff auto;
outline: 5px #1791ff auto;
}
select:focus {
outline: 5px #1791ff auto;
outline: 5px #1791ff auto;
}
.radio-buttons {
display: flex;
justify-content: flex-start;
align-items: center;
input {
width: 24px;
height: 24px;
object-fit: contain;
border-radius: 12px;
background-color: #f1f1f1;
margin: 0 5px;
}
label {
font-size: 18px;
line-height: 1.11;
color: #4b4b4b;
&:first-of-type {
font-size: 24px;
font-weight: 500;
color: @color-darkish-blue;
flex: 1;
}
}
}
.input-area {
width: 100%;
display: flex;
flex-flow: row;
align-items: center;
justify-content: space-between;
&.grid {
display: grid;
grid-template-rows: 1fr;
grid-template-columns: repeat(2, auto);
grid-column-gap: 1rem;
>button {
margin: 0;
}
&.grid-4 {
grid-template-columns: repeat(4, auto);
}
&.grid-5 {
grid-template-columns: repeat(5, auto);
}
&.grid-6 {
grid-template-columns: repeat(6, auto);
}
&.grid-7 {
grid-template-columns: repeat(7, auto);
}
&.grid-8 {
grid-template-columns: repeat(8, auto);
}
&.grid-9 {
grid-template-columns: repeat(9, auto);
}
&.grid-10 {
grid-template-columns: repeat(10, auto);
}
}
&.left {
justify-content: flex-start;
width: auto;
justify-self: left;
}
span.toggle {
margin-right: 0 !important;
}
&.col {
flex-flow: column;
align-items: flex-start;
height: auto;
}
h3 {
color: #002680;
margin: 18px 0;
}
.buttons {
width: 100%;
display: flex;
flex-flow: row;
margin-bottom: 18px;
&:last-child {
margin-bottom: 0;
}
}
label {
color: #002680;
font-size: 24px;
font-weight: 500;
flex: 1;
}
.numeric {
font-size: 18px;
font-weight: 500;
color: #6d6d6d;
width: 100px;
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;
input {
border: none;
font-size: 16px;
text-align: right;
height: 100%;
width: 100%;
outline: none !important;
background-color: transparent;
&[type=number]::-webkit-inner-spin-button,
&[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
}
span {
padding: 0 3px;
font-size: 14px;
}
}
select {
min-width: 150px;
height: 48px;
background-color: #fff;
padding: 0 20px;
font-size: 1rem;
}
}
@@ -2,26 +2,20 @@
@import "setup.less";
@import "colors.less";
@import "modals.less";
@import "pirometro.less";
@import "graph-dashboard.less";
@import "dashboard.less";
@import "riscaldi.less";
@import "formato.less";
@import "slider.less";
@import "tastierino.less";
@import "preriscaldo-dashboard.less";
@import "circlegantt.less";
@import "paddle.less";
@import "arretramento-riscaldi.less";
@import "arch-interface.less";
@import "avvio-prod.less";
@import "ciclo.less";
@import "raffreddamento.less";
@import "processo.less";
@import "progrprerisc.less";
@import "controstamposetup.less";
@import "quote-velocita.less";
@import "opzioni.less";
@import "imbutitura.less";
@import "estrazione.less";
@import "scheda.less";
@import "vuoto.less";
@import "popups.less";
@import "grid-system.less";
@import "input.less";
@@ -58,7 +52,6 @@
@import "users.less";
@import "tooltip.less";
@background-color: rgb(216, 216, 216);
@handle-width: 48px;
@handle-height: 32px;
@@ -131,6 +124,12 @@ body {
overflow: hidden;
}
#main-view>.container {
display: flex;
justify-content: center;
align-items: center;
}
#app {
margin: 0;
padding: 0;
@@ -266,4 +265,20 @@ body {
.smooth-dnd-no-user-select * {
cursor: move !important;
}
.mb-10 {
margin-bottom: 10px;
}
.mt-10 {
margin-top: 10px;
}
.mr-10 {
margin-right: 10px;
}
.ml-10 {
margin-left: 10px;
}
@@ -1038,7 +1038,7 @@
overflow: hidden;
-webkit-backdrop-filter: blur(10px);
background-color: @color-backdrop;
z-index: 900;
z-index: 1001;
&.nc {
z-index: 700;
@@ -2,93 +2,90 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.opzioni-info {
width: 1820px;
height: 980px;
.modal.opzioni-info {
hr {
width: 2px;
height: 830px;
background-color: #979797;
margin: 0;
}
section.body{
hr {
width: 2px;
height: 830px;
background-color: #979797;
margin: 0;
}
section{
padding: 0px;
section.body {
.specific{
section {
padding: 0px;
&:last-of-type{
margin-left: 100px;
width: 471px;
}
&:first-of-type{
.box-color{
background-color: #ffffff;
}
button{
background-color: #dddddd;
display: block;
color: #000000;
padding: 22px 16px;
width: 550px;
height: 64px;
border: none;
text-align: left;
cursor: pointer;
font-size: 17px;
}
.active{
background-color: rgba(23, 145, 255, 0.75);
color:#ffffff;
}
label{
font-size: 14px;
width: 60px;
margin-left: 5px;
margin-right: 30px;
}
}
.specific {
&:last-of-type {
margin-left: 100px;
width: 471px;
}
aside{
&:first-of-type {
button{
.box-color {
background-color: #ffffff;
}
button {
background-color: #dddddd;
display: block;
background-color: #bbbcbc;
color: #002680;
color: #000000;
padding: 22px 16px;
margin: 2px 0;
width: 547px;
height: 70px;
width: 550px;
height: 64px;
border: none;
text-align: left;
cursor: pointer;
font-size: 17px;
}
.active{
background-color: #fff;
font-weight: bold;
border-top: 2px solid #002680;
.active {
background-color: rgba(23, 145, 255, 0.75);
color: #ffffff;
}
label {
font-size: 14px;
width: 60px;
margin-left: 5px;
margin-right: 30px;
}
}
}
aside {
button {
display: block;
background-color: #bbbcbc;
color: #002680;
padding: 22px 16px;
margin: 2px 0;
width: 547px;
height: 70px;
border: none;
text-align: left;
cursor: pointer;
font-size: 17px;
}
.active {
background-color: #fff;
font-weight: bold;
border-top: 2px solid #002680;
}
}
}
}
}
}
@@ -4,185 +4,185 @@
@import "fonts.less";
html {
height: 100%;
overflow:hidden;
height: 100%;
overflow: hidden;
}
body {
border: 0; margin: 0; padding: 0;
height: 100%;
body {
border: 0;
margin: 0;
padding: 0;
height: 100%;
}
.hidden {
visibility: hidden;
}
.main-nav {
position: absolute;
top: 50%;
right: 0;
z-index: 1000;
}
.container {
#app {
nav {
position: absolute;
top: 50%;
right: 0;
.active button {
transform: translate(-761px, 0px);
}
div {
button {
position: relative;
height: 30px;
width: 32px;
display: block;
z-index: 1000;
border: 0;
border-radius: 0;
pointer-events: all;
background: #dddddd;
border-bottom-left-radius: 90px;
border-top-left-radius: 90px;
height: 90px;
width: 45px;
box-shadow: -3px 0 3px rgba(0, 0, 0, .2);
div {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr 1fr;
align-items: center;
justify-items: center;
padding: 5px;
div {
width: 2px;
height: 2px;
border-radius: 10px;
margin: 2px;
background: #002680;
}
}
}
}
}
.sidebar {
.sidebar-backdrop {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
cursor: pointer;
}
.sidebar-panel {
overflow-y: auto;
background-color: #130f40;
position: fixed;
right: 0;
top: 141px;
height: 100vh;
z-index: 900;
padding: 3rem 20px 2rem 20px;
width: 721px;
height: 920px;
border-radius: 4px;
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
background-color: #dddddd;
.text-head-sidebar {
margin: 10px auto;
font-size: 24px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: #002680;
}
.box-sidebar-panel {
display: grid;
grid-template-columns: repeat(2, 1fr);
align-items: center;
justify-items: center;
.sidebar-panel-nav {
width: 286px;
height: 100px;
border-radius: 2px;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5);
background-color: #808e96;
margin: 10px 30px;
.text-box-paddle {
display: flex;
width: 268px;
height: 78px;
font-family: WorkSans;
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: #ffffff;
margin: 10px;
i {
text-align: end;
width: 50px;
color: #bbbcbc;
}
label {
width: 117px;
margin: 10px;
}
}
.text-box-paddle.text-soft {
label {
width: 100%;
align-self: center;
}
}
}
}
}
}
}
.hidden {
visibility: hidden;
}
.container{
#app{
nav {
position: absolute;
top: 50%;
right: 0;
.active button{
transform: translate(-761px, 0px);
}
div{
button {
position: relative;
height: 30px;
width: 32px;
display: block;
z-index: 9999;
border: 0;
border-radius: 0;
pointer-events: all;
background: #dddddd;
border-bottom-left-radius: 90px;
border-top-left-radius: 90px;
height: 90px;
width: 45px;
div{
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr 1fr;
align-items: center;
justify-items: center;
padding: 5px;
div {
width: 2px;
height: 2px;
border-radius: 10px;
margin: 2px;
background: #002680;
}
}
}
}
}
// .slide-enter-active,
// .slide-leave-active
// {
// transition: left,right 0s ease-in-out;
// }
// .slide-enter,
// .slide-leave-to {
// transition: right,left 0s ease-in-out
// }
.sidebar{
.sidebar-backdrop{
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
cursor: pointer;
}
.sidebar-panel{
overflow-y: auto;
background-color: #130f40;
position: fixed;
right: 0;
top: 141px;
height: 100vh;
z-index: 900;
padding: 3rem 20px 2rem 20px;
width: 721px;
height: 920px;
border-radius: 4px;
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
background-color: #dddddd;
.text-head-sidebar{
margin: 10px auto;
font-size: 24px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: #002680;
}
.box-sidebar-panel{
display: grid;
grid-template-columns: repeat(2, 1fr);
align-items: center;
justify-items: center;
.sidebar-panel-nav{
width: 286px;
height: 100px;
border-radius: 2px;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5);
background-color: #808e96;
margin: 10px 30px;
.text-box-paddle{
display: flex;
width: 268px;
height: 78px;
font-family: WorkSans;
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: #ffffff;
margin: 10px;
i{
text-align: end;
width: 50px;
color: #bbbcbc;
}
label{
width: 117px;
margin: 10px;
}
}
.text-box-paddle.text-soft{
label{
width: 100%;
align-self: center;
}
}
}
}
}
}
}
}
}
@@ -1,97 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@import "setup.less";
@modal: modal;
@pirometro-margin: margin-left;
.@{modal}.pirometro-info {
width: 1820px;
height: 980px;
section.body{
section{
.specific{
width: 470px;
@{pirometro-margin}:37%;
}
.termospecific{
@{pirometro-margin}:0%;
.svg-area{
padding-left: 90px;
width: 1270px;
height: 800px;
.disegnoTermoSuperiore{
flex-shrink: 0;
width: 1100px;
height: 750px;
}
.border-termo-superiore{
.circle1{
position: relative;
top: 135px;
right: 1150px;
}
.circle2{
position: relative;
top: 355px;
right: 1150px;
}
.circle3{
position: relative;
top: 425px;
right: 1150px;
}
.circle4{
position: relative;
top: 470px;
right: 635px;
}
.circle5{
position: relative;
top: 400px;
right: 255px;
}
.circle6{
width: 100px;
background-color: #c03d58;
position: relative;
top: 87px;
right: 150px;
}
}
}
button{
margin-left: 5px;
width: 48px;
height: 48px;
object-fit: contain;
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
border: solid 1px #001e48;
background-image: linear-gradient(to bottom, #1756ad, #002680);
}
}
}
}
}
@@ -0,0 +1,166 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
.preriscaldodashboard{
height: 100%;
width: 100%;
background-image: url("../../assets/icons/png/bg.png");
position: fixed;
z-index: 1001;
display: flex;
flex-direction: column;
justify-content: flex-start;
.header{
width: 100%;
display: flex;
.ribbon-container{
height: 80px;
z-index: 900;
}
.box-date{
display: flex;
width: 100%;
justify-content: center;
div{
flex-shrink: 0;
font-size: 47px;
text-align: right;
font-weight: 500;
}
time {
flex-shrink: 0;
transition: color 200ms ease-in-out;
margin-left: 28px;
display: flex;
font-size: 120px;
}
}
.header-buttons{
display: inline-block;
.box-close-dashboard{
height: 70px;
text-align: right;
button.modal-close{
background-color: #4B4B4B;
margin: 23px;
}
}
.user-info {
margin-top: 10px;
display: flex;
font-size: 25px;
color: @color-input-light;
flex-grow: 1;
justify-content: flex-end;
margin-right: 21px;
button.profile {
width: 48px;
height: 48px;
background-image: url("../profile.png");
color: #000;
background-size: cover;
border: none;
background-color: transparent;
&.colorWhite {
color: #FFF;
}
}
div{
align-self: center;
margin-right: 10px;
font-size: 18px;
}
}
}
}
section{
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-evenly;
label{
&:first-of-type{
font-size: 67px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: 0.76;
letter-spacing: normal;
text-align: center;
color: #4b4b4b;
}
&:last-of-type{
font-size: 26px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: 1.96;
letter-spacing: normal;
text-align: center;
color: #4b4b4b;
}
}
div{
display: flex;
flex-direction: row;
justify-content: center;
div{
margin: 0px 70px;
display: flex;
flex-direction: column;
label{
&:first-of-type{
font-size: 250px;
font-weight: 200;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: #4b4b4b;
}
&:last-of-type{
font-size: 50px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: #4b4b4b;
}
}
}
}
}
}
@@ -2,59 +2,56 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.processo-info {
width: 1820px;
height: 980px;
margin-top: 50px;
header{
font-size: 22px;
.modal.processo-info {
header {
font-size: 22px;
color: #4b4b4b;
.tab-header {
padding: 10px 0px;
button {
padding: 0;
display: flex;
justify-content: flex-start;
margin-right: 10px;
width: 149px;
height: 48px;
border-radius: 2px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.5);
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
font-size: 14px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: 1.15;
letter-spacing: normal;
color: #4b4b4b;
.tab-header{
padding: 10px 0px;
button{
padding: 0;
display: flex;
justify-content: flex-start;
margin-right: 10px;
width: 149px;
height: 48px;
border-radius: 2px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.5);
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
font-size: 14px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: 1.15;
letter-spacing: normal;
color: #4b4b4b;
img{
margin-right: 20px;
}
}
label{
width: 106px;
height: 32px;
font-size: 32px;
font-weight: 600;
font-stretch: normal;
font-style: normal;
line-height: 1;
letter-spacing: normal;
text-align: right;
color: #545454;
}
img {
margin-right: 20px;
}
}
label {
width: 106px;
height: 32px;
font-size: 32px;
font-weight: 600;
font-stretch: normal;
font-style: normal;
line-height: 1;
letter-spacing: normal;
text-align: right;
color: #545454;
}
}
}
}
@@ -2,267 +2,264 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
@heightmeridian:300px;
.@{modal}.progr-preriscaldo-info {
width: 1639px;
height: 565px;
margin-top: 220px;
@heightmeridian: 300px;
header {
padding-left: 31px;
display: flex;
align-items: center;
font-size: 20px;
font-weight: bold;
color: darkblue;
}
.modal.progr-preriscaldo-info {
section.body{
overflow: hidden;
header {
padding-left: 31px;
display: flex;
align-items: center;
font-size: 20px;
font-weight: bold;
color: darkblue;
}
section{
padding: 0px;
width: 100%;
height: 100%;
section.body {
overflow: hidden;
hr{
border: none;
section {
padding: 0px;
width: 100%;
height: 100%;
hr {
border: none;
}
aside {
margin: 14px;
button {
width: 197px;
height: 48px;
object-fit: contain;
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
border: solid 1px #001e48;
background-image: linear-gradient(to bottom, #1756ad, #002680);
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: white;
margin: auto;
}
}
.specific {
margin: 0;
padding: 20px;
width: 100%;
height: 100%;
background-color: #bbbcbc;
div {
display: flex;
margin-bottom: 50px;
.clock {
border-radius: 50%;
background-color: white;
height: @heightmeridian;
width: @heightmeridian;
span {
flex-shrink: 0;
border-radius: 50%;
width: 20px;
height: 20px;
background-color: @color-darkish-blue;
position: relative;
top: 140px;
right: 460px;
}
aside{
margin: 14px;
button {
flex-shrink: 0;
border-radius: 50%;
width: 50px;
height: 50px;
background-image: none;
box-shadow: none;
background-color: white;
color: black;
font-size: 20px;
}
button{
width: 197px;
height: 48px;
object-fit: contain;
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
border: solid 1px #001e48;
background-image: linear-gradient(to bottom, #1756ad, #002680);
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: white;
margin: auto;
.selected {
background-color: @color-darkish-blue;
color: white;
}
.btn1 {
position: relative;
top: 22px;
right: -188px;
}
.btn2 {
position: relative;
top: 68px;
right: -179px;
}
.btn3 {
position: relative;
top: 125px;
right: -149px;
}
.btn4 {
position: relative;
top: 182px;
right: -79px;
}
.btn5 {
position: relative;
top: 227px;
right: 12px;
}
.btn6 {
position: relative;
top: 248.5px;
right: 125px;
}
.btn7 {
position: relative;
top: 227px;
right: 238px;
}
.btn8 {
position: relative;
top: 182px;
right: 329px;
}
.btn9 {
position: relative;
top: 125px;
right: 399px;
}
.btn10 {
position: relative;
top: 68px;
right: 429px;
}
.btn11 {
position: relative;
top: 22px;
right: 438px;
}
.btn12 {
position: relative;
top: 0.5px;
right: 425px;
}
}
div {
&:first-of-type {
flex-direction: column;
margin-right: 20px;
width: 180px;
height: @heightmeridian;
background-image: linear-gradient(to bottom, #1756ad, @color-darkish-blue);
label {
color: #ADD8E6;
margin: auto;
&:first-of-type {
font-size: 67px;
}
&:last-of-type {
font-size: 20px;
margin-top: -50px;
}
}
}
.specific{
margin: 0;
padding: 20px;
width: 100%;
height: 100%;
&:last-child {
margin-left: -50px;
height: @heightmeridian;
flex-direction: column;
button {
width: 50px;
background-image: none;
box-shadow: none;
background-color: #bbbcbc;
color: @color-darkish-blue;
font-size: 20px;
div{
display: flex;
margin-bottom: 50px;
.clock{
border-radius: 50%;
background-color: white;
height: @heightmeridian;
width: @heightmeridian;
span{
flex-shrink: 0;
border-radius: 50%;
width: 20px;
height: 20px;
background-color: @color-darkish-blue;
position: relative;
top: 140px;
right: 460px;
}
button{
flex-shrink: 0;
border-radius: 50%;
width: 50px;
height: 50px;
background-image: none;
box-shadow: none;
background-color: white;
color: black;
font-size: 20px;
}
.selected{
background-color: @color-darkish-blue;
color:white;
}
.btn1{
position: relative;
top: 22px;
right: -188px;
}
.btn2{
position: relative;
top: 68px;
right: -179px;
}
.btn3{
position: relative;
top: 125px;
right: -149px;
}
.btn4{
position: relative;
top: 182px;
right: -79px;
}
.btn5{
position: relative;
top: 227px;
right: 12px;
}
.btn6{
position: relative;
top: 248.5px;
right: 125px;
}
.btn7{
position: relative;
top: 227px;
right: 238px;
}
.btn8{
position: relative;
top: 182px;
right: 329px;
}
.btn9{
position: relative;
top: 125px;
right: 399px;
}
.btn10{
position: relative;
top: 68px;
right: 429px;
}
.btn11{
position: relative;
top: 22px;
right: 438px;
}
.btn12{
position: relative;
top: 0.5px;
right: 425px;
}
}
div{
&:first-of-type{
flex-direction: column;
margin-right: 20px;
width: 180px;
height: @heightmeridian;
background-image: linear-gradient(to bottom, #1756ad, @color-darkish-blue);
label{
color: #ADD8E6;
margin: auto;
&:first-of-type{
font-size: 67px;
}
&:last-of-type{
font-size: 20px;
margin-top: -50px;
}
}
}
&:last-child{
margin-left: -50px;
height: @heightmeridian;
flex-direction: column;
button{
width: 50px;
background-image: none;
box-shadow: none;
background-color: #bbbcbc;
color: @color-darkish-blue;
font-size: 20px;
&:first-of-type{
margin-bottom: @heightmeridian - 50px;
}
}
}
}
button{
border: none;
width: 130px;
height: 45px;
border-radius: 22.5px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
background-image: linear-gradient(to bottom, #818a8f 0%, #42494e 98%);
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: white;
}
.active{
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.43);
background-image: linear-gradient(to bottom, #42494e 0%, #818a8f 98%);
}
&:first-of-type {
margin-bottom: @heightmeridian - 50px;
}
label{
margin-bottom: 20px;
font-size: 24px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: @color-darkish-blue;
}
}
}
}
button {
border: none;
width: 130px;
height: 45px;
border-radius: 22.5px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
background-image: linear-gradient(to bottom, #818a8f 0%, #42494e 98%);
font-size: 18px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: white;
}
.active {
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.43);
background-image: linear-gradient(to bottom, #42494e 0%, #818a8f 98%);
}
}
label {
margin-bottom: 20px;
font-size: 24px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: @color-darkish-blue;
}
}
}
}
}
@@ -1,247 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.quote-velocita-info {
width: 1820px;
height: 980px;
section{
aside{
.box{
.body{
padding:4.5px;
.input-area{
margin: 5px auto;
}
}
}
}
.specific{
.svg-area{
width: 750px;
height: 750px;
.disegnoQuoteVelocita{
flex-shrink: 0;
margin-left: 500px;
width: 800px;
height: 800px;
}
.disegnoStampo{
flex-shrink: 0;
margin-left: 680px;
width: 1200px;
height: 795px;
}
.disegnoControstampoQuoteVelocita{
flex-shrink: 0;
margin-left: 600px;
width: 1156px;
height: 800px;
}
.input-circles{
.circle{
width: 147px;
height: 60px;
flex-direction: column;
div{
margin: auto;
display: flex;
flex-direction: row;
}
}
.circle1{
position: relative;
top: 120px;
right: 500px;
}
.circle2{
position: relative;
top: 140px;
right: 750px;
}
.circle3{
position: relative;
top: 140px;
right: 300px;
}
.circle4{
position: relative;
top: 395px;
right: 400px;
}
.circle5{
position: relative;
top: 240px;
right: 650px;
}
.circle6{
position: relative;
top: 305px;
right: 550px;
}
.circle7{
position: relative;
bottom: 380px;
right: 250px;
}
.circle8{
position: relative;
top: 320px;
right: 220px;
}
.circle-stampo-1{
position: relative;
top: 115px;
right: 1212px;
}
.circle-stampo-2{
position: relative;
top: 140px;
right: 1130px;
}
.circle-stampo-3{
position: relative;
top: 4px;
right: 730px;
}
.circle-stampo-4{
position: relative;
top: -64px;
right: 925px;
}
.circle-stampo-5{
position: relative;
top: -10px;
right: 740px;
}
.circle-stampo-6{
position: relative;
top: 205px;
right: 1115px;
}
.circle-stampo-7{
position: relative;
top: 50px;
right: 125px;
}
.circle-stampo-8{
position: relative;
top: -210px;
right: 550px;
}
.circle-stampo-9{
position: relative;
top: -90px;
right: 560px;
}
.circle-stampo-10{
position: relative;
bottom: 560px;
right: 769px;
}
.circle-stampo-11{
position: relative;
top: 35px;
right: 781px;
}
.circle-controstampo-1{
position: relative;
top: 300px;
right: 1090px;
}
.circle-controstampo-2{
position: relative;
top: 570px;
right: 990px;
}
.circle-controstampo-3{
position: relative;
top: 475px;
right: 770px;
}
.circle-controstampo-4{
position: relative;
right: 650px;
}
.circle-controstampo-5{
position: relative;
top: 45px;
right: 480px;
}
.circle-controstampo-6{
position: relative;
top: -335px;
right: 650px;
}
.circle-controstampo-7{
position: relative;
top: 400px;
right: 650px;
}
}
}
button{
margin-left: 10px;
width: 48px;
height: 48px;
object-fit: contain;
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
border: solid 1px #001e48;
background-image: linear-gradient(to bottom, #1756ad, @color-darkish-blue);
}
}
}
}
@@ -1,21 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.raffreddamento-info {
margin-top: 200px;
width: 626px;
height: 569px;
section{
.specific{
margin-left: 50px;
width: 480px;
}
}
}
@@ -13,7 +13,7 @@
border-top-right-radius: @header-height /2;
border-bottom-right-radius: @header-height /2;
margin-right: 5px;
z-index: 10;
z-index: 801;
.app-ribbon {
justify-content: space-between; // background-image: @color-alarm-background-image;
background-image: @color-ribbon-opened;
@@ -2,29 +2,35 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.riscaldi-info {
.presenter {
position: relative;
.warmers {
position: relative;
svg {
width: 100%;
height: 100%;
.zoom {
position: absolute;
bottom: 0;
right: 0;
display: grid;
grid-template-rows: 1fr 1fr;
grid-row-gap: 10px;
rect {
fill: none;
stroke: 1px solid blue;
}
.btn {
padding: 0;
width: 48px;
height: 48px;
.resistance {
width: calc(100% - 4px);
height: calc(100% - 4px);
background-color: #f40000;
margin: 2px;
border-radius: 4px;
}
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
font-weight: bold;
color: #fff;
}
}
}
@@ -1,19 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
.scheda{
.body{
padding: 0px;
.input-area{
width: 480px;
margin: 4px;
margin-bottom: 0px;
}
}
}
@@ -2,10 +2,9 @@
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.setup {
padding-top: 50px;
padding-top: 25px;
display: flex;
justify-content: flex-start;
align-items: center;
@@ -38,8 +37,8 @@
justify-content: flex-start;
width: calc(~'100% - 28px');
height: calc(~'100% - 28px - 82px');
.auto{
.auto {
overflow-y: auto;
overflow-x: hidden;
}
@@ -64,83 +63,89 @@
}
.specific {
article {
display: flex;
flex-direction: column;
width: 100%;
// align-items: center;
position: relative;
.svg-area {
&.shrink {
flex-shrink: 2;
}
.slides {
width: 100%;
height: 160px;
display: flex;
justify-content: center;
justify-content: space-evenly;
align-items: center;
.input-circles {
display: flex;
flex-direction: column;
span{
object-fit: contain;
font-size: 22px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
text-align: center;
color: white;
background-color: #979797;
}
.circle {
width: 141px;
height: 60px;
box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.5);
background-color: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: flex-start;
object-fit: contain;
border-radius: 40.5px;
border: solid 4px #9b9b9b;
}
input{
width: 40px;
height: 21px;
margin: auto;
object-fit: contain;
font-size: 20px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: #6d6d6d;
border: none;
}
label {
margin: auto;
object-fit: contain;
font-size: 20px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: #6d6d6d;
}
img {
margin: auto;
width: 20px;
height: 20px;
object-fit: contain;
}
img {
flex-shrink: 0;
width: 215px;
height: 140px;
border: 1px solid #bbbcbc;
cursor: pointer;
}
.imgborder {
border: 1px solid @color-darkish-blue;
}
}
}
.svg-area {
display: flex;
justify-content: center;
position: relative;
min-height: 50%;
width: 100%;
flex: 1;
.borded_label {
cursor: pointer;
min-width: 100px;
height: 60px;
border-radius: 40px;
border: solid 4px #9b9b9b;
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 1rem;
position: absolute;
background-color: white;
div {
display: grid;
grid-template-columns: auto 1fr auto;
img {
grid-column: 1;
width: unset;
height: unset;
}
span {
grid-column: 2;
text-align: right;
}
small {
text-align: center;
grid-column: 3;
}
}
}
img {
width: 100%;
}
}
}
}
footer {
@@ -164,6 +169,67 @@
align-items: stretch;
}
}
.divider {
width: 100%;
height: 20px;
}
.modal-footer-navigator {
position: absolute;
bottom: 0;
left: 0;
width: calc(~"100vw - 2rem");
display: grid;
grid-template-rows: 48px;
flex-flow: row nowrap;
grid-template-columns: repeat(auto-fit, minmax(30px, 1fr));
grid-column-gap: 1rem;
padding: 0 1rem;
.setup-button {
height: 48px;
width: 100%;
grid-template-columns: 40px 1fr;
&.current {
.background-top,
.background-bottom {
background-color: #d3d3d3;
&:after {
background: #979797;
}
}
.background-top {
box-shadow: -3px 5px 5px rgba(0, 0, 0, .2) inset;
}
.background-bottom {
box-shadow: -3px -5px 5px rgba(0, 0, 0, .2) inset;
}
}
span,
label {
grid-row-start: 1;
grid-row-end: -1;
padding: 0;
align-items: center;
font-size: 14px;
font-weight: bold;
;
}
label {
padding-left: 5px;
}
}
}
}
.modal.setup-info {
@@ -181,6 +247,7 @@
.tab-header {
display: flex;
flex-flow: row;
align-items: stretch;
justify-content: flex-start;
@@ -203,12 +270,13 @@
}
}
.@{modal}.setup-info {
.modal.setup-info {
width: 1639px;
height: 695px;
background-color: #fff;
margin: 150px 193px;
margin: 150px auto;
box-shadow: none;
position: relative;
section {
height: 100%;
@@ -236,6 +304,9 @@
grid-template-columns: 50px 1fr;
grid-template-rows: 1fr 50px;
* {
cursor: pointer;
}
span,
label {
@@ -266,23 +337,20 @@
i {
grid-column: 2;
grid-column-start: -1;
grid-column-end: 1;
grid-row: 2;
z-index: 2;
margin: auto;
transform: scale(1.5);
font-size: 36px;
&.fa-check-circle{
&.fa-check-circle {
color: #90BF3D;
}
&.fa-check-circle.undone-step{
&.fa-check-circle.undone-step {
color: #1791FF;
}
// &.fa-minus-circle{
// color: #7A7C74;
// }
}
position: relative;
@@ -324,12 +392,41 @@
}
article {
.box .body {
border-width: 4px;
}
}
.box {
margin-bottom: 30px;
margin-bottom: 20px;
box-sizing: border-box;
clear: both;
&.transparent {
.body {
border: none;
}
}
&.center {
margin-left: auto;
margin-right: auto;
}
&.box-500 {
width: 500px;
}
&.color_2{
background-color: #e5f3ff;
}
&.color_3{
background-color: #b3dbff;
}
.header {
display: flex;
align-items: center;
@@ -343,16 +440,16 @@
}
.body {
padding: 20px;
display: flex;
padding: 1rem;
display: grid;
grid-row-gap: 1rem;
flex-flow: column;
justify-items: center;
padding-bottom: 10px;
padding-top: 5px;
border: 2px solid #979797;
}
.submit {
margin: auto;
width: 90px;
@@ -381,75 +478,6 @@
.input-area {
margin: 10px auto;
display: flex;
flex-flow: row;
align-items: center;
justify-content: space-between;
width: 100%;
height: 48px;
&.col {
flex-flow: column;
align-items: flex-start;
height: auto;
}
h3 {
font-weight: normal;
color: #002680;
margin: 18px 0;
}
.buttons {
width: 100%;
display: flex;
flex-flow: row;
margin-bottom: 18px;
&:last-child {
margin-bottom: 0;
}
}
label {
color: #002680;
font-size: 24px;
font-weight: 500;
flex: 1;
}
.rect {
// display: flex;
// align-items: center;
// justify-content: flex-end;
// padding-inline-end: 20px;
object-fit: contain;
font-size: 20px;
font-weight: 500;
font-stretch: normal;
font-style: normal;
line-height: normal;
letter-spacing: normal;
color: #6d6d6d;
text-align: center;
width: 98px;
height: 48px;
border-radius: 2px;
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
}
select {
min-width: 150px;
height: 48px;
background-color: #fff;
padding: 0 20px;
font-size: 1rem;
;
}
}
.setup-play {
cursor: pointer;
@@ -4,13 +4,16 @@
@import "fonts.less";
.slider {
display: flex;
display: grid;
grid-template-columns: 48px 1fr 48px;
grid-column-gap: 1rem;
width: 100%;
flex-flow: row wrap;
justify-content: space-between;
align-items: center;
.control {
margin: 0 10px;
position: relative;
flex: 1;
@@ -101,6 +104,5 @@
border: none;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.5);
background-image: linear-gradient(to bottom, #fff 0%, #bbbcbc 98%);
margin: 16px;
}
}
@@ -3,104 +3,110 @@
@import "colors.less";
@import "fonts.less";
.tast{
height: 261px;
width: 293px;
background-color:@color-silver;
.keyboard {
height: 262px;
width: 262px;
background-color: @color-silver;
display: flex;
justify-content: center;
position: fixed;
top: 0;
left: 0;
z-index: 9000;
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.5);
.mask{
display: grid;
grid-template-columns: repeat(4, 52px);
grid-template-rows: repeat(4, 52px);
grid-gap: 5px 8px;
margin-top: 7%;
margin-left: 10%;
button{
border:none;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
color:@color-darkish-blue;
font-size:20px;
}
.zero{
grid-column: 1/span 2;
grid-row: 4/5;
border:none;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
}
.submit{
grid-column-start: 4;
grid-column-end: 5;
grid-row-start: 3;
grid-row-end: 5;
border:none;
background-image: linear-gradient(to bottom, #000080 0%, #191970 98%);
box-shadow: 2px 10px 15px 0 rgba(0, 0, 0, 0.5);
.mask {
display: grid;
grid-template-columns: repeat(4, 52px);
grid-template-rows: repeat(4, 52px);
grid-gap: 5px 8px;
margin-top: 7%;
img{
width: 30px;
height: 30px;
}
}
.bCanc{
grid-column: 4/5;
grid-row: 2/3;
img{
width: 30px;
height: 25px;
}
}
.b1{
grid-column: 1/2;
grid-row: 3/4;
}
.b2{
grid-column: 2/3;
grid-row: 3/4;
}
.b3{
grid-column: 3/4;
grid-row: 3/4;
}
.b4{
grid-column: 1/2;
grid-row: 2/3;
}
.b5{
grid-column: 2/3;
grid-row: 2/3;
}
.b6{
grid-column: 3/4;
grid-row: 2/3;
}
.b7{
grid-column: 1/2;
grid-row: 1/2;
}
.b8{
grid-column: 2/3;
grid-row: 1/2;
}
.b9{
grid-column: 3/4;
grid-row: 1/2;
}
.bPunto{
grid-column: 3/4;
grid-row: 4/5;
}
.bDel{
grid-column: 4/5;
grid-row: 1/2;
}
button {
border: none;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.5);
color: @color-darkish-blue;
font-size: 20px;
border-radius: 2px;
}
}
.zero {
grid-column: 1/span 2;
grid-row: 4/5;
}
.submit {
grid-column-start: 4;
grid-column-end: 5;
grid-row-start: 3;
grid-row-end: 5;
background-size: 54px;
background-position-x: -1px;
background-image: url(/assets/icons/png/submit.png);
}
.bCanc {
grid-column: 4/5;
grid-row: 2/3;
background-size: 54px;
background-image: url(/assets/icons/png/canc.png);
}
.b1 {
grid-column: 1/2;
grid-row: 3/4;
}
.b2 {
grid-column: 2/3;
grid-row: 3/4;
}
.b3 {
grid-column: 3/4;
grid-row: 3/4;
}
.b4 {
grid-column: 1/2;
grid-row: 2/3;
}
.b5 {
grid-column: 2/3;
grid-row: 2/3;
}
.b6 {
grid-column: 3/4;
grid-row: 2/3;
}
.b7 {
grid-column: 1/2;
grid-row: 1/2;
}
.b8 {
grid-column: 2/3;
grid-row: 1/2;
}
.b9 {
grid-column: 3/4;
grid-row: 1/2;
}
.bPunto {
grid-column: 3/4;
grid-row: 4/5;
}
.bDel {
grid-column: 4/5;
grid-row: 1/2;
}
}
}
@@ -1,39 +0,0 @@
// out: false, sourceMap: false, main: ../style.less
@import "grid-system.less";
@import "colors.less";
@import "fonts.less";
@modal: modal;
.@{modal}.vuoto-info {
width: 1820px;
height: 980px;
section{
.specific{
padding-left: 5px;
.box {
margin-bottom: 5px;
background-color: #e5f3ff;
&:first-of-type{
background-color: white;
}
&:last-of-type{
background-color: #b3dbff;
}
}
.input-area{
width: 480px;
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -9,9 +9,9 @@
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"
width="1186mm"
height="707mm"
viewBox="0 0 1186 707"
width="1292"
height="707"
viewBox="0 0 1292 707"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
@@ -25,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.26"
inkscape:cx="1903.0535"
inkscape:cy="1303.7306"
inkscape:zoom="2.08"
inkscape:cx="844.36256"
inkscape:cy="95.563833"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
@@ -281,13 +281,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="140.59659"
y="-269.10074"
id="text872-0"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1144">A2</tspan></text>
id="tspan1144"
x="140.59659"
y="-269.10074">A2</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -296,13 +298,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="207.31517"
y="-269.10071"
id="text872-0-5"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1146">A3</tspan></text>
id="tspan1146"
x="207.31517"
y="-269.10071">A3</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -311,13 +315,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="274.03372"
y="-269.10071"
id="text872-0-5-7"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1148">A4</tspan></text>
id="tspan1148"
x="274.03372"
y="-269.10071">A4</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -326,13 +332,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="340.75235"
y="-269.10068"
id="text872-0-5-3"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1150">A5</tspan></text>
id="tspan1150"
x="340.75235"
y="-269.10068">A5</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -341,13 +349,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="407.47095"
y="-269.10068"
id="text872-0-5-3-4"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1152">A6</tspan></text>
id="tspan1152"
x="407.47095"
y="-269.10068">A6</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -356,13 +366,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="474.18954"
y="-269.10071"
id="text872-0-5-3-4-9"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1154">A7</tspan></text>
id="tspan1154"
x="474.18954"
y="-269.10071">A7</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -371,13 +383,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="540.9082"
y="-269.10071"
id="text872-0-5-3-4-9-6"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1156">A8</tspan></text>
id="tspan1156"
x="540.9082"
y="-269.10071">A8</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -386,13 +400,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="607.62683"
y="-269.10071"
id="text872-0-5-3-4-9-6-8"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1158">A9</tspan></text>
id="tspan1158"
x="607.62683"
y="-269.10071">A9</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -504,13 +520,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="1003.379"
y="-269.10071"
id="text872-0-5-3-4-9-6-8-2-3-5-7-8-6"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1338">A15</tspan></text>
id="tspan1338"
x="1003.379"
y="-269.10071">A15</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -519,13 +537,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="1070.0977"
y="-269.10068"
id="text872-0-5-3-4-9-6-8-2-3-5-7-8-9"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1340">A16</tspan></text>
id="tspan1340"
x="1070.0977"
y="-269.10068">A16</tspan></text>
<circle
r="18.442383"
style="opacity:1;fill:#4b4b4b;fill-opacity:1;stroke:#000000;stroke-width:3.11523533;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
@@ -534,13 +554,15 @@
cy="-304.69699" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009706px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.03009701px;line-height:1.25;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3042872"
x="1136.8162"
y="-269.10065"
id="text872-0-5-3-4-9-6-8-2-3-5-7-8-9-8"
transform="scale(0.89929967,1.1119764)"><tspan
sodipodi:role="line"
id="tspan1342">A17</tspan></text>
id="tspan1342"
x="1136.8162"
y="-269.10065">A17</tspan></text>
<rect
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.26154959;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
id="rect912-2"
@@ -1451,32 +1473,94 @@
x="1136.8162"
y="141.87759">D17</tspan></text>
<rect
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509805;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509804;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect849-4-6"
width="1055.1869"
height="24.186996"
x="25.179001"
y="-316.08398" />
<rect
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509805;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509804;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect849-4-2-8"
width="1055.1869"
height="24.186996"
x="25.179001"
y="-137.636" />
<rect
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509805;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509804;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect849-4-4-7"
width="1055.1869"
height="24.186996"
x="25.179001"
y="-34.331997" />
<rect
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509805;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="opacity:1;fill:#bbbcbc;fill-opacity:0.74509804;stroke:#979797;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect849-4-7-8"
width="1055.1869"
height="24.186996"
x="25.179001"
y="139.914" />
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865"
width="86"
height="25"
x="1159.0815"
y="-206.39528" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.33333333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.99999994;"
x="1167.4969"
y="-187.75352"
id="text869"><tspan
sodipodi:role="line"
id="tspan4167">610 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-7"
width="86"
height="25"
x="1157.7295"
y="17.975136" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.33333333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.99999994;"
x="1166.1448"
y="36.61689"
id="text869-1"><tspan
sodipodi:role="line"
id="tspan4169">610 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-4"
width="97.53846"
height="25"
x="997.9389"
y="267.72534" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.33333397px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.99999994"
x="1006.3546"
y="286.36713"
id="text869-8"><tspan
sodipodi:role="line"
id="tspan4171"
x="1006.3546"
y="286.36713">1360 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-1"
width="134.07692"
height="25"
x="782.41119"
y="206.99022" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.33333333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.99999994;"
x="790.82654"
y="225.63197"
id="text869-5"><tspan
sodipodi:role="line"
id="tspan4173">&lt;= 1030 mm</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 86 KiB

@@ -9,8 +9,8 @@
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"
width="1156mm"
height="800mm"
width="1156"
height="800"
viewBox="0 0 1156 800"
version="1.1"
id="svg8"
@@ -25,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.125"
inkscape:cx="1119.1458"
inkscape:cy="2036.4307"
inkscape:zoom="0.5"
inkscape:cx="-79.558604"
inkscape:cy="84.479602"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
@@ -44,7 +44,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -236,5 +236,39 @@
inkscape:transform-center-x="0.0055839671"
inkscape:transform-center-y="3.1811632"
transform="matrix(0.94139126,0.3373166,0.3373166,-0.94139126,390.09685,-690.78395)" />
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865"
width="79.260559"
height="22.521017"
x="560.28442"
y="-492.82922" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.16533258px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.87494218;"
x="580.72296"
y="-462.35043"
id="text869"
transform="scale(0.97125081,1.0296002)"><tspan
sodipodi:role="line"
id="tspan3048">1410 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-8"
width="79.260559"
height="22.521017"
x="575.86975"
y="260.2395" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.16533279px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.87494218"
x="611.16852"
y="269.06815"
id="text869-9"
transform="scale(0.97125079,1.0296002)"><tspan
sodipodi:role="line"
id="tspan3071"
x="611.16852"
y="269.06815">0 mm</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

@@ -7,26 +7,26 @@
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="1.0beta2 (2b71d25, 2019-12-03)"
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"
height="210mm"
width="297mm">
height="210"
width="297">
<sodipodi:namedview
inkscape:object-nodes="false"
inkscape:current-layer="layer1"
inkscape:window-maximized="1"
inkscape:window-y="23"
inkscape:window-x="1280"
inkscape:cy="394.22754"
inkscape:cx="520.21224"
inkscape:zoom="1.4623514"
inkscape:window-y="-9"
inkscape:window-x="-9"
inkscape:cy="161.66741"
inkscape:cx="130.79682"
inkscape:zoom="8.2723087"
showgrid="false"
id="namedview907"
inkscape:window-height="1311"
inkscape:window-width="2560"
inkscape:window-height="1001"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
@@ -325,8 +325,9 @@
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" />
<path
id="path965"
d="M 146.1459,0.54430501 Z"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
d="M 138.7719,177.76207 Z"
style="fill:none;stroke:#000000;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path967"
@@ -545,5 +546,41 @@
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" />
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865"
width="23.260561"
height="6.021019"
x="122.85455"
y="14.358868" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.24800014px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.24507663"
x="121.8107"
y="19.180067"
id="text869"
transform="scale(1.0175879,0.98271609)"><tspan
sodipodi:role="line"
id="tspan2434"
x="121.8107"
y="19.180067">1059 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-8"
width="21.447283"
height="6.021019"
x="120.07418"
y="178.33969" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.24800014px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.24507663"
x="122.61649"
y="186.04497"
id="text869-2"
transform="scale(1.0175879,0.98271609)"><tspan
sodipodi:role="line"
id="tspan2432"
x="122.61649"
y="186.04497">0 mm</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 23 KiB

@@ -25,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.5325"
inkscape:cx="-212.68016"
inkscape:cy="598.57363"
inkscape:zoom="2.13"
inkscape:cx="472.77738"
inkscape:cy="49.172206"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
@@ -45,7 +45,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -244,5 +244,40 @@
inkscape:transform-center-y="-0.48678734"
transform="matrix(0.92838376,0,0,-1.0738472,15.707629,417.51225)"
inkscape:transform-center-x="-2.0583999e-06" />
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865"
width="22.754166"
height="6.6145835"
x="126.58702"
y="93.443863" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397768;stroke:none;stroke-width:0.26458332;"
x="128.81358"
y="98.37616"
id="text869"><tspan
sodipodi:role="line"
id="tspan867"
x="128.81358"
y="98.37616"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332;fill:#ffffff;fill-opacity:0.97397768;">810 mm</tspan></text>
<rect
style="opacity:1;fill:#979797;fill-opacity:1;stroke:#b3b3b3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect865-3"
width="22.754168"
height="6.6145835"
x="129.36137"
y="286.06741" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:0.97397766;stroke:none;stroke-width:0.26458332"
x="133.70467"
y="290.99969"
id="text869-8"><tspan
sodipodi:role="line"
id="tspan892"
x="133.70467"
y="290.99969">0 mm</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Some files were not shown because too many files have changed in this diff Show More