Browse Source

Added image Slicer to WAS

Manuel Gall 3 years ago
parent
commit
b5c8c898e3
10 changed files with 891 additions and 66 deletions
  1. 16 0
      server/was.rb
  2. 3 0
      server/was.xml
  3. 99 0
      ui/css/imageSlicer.css
  4. 68 3
      ui/imageReplacement.php
  5. 190 57
      ui/index.html
  6. 11 6
      ui/js/design.js
  7. 303 0
      ui/js/imageSlicer.js
  8. 143 0
      ui/json/ProductCode.json
  9. 52 0
      ui/json/Rectangle.json
  10. 6 0
      ui/json/SlicerConfig.json

+ 16 - 0
server/was.rb

@@ -29,6 +29,16 @@ require 'net/http'
 $db = SQLite3::Database.open 'database/stations.db'
 
 
+
+
+class CutImage < Riddl::Implementation
+  def response
+    puts "Cutting"
+    "Cutting"
+  end
+end
+
+
 class GetStations < Riddl::Implementation
   def response
     result = $db.execute "SELECT * FROM stations"
@@ -1025,6 +1035,12 @@ server = Riddl::Server.new(File.join(__dir__,'/was.xml'), :host => 'localhost')
   on resource do
     run GetStations if get
     run CreateStation if post
+    
+    on resource 'cutimage' do
+      run CutImage if get
+      #should add deleteReplacement
+    end
+    
     on resource '\d+' do
       run GetStation if get
       run CreatePattern if post 'pattern'

+ 3 - 0
server/was.xml

@@ -99,6 +99,9 @@
   <resource>
       <get out="stations"/>
       <post />
+      <resource relative="cutimage">
+        <get/>
+      </resource>
       <resource relative="\d+">
         <get out="station"/>
         <post in="pattern" out="list"/> 

+ 99 - 0
ui/css/imageSlicer.css

@@ -0,0 +1,99 @@
+.image-with-rect {
+  position: relative;
+}
+
+.image-with-rect img {
+  display: block;
+  width: 100%;
+}
+
+.rect {
+  box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+  position: absolute;
+  text-align: center;
+  border-style: dotted;
+  transform-origin: left top;
+}
+
+.patternpartcheckbox{
+  margin: 30px;
+  height: 20px !important;
+}
+
+
+
+
+
+
+.patternPart2 span{
+	display:block;
+	text-align: center;
+}
+
+.patternPart2{
+	display: inline-block;
+	white-space: nowrap;
+	
+}
+.patternPart2Input{
+	width: 8em !important;
+	text-align: center;
+  padding: 0.5em 0 !important;
+}
+
+.patternPart3 span, .patternPart3Text span{
+	display:block;
+	text-align: center;
+}
+
+.patternPart3, .patternPart3Text{
+  padding: 10px 0px;
+	display: inline-block;
+	white-space: nowrap;
+	
+}
+.patternPart3Input{
+	width: 4em !important;
+	text-align: center;
+  margin-top: 5px !important;
+}
+
+#imgRectangles .wasGroup:nth-child(even){ /* or "odd" */
+  background-color: #efefef;
+}
+
+
+
+
+/*.image-with-rect {
+ position: relative;
+ width: 100%;
+}
+.image-with-rect .image {
+ display: block;
+ width: 100%;
+ height: auto;
+}
+.image-with-rect .rect {
+  box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+ position: absolute;
+ overflow: hidden;
+ border-style: dotted;
+}
+*/
+
+/* Chrome, Safari, Edge, Opera */
+.noarrow::-webkit-outer-spin-button,
+.noarrow::-webkit-inner-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
+
+/* Firefox */
+.noarrow {
+  -moz-appearance: textfield;
+}

+ 68 - 3
ui/imageReplacement.php

@@ -4,9 +4,9 @@
   <body style="margin: 0px">
 
 <?php
-    ini_set('display_errors', 1);
-    ini_set('display_startup_errors', 1);
-    error_reporting(E_ALL);
+  ini_set('display_errors', 1);
+  ini_set('display_startup_errors', 1);
+  error_reporting(E_ALL);
   
 //http://www.justin-cook.com/2006/03/31/php-parse-a-string-between-two-strings/
   function get_string_between($string, $start, $end){
@@ -58,6 +58,7 @@
   $heightq[0]->nodeValue = "100%";
   
   
+
   //Get all Text Nodes
   $style = $xpath->query('//svg:text');
   $keyValueStore=array();
@@ -77,6 +78,63 @@
     }
   } 
   
+  $url =  (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https://" : "http://") . $_SERVER['HTTP_HOST']. dirname($_SERVER['PHP_SELF']) . "/TransformProductCode.php" . "?ProductCode=" . $_GET["ProductCode"];
+  
+  $json = file_get_contents($url);
+  $asocarray = json_decode($json, true);
+ 
+  
+  //Einzelbilder vom Universal Storage laden
+  foreach ($keyValueStore as $key => $value) {
+  
+    $keyorig = $key;
+  
+    $key = substr($key, 1); 
+    $keyarray = str_split($key, 2);
+    
+    $fullfilename = "";
+    
+    foreach($keyarray as $keypart){
+      //only if all keyparts (Pb Sy Pk Of) can be found within the asociative array (Pb -> E, Sy -> X) the file can be linked otherwise there is a problem.
+      if(array_key_exists ($keypart, $asocarray)){
+        $fullfilename = $fullfilename . "_" . $keypart . ";" . $asocarray[$keypart];
+      }
+      else{
+        continue 2;
+      }
+    }
+    $fullfilename = substr($fullfilename, 1); 
+    $fullfilename = "https://centurio.work/customers/evva/universal-storage/storage/Einzelbilder/" . $fullfilename . ".jpg";
+    //echo $fullfilename;
+  
+    
+    $element3 = $doc->createElement('pattern');
+    $element3->setAttribute("id", $fullfilename);
+    $element3->setAttribute("x", "0");
+    $element3->setAttribute("y", "0");
+    $element3->setAttribute("width", "1");
+    $element3->setAttribute("height",  "1");
+    
+    
+    $element2 = $doc->createElement('image');
+    $element2->setAttribute("x", "0");
+    $element2->setAttribute("y", "0");
+    $element2->setAttribute("width", $value->getAttribute('width'));
+    $element2->setAttribute("height", $value->getAttribute('height'));
+    $element2->setAttribute("xlink:href", $fullfilename);
+    
+    
+    $element3->appendChild($element2);
+    $parent = $doc->getElementsByTagName('defs')->item(0);
+    $parent->appendChild($element3);      
+    $value->setAttribute("fill", "url(#". $fullfilename . ")");
+    
+    
+    //override identifier to be empty
+    $keyValueStore2[$keyorig]->nodeValue = "";
+    
+  }
+  
   //$keyValueStore["*imga"]->setAttribute("fill", "#FFFFFF");
   
   
@@ -93,6 +151,13 @@
     }
   }
   
+
+  
+  
+  
+  
+  
+  
   //load image Replacements
   $replacements = new DOMDocument();
   

+ 190 - 57
ui/index.html

@@ -49,7 +49,11 @@
     
     <!-- custom stuff, play arround  -->
     <link   rel="stylesheet"      href="css/design.css" type="text/css"/>
+    <link   rel="stylesheet"      href="css/imageSlicer.css" type="text/css"/>
+    
+    
     <script type="text/javascript" src="js/design.js"></script>
+    <script type="text/javascript" src="js/imageSlicer.js"></script>
     
     
     <script type="text/javascript" src="js/imageUpload.js"></script>
@@ -72,9 +76,9 @@
   <ui-rest id="main">
     <ui-tabbar>
       <ui-before                                  ><a class="logo" href="/customers/evva"></a></ui-before>
-      <ui-tab class=""         data-tab="station" >Stations</ui-tab>
-      <!--<ui-tab class="inactive" data-tab="amount"  >Amount</ui-tab>
-      <ui-tab class="inactive" data-tab="production">Production</ui-tab>-->
+      <ui-tab class=""         data-tab="station"           >Stations</ui-tab>
+      <ui-tab class="inactive" data-tab="cutter"            >Slicer</ui-tab>
+      <!-- <ui-tab class="inactive" data-tab="patternAlignment"  >Alignment</ui-tab> -->
       <ui-behind                                  ></ui-behind>
     </ui-tabbar>
 	  <ui-content>
@@ -122,7 +126,7 @@
                 <span id="patternInput">
                   <input  type="text" class="patternPart" maxlength="10" size="2" name="pattern" value="*" required>
                 </span>
-                <a href="#" onclick="addPatternPart(true)">[+]</a>
+                <a href="#" onclick="addPatternPart(true, 'patternInput')">[+]</a>
               </div>
             </div>
             
@@ -131,56 +135,9 @@
               <div class="wasLeft">Status:</div>
               <div class="wasRight"><b>Work in Progress</b></div>
             </div>
-            <div class="wasGroup">
-              <div class="wasLeft">Electronic</div>
-              <div class="wasRight">E</div>
-            </div>
             
-            <div class="wasGroup">
-              <div class="wasLeft">...</div>
-              <div class="wasRight">...</div>
-            </div>
+            <div id="FormPattern">
             
-            <div class="wasGroup">
-              <div class="wasLeft">Model</div>
-              <div class="wasRight">
-                <select name="cylModel" id="cylModel">
-                  <option value="*">*</option>
-                  <option value="KZ-S">KZ-S</option>
-                  <option value="RKZ-S">RKZ-S</option>
-                  <option value="HZ-S">HZ-S</option>
-                  <option value="RHZ-S">RHZ-S</option>
-                  <option value="DZ-S">DZ-S</option>
-                  <option value="RDZ-S">RDZ-S</option>
-                </select>
-              </div>
-            </div>
-            
-            <div class="wasGroup">
-              <div class="wasLeft">Outside Cyl. Length</div>
-              <div class="wasRight">
-                <select name="outsideCyl" id="outsideCyl">
-                  <option value="*">*</option>
-                  <option value="31">31</option>
-                  <option value="36">36</option>
-                  <option value="41">41</option>
-                  <option value="46">46</option>
-                  <option value="51">51</option>
-                  <option value="56">56</option>
-                  <option value="61">61</option>
-                </select>
-              </div>
-            </div>
-            
-            <div class="wasGroup">
-              <div class="wasLeft">Inside Cyl.</div>
-              <div class="wasRight">
-                <select name="insidecyl" id="insidecyl">
-                  <option value="*">*</option>
-                  <option value="31">31 ... 61</option>
-                  <option value="36">K31 ... K61</option>
-                </select>
-              </div>
             </div>
             
             
@@ -343,17 +300,193 @@
         <div id="station_details" style="display: none; padding: 10px">
         </div>
         
-        <div id="overlay" onclick="overlayOff()">
-          <div id="overlaycontentsize"></div>        
-        </div>
         
       </ui-area>
-      <ui-area data-belongs-to-tab="amount" class="inactive">
+      
+      <ui-area data-belongs-to-tab="cutter" class="inactive">
+      Todo: Load image from Universal Storage
+      
+      
+      <template id="RectanglesImage">
+ 
+        <div class="rect" data-class='RectID'></div>
+        </div>
+      </template>
+      
+      
+      
+      <div>
+        <a href="#" onclick="overlayOn($(this), true);">🔍</a>
+      </div>
+      
+      
+      <div id="imgrect" class="image-with-rect">
+       <img class="image" id="sliceImg" src="https://centurio.work/customers/evva/universal-storage/storage/Einzelbilder/IMG_1876_klein.JPG" alt="Alt text" />
+       
+      
+      <!--
+      <div id="imagearea">
+        <img src="images/image.jpg" alt="Italian Trulli" width="100%">
+      
+      
+        <div class="rect">
+          Cutting Area1
+        </div>
+      </div>
+      -->
+      </div>
+      
+      
+      </ui-area>
+      
+      <!--<ui-resizehandle data-belongs-to-tab="cutter" data-label="drag to resize" ></ui-resizehandle>-->
+      
+      <ui-area data-belongs-to-tab="cutter" id="detailcolumn2" class="inactive">
+        <div class='x-ui-layout' style="padding: 10px">
+          <div class="wasGroup">
+            <div class="wasLeft">Status:</div>
+            <div class="wasRight"><b>Work in Progress</b></div>
+          </div>
+            
+          <form id="sliceform"  onsubmit="submitSlices()">
+          
+
+            
+            <!--
+            <div class="wasGroup">
+              <div class="wasLeft">Pattern <a class="mouseOver" href="#" title="Press '.' or 'space' while editing to create a new pattern part."></a>
+              </div>
+              <div class="wasRight">
+                <span id="pattern2">
+                  <input  type="text" class="patternPart" maxlength="10" size="2" name="pattern" value="*" required>
+                </span>
+                <a href="#" onclick="addPatternPart(true, 'pattern2')">[+]</a>
+              </div>
+            </div>
+            -->
+            <template id="PatternFormInit">
+              <div class="wasGroup" data-class='mainDiv'>
+                <div data-class='description' class="wasLeft">
+                  <span data-class='Name'></span>(<span data-class='Abkürzung'></span>)
+                </div>
+                <div class="wasRight">
+                  <select data-class='Optionen' name="">
+                  </select>
+                </div>
+              </div>
+            </template>
+            
+            
+            <div id="FormPattern2">
+            
+            </div>
+            
+            
+            <div class="wasGroup">
+              <div class="wasLeft">Save Location</div>
+              <div class="wasRight">
+                <select name="savelocation" id="savelocation">
+                </select>
+              </div>
+            </div>
+              
+            <div class="wasGroup">
+              <div class="wasLeft">Load Rectangle Config</div>
+              <div class="wasRight">
+                <select name="loadconfig" id="loadconfig">
+                  <option value="none">none</option>
+                </select>
+              </div>
+            </div>
+                
+                
+                
+            <template id="RectanglesSetup">
+              <div class="wasGroup singleRect" data-class='mainDiv'>
+                <div data-class='description' class="wasLeft">
+                  RectID: 
+                  <span data-class='RectID' class="RectID"></span>
+                </div>
+                <div class="wasRight">
+                  <div class="patternPart2">
+                    <span>X</span>
+                    <input data-class='x' type="number" class="patternPart2Input noarrow" maxlength="4" size="4" value="0" required>
+                  </div>
+                  <div class="patternPart2">
+                    <span>Y</span>
+                    <input data-class='y' type="number" class="patternPart2Input noarrow" maxlength="4" size="4" value="0" required>
+                  </div>
+                  <div class="patternPart2">
+                    <span>W</span>
+                    <input data-class='w' type="number" class="patternPart2Input noarrow" maxlength="4" size="4" value="0" required>
+                  </div>
+                  <div class="patternPart2">
+                    <span>H</span>
+                    <input data-class='h' type="number" class="patternPart2Input noarrow" maxlength="4" size="4" value="0" required>
+                  </div>
+                  <br>
+                  <div data-class='RectanglePattern' lass="RectanglePattern">
+                  </div>
+                </div>
+              </div>
+            </template>
+            
+            <template id="RectanglePattern">
+              <div class="patternPart3">
+                <span data-class="abk"></span>
+                <input data-class='input' class="patternPart3Input" type="checkbox" name="ID_EL"   >
+              </div>
+            </template>
+            
+            <template id="RectanglePatternText">
+              <div class="patternPart3Text">
+                <span data-class="abk">Text</span>
+                <input data-class='input' type="text" class="patternPart3Input " maxlength="4" size="4" value="">
+              </div>
+            </template>
+              
+            <div class="wasGroup">
+              <div class="wasLeft">Rectangles</div>
+              <div class="wasRight">
+                
+                <a href="javascript:addRectangle();">Add Rectangle</a>
+                  
+                  
+              </div>
+            </div>
+          
+            <div id="imgRectangles">
+              
+              
+            </div>
+          
+            <button  class="width100" type="button" id="showJson">Json2Clipboard</button>
+            <input class="width100" type="submit" value="startCutting">
+          </form>
+          
+            
+        </div>
+      </ui-area>
+      
+      <!---
+      <ui-area data-belongs-to-tab="patternAlignment" class="inactive">
+      aa [Model, OutsideCyl, InsideCyl]
+      
+     
+      
+      
       </ui-area>
-      <ui-area data-belongs-to-tab="production" class="inactive">
+      
+      
+      <ui-area data-belongs-to-tab="patternAlignment" id="detailcolumn3" class="inactive">
+      --->
+        
       </ui-area>
     </ui-content>
   </ui-rest>
   
+        <div id="overlay" onclick="overlayOff()">
+          <div id="overlaycontentsize"></div>        
+        </div>
 </body>
 </html>

+ 11 - 6
ui/js/design.js

@@ -10,7 +10,7 @@
 var pictureWidth = 1280;
 var pictureHeight = 720;
 
-function overlayOn(value) {
+function overlayOn(value, showimage=false) {
   
   url = "https://centurio.work/customers/evva/universal-storage/ui/?iframe"
   document.getElementById("overlay").style.display = "block";
@@ -27,7 +27,12 @@ function overlayOn(value) {
       overlayOff();
       
       //fill input with url
-      $(data.xyz).parent().parent().find(".abbreviationInput").val(extra1.url)
+      if(!showimage){
+        $(data.xyz).parent().parent().find(".abbreviationInput").val(extra1.url)
+      }
+      else{
+        $("#sliceImg").attr("src",extra1.url)
+      }
     });
   });
 }
@@ -203,14 +208,14 @@ function removePatternPart(value) { //HTML
   value.parent().remove();
 }
 
-function addPatternPart(useLast) { //HTML
+function addPatternPart(useLast, curclass) { //HTML
   var clone = document.importNode(document.querySelector('#patternClone').content,true);
   $('[data-class=part]',clone).val("*");
   $('[data-class=part]',clone).limitkeypress({rexp: keypressRegex()});
   
   if(useLast){
-    $('.patternPart').last().after(clone);
-    $('.patternPart').last().children(".patternPartInput").focus();
+    $("#" + curclass).children(".patternPart").last().after(clone);
+    $("#" + curclass).last().children(".patternPartInput").focus();
     }else{
     $(':focus').parent().after(clone);
     $(':focus').parent().next().children(".patternPartInput").focus();
@@ -447,7 +452,7 @@ function getImages(stationID, patternID){ //Get From DB 2 HTML
                 
                 
                 //Image Preview
-                $('[data-class=showimage]',clone).attr("href", "imageReplacement.php?___image___="+stationID+ "/" + patternID + "/" + curID + "/"+ $(this).attr('lang') + ".svg" +"&*ProductCode=" + pattern );
+                $('[data-class=showimage]',clone).attr("href", "imageReplacement.php?___image___="+stationID+ "/" + patternID + "/" + curID + "/"+ $(this).attr('lang') + ".svg" +"&ProductCode=" + pattern );
                
                 
                 

+ 303 - 0
ui/js/imageSlicer.js

@@ -0,0 +1,303 @@
+
+rectID = 0;
+colors = ["rgba(0,255,0,0.7)","rgba(255,0,0,0.7)","rgba(0,0,255,0.7)","rgba(0,255,255,0.7)","rgba(255,255,0,0.7)","rgba(255,0,255,0.7)","rgba(0,122,0,0.7)","rgba(122,0,0,0.7)","rgba(0,0,122,0.7)","rgba(0,122,122,0.7)","rgba(122,122,0,0.7)","rgba(122,0,122,0.7)"]
+abk = [];
+
+function addRectangle(){
+  addRectangle1("", 0,0,1000,100)
+}
+
+function scalefactor(){
+  return $('#sliceImg').innerWidth() / $('#sliceImg').prop('naturalWidth');
+}
+
+function refitRect(id){
+   $('#Rect' + id).css('transform', 'scale(' + scalefactor() + ')');
+}
+
+function changeRectPosition(id, style, amount){   
+   $('#Rect' + id).css(style, amount + "px");
+   refitRect(id);
+}
+
+function addRectangle1(id,x,y,w,h,pattern){
+  //Show input fields
+  var clone = document.importNode(document.querySelector('#RectanglesSetup').content,true);
+  
+  var localID = rectID
+  if(id != "")
+    localID = id;
+  
+  $('[data-class=RectID]',clone).text("" + localID);
+    
+  $('[data-class=mainDiv]',clone).hover(function(){
+    $('#Rect' + localID).css("background", colors[localID % colors.length]);
+    $('#FormRect' + localID).css("background", colors[localID % colors.length]);
+  },
+  function(){
+     $('#Rect' + localID).css("background", "none");
+     $('#FormRect' + localID).css("background", "none");
+  });
+  $('[data-class=mainDiv]',clone).attr('id', 'FormRect' + localID); 
+  
+  $('[data-class=x]',clone).val(x);
+  $('[data-class=x]',clone).on('input', function(e) {
+    changeRectPosition(localID, "left", this.value * scalefactor() );
+  });
+  
+  $('[data-class=y',clone).val(y);
+  $('[data-class=y]',clone).on('input', function(e) {
+    changeRectPosition(localID, "top", this.value * scalefactor());
+  });
+  
+  $('[data-class=w',clone).val(w);
+  $('[data-class=w]',clone).on('input', function(e) {
+    changeRectPosition(localID, "width", this.value );
+  });
+  
+  $('[data-class=h',clone).val(h);
+  $('[data-class=h]',clone).on('input', function(e) {
+    changeRectPosition(localID, "height", this.value );
+  });
+  
+  
+  //Alle Abkürzungen einfügen und prüfen ob im pattern angegeben
+  abk.forEach(function(item){
+    if(item == "Text"){
+      var clonepattern = document.importNode(document.querySelector('#RectanglePatternText').content,true);
+      if(typeof pattern !== 'undefined' && typeof pattern[item] !== 'undefined'){
+        $('[data-class=input]',clonepattern).val(pattern[item]);
+      }
+      $('[data-class=RectanglePattern',clone).append(clonepattern);
+      
+    }
+    else {
+      var clonepattern = document.importNode(document.querySelector('#RectanglePattern').content,true);
+      $('[data-class=abk]',clonepattern).text(item);
+      $('[data-class=input]',clonepattern).prop('name', item);
+      if(typeof pattern !== 'undefined' && pattern[item]){
+          $('[data-class=input]',clonepattern).prop('checked', true);
+      }
+      $('[data-class=RectanglePattern',clone).append(clonepattern);
+    }
+  });
+  
+  $('#imgRectangles').append(clone);
+  
+  //add rectangle
+  var clone = document.importNode(document.querySelector('#RectanglesImage').content,true);
+  $('[data-class=RectID]',clone).attr("id","Rect" + localID);
+  $('[data-class=RectID]',clone).text("Rect" + localID);
+  
+  $('[data-class=RectID]',clone).css("top", y * scalefactor() + "px");
+  $('[data-class=RectID]',clone).css("left", x  * scalefactor() + "px");
+  $('[data-class=RectID]',clone).css("width", w + "px");
+  $('[data-class=RectID]',clone).css("height", h + "px");
+  
+  
+  $('[data-class=RectID]',clone).hover(function(){
+    $('#FormRect' + localID).css("background", colors[localID % colors.length]);
+    $('#Rect' + localID).css("background", colors[localID % colors.length]);
+    
+
+    $('#detailcolumn2').scrollTop( 0 );
+    $('#detailcolumn2').scrollTop($('#FormRect' + localID).position().top - 50 );
+  },
+  function(){
+     $("#detailcolumn2").stop();
+     $('#FormRect' + localID).css("background", "none");
+     $('#Rect' + localID).css("background", "none");
+  });
+  
+  
+  $('#imgrect').append(clone);
+  
+  
+  
+  
+  refitRect(localID);
+  
+  ++rectID;
+}
+
+
+
+function createPatternForm(){
+  /* Load pattern config */
+  //Create form for WAS/Stations/Pattern and WAS/Slicer
+  var populate = ["FormPattern","FormPattern2"]
+  
+ 
+  var first = true;
+  populate.forEach(function(populate2){
+    $.getJSON( "json/ProductCode.json", function( data ) {
+      $.each( data["pattern"], function(i, item){
+        var clone = document.importNode(document.querySelector('#PatternFormInit').content,true);
+        $('[data-class=Name]',clone).text(item["name"]);
+        $('[data-class=Abkürzung]',clone).text(item["abk"]);
+        if(first)
+          abk.push(item["abk"])
+        $.each( item["types"], function(i, item){        
+          $('[data-class=Optionen]',clone).append('<option value="' + item +'">' + item +'</option>');
+        });
+        $('[data-class=Optionen]',clone).attr("id", populate2 + "_Form_" + item["abk"]);
+        
+        $('#' + populate2).append(clone);
+      });
+      //Add "Text" to abk to show it within rects
+      if(first)
+        abk.push("Text")
+      first = false;
+    });
+  });
+  abk.length = 0;
+  console.log(abk);
+  
+  //get Save locations
+  $.getJSON( "json/SlicerConfig.json", function( data ) {
+    $.each( data["saveLocation"], function(i, item){
+      $("#savelocation").append('<option value="' + item +'">' + item +'</option>');
+    });
+  });
+  
+}
+
+function createRectForm(station){
+  
+  var imgsrc = $("#sliceImg").attr("src")
+  rectID = 0;
+  $('#imgRectangles').text("");
+  
+  
+  $('#imgrect').html('<img class="image" id="sliceImg" src=' + imgsrc +' alt="Alt text" />');
+  $.getJSON( "json/Rectangle.json", function( data ) {
+    $.each( data["Configs"], function(i, item){
+      if(item["name"] == station){
+        $.each( item["rects"], function(i, item){
+          addRectangle1(item["id"],item["X"],item["Y"],item["W"],item["H"],item["pattern"]);
+        });
+      }
+    });
+  });
+}
+
+
+function loadStationsForm(){
+  
+  $.getJSON( "json/Rectangle.json", function( data ) {
+    $.each( data["Configs"], function(i, item){
+      $("#loadconfig").append('<option value="' + item["name"] +'">' + item["name"] +'</option>');
+    });
+    $("#loadconfig").on('change', function() {
+      createRectForm(this.value);
+    });
+  });
+}
+
+function createJson(){
+  rects = []
+  $(".singleRect").each(function() {
+  
+    var pats = {}
+    $(this).find(".patternPart3").each(function() {
+      $(this).find('.patternPart3Input:checked').each(function() {
+        pats[$(this).attr('name')] = true;
+      });
+    });
+    $(this).find(".patternPart3Text").each(function() {
+      pats[$(this).children("span").text()] = $(this).children("input").val();
+    });
+    
+    rect = {id: $( this ).find(".RectID").text(), X:$( this ).find('input[data-class="x"]').val(), Y:$( this ).find('input[data-class="y"]').val(), W:$( this ).find('input[data-class="w"]').val(), H:$( this ).find('input[data-class="h"]').val(), pattern: pats};
+    rects.push(rect);
+  });
+  allrects = {name: $("#loadconfig").val(), rects: rects};
+  return allrects;
+}
+
+
+function createJsonCutting(){
+  var rects = createJson();
+  
+  rects.rects.forEach(function(value) {
+    pattern = value.pattern;
+    abk.forEach(function(item){
+      if(typeof $("#FormPattern2_Form_" + item).val() !== 'undefined' && typeof $("#FormPattern2_Form_" + item).val() !== 'undefined' && $("#FormPattern2_Form_" + item).val() !== ''){
+        if(pattern[item]){
+          pattern[item] = $("#FormPattern2_Form_" + item).find(":selected").text();
+        }
+        //console.log($("#Form_" + item).val())
+
+      }
+    });
+      
+      
+      
+  });
+  return rects;
+}
+
+function submitSlices(){
+  //createJsonCutting();
+  
+  console.log(JSON.stringify(createJsonCutting()));
+  
+  request = $.ajax({
+        type: "POST",
+        url: "https://centurio.work/customers/evva/was/ui/images/imageSlicer.php",
+        data: { url: $("#sliceImg").attr("src"), savelocation: $("#savelocation").val(), alldata: JSON.stringify(createJsonCutting()) },
+        success: function(data){
+          console.log(data);
+        },
+         error: function(xhr, status, error){
+          console.error(xhr);
+        }
+    });
+  
+  /*
+  
+    imageurl,
+    savelocation,
+    code,
+    rectangles,
+  
+  
+  */
+  
+}
+
+function showJson(){
+  
+  copy2Clipboard(JSON.stringify(createJson()))
+  
+}
+
+function copy2Clipboard(datalink) {
+  const el = document.createElement('textarea');
+  el.value = datalink;
+  document.body.appendChild(el);
+  el.select();
+  document.execCommand('copy');
+  document.body.removeChild(el);
+}
+
+$(document).ready(function() {
+  createPatternForm();
+  loadStationsForm();
+  
+  $(document).on('submit', '#sliceform', function() { //prevent page reload on form submit
+    return false;
+  });
+  
+  
+  $("#showJson").click(function() {
+    showJson();
+  });
+  
+  $('#pattern2').text("");
+  var clone = document.importNode(document.querySelector('#patternClone').content,true);
+  $('[data-class=part]',clone).limitkeypress({rexp: keypressRegex()});
+  $("#pattern2").append(clone);
+  
+  
+});

+ 143 - 0
ui/json/ProductCode.json

@@ -0,0 +1,143 @@
+{
+  "pattern": [
+    {
+      "name": "Produktbereich",
+      "abk": "Pb",
+      "types": [
+        "E"
+      ]
+    },
+    {
+      "name": "System",
+      "abk": "Sy",
+      "types": [
+        "X"
+      ]
+    },
+    {
+      "name": "Produktkategorie",
+      "abk": "Pk",
+      "types": [
+        "PZ"
+      ]
+    },
+    {
+      "name": "Bauart",
+      "abk": "Ba",
+      "types": [
+        "*",
+        "KZ-S",
+        "RKZ-S",
+        "HZ-S",
+        "RHZ-S",
+        "DZ-S",
+        "RDZ-S"
+      ]
+    },
+    {
+      "name": "Zylinderlänge außen",
+      "abk": "Za",
+      "types": [
+        "*",
+        "31",
+        "36",
+        "41",
+        "46",
+        "51",
+        "56",
+        "61"
+      ]
+    },
+    {
+      "name": "Zylinderlänge Innen",
+      "abk": "Zi",
+      "types": [
+        "*",
+        "31",
+        "36",
+        "41",
+        "46",
+        "51",
+        "56",
+        "61",
+        "K31",
+        "K36",
+        "K41",
+        "K46",
+        "K51",
+        "K56",
+        "K61"
+      ]
+    },
+    {
+      "name": "Oberfläche",
+      "abk": "Of",
+      "types": [
+        "",
+        "*",
+        "NI",
+        "NP",
+        "MP",
+        "PB",
+        "PS"
+      ]
+    },
+    {
+      "name": "Knaufform",
+      "abk": "Kf",
+      "types": [
+        "",
+        "*",
+        "X1K",
+        "ATA",
+        "Blind",
+        "2GW4"
+      ]
+    },
+    {
+      "name": "Panikfunktion",
+      "abk": "Pf",
+      "types": [
+        "",
+        "*",
+        "FZG",
+        "FAP",
+        "FLU",
+        "FSR"
+      ]
+    },
+    {
+      "name": "Verlängerte Außenkante",
+      "abk": "Va",
+      "types": [
+        "",
+        "*",
+        "AV05",
+        "AV10",
+        "AV15"
+      ]
+    },
+    {
+      "name": "Schließnase",
+      "abk": "Sn",
+      "types": [
+        "",
+        "*",
+        "SEP",
+        "SRP",
+        "BIF",
+        "Z10",
+        "Z18"
+      ]
+    },
+    {
+      "name": "Zusatzzertifikat",
+      "abk": "Zs",
+      "types": [
+        "",
+        "*",
+        "SKG"
+      ]
+    }
+  ]
+}

File diff suppressed because it is too large
+ 52 - 0
ui/json/Rectangle.json


+ 6 - 0
ui/json/SlicerConfig.json

@@ -0,0 +1,6 @@
+{
+  "saveLocation": [
+    "../../../universal-storage/storage/Einzelbilder/",
+    "../../../universal-storage/storage/JohannesEinzelbilder/"
+  ]
+}