{"id":284422,"date":"2017-04-04T16:05:02","date_gmt":"2017-04-04T12:05:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284422"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284422","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043c\u043d\u0435\u043c\u043e\u0441\u0445\u0435\u043c \u0434\u043b\u044f SCADA-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 Fabric.js. \u0427\u0430\u0441\u0442\u044c 2-\u044f"},"content":{"rendered":"<p>\u0412<a href=\"https:\/\/habrahabr.ru\/post\/322990\/\"> \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <\/a>\u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043c\u043d\u0435\u043c\u043e\u0441\u0445\u0435\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u0412\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c61\/a29\/4eb\/c61a294ebd79442695ca6a4e5bdfbb85.png\"\/><br \/>  <a name=\"habracut\"><\/a><br \/>  \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043c\u044b \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 SVG \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0437\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c transform=\u00abtranslate(X Y)\u00bb \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0441\u0430\u043c\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 X Y. \u041e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e\u0442 \u0431\u0430\u0433 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 0 0, \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0432 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0438\u0445 transformMatrix, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u0434\u043e X Y \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0443\u0442 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u0418 \u0432\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">  function After_load() {          var kol = 0;    canvas.forEachObject(function(obj){  var transformMatrix1 = [1,0,0,1,0,0];     var str_x;      var str_y;      var tr_y;          var tx_sg = obj.toSVG();             if ((tx_sg.indexOf('transform=&quot;translate')&gt;=0) && (tx_sg.indexOf('&lt;g ')&gt;=0))   {      obj.setOriginX('left');       obj.set('lockScalingX','false');      obj.set('lockScalingY','false');   }         var transformMatrix2 = obj.get('transformMatrix');         var strokeWidth1 = obj.getStrokeWidth();           var m_x = obj.getLeft();  var m_y = obj.getTop();  var calcTransformMatrix2 = obj.calcTransformMatrix();           transformMatrix1[1] = transformMatrix2[1];         transformMatrix1[2] = transformMatrix2[2];   if (!((tx_sg.indexOf('transform=&quot;translate')&gt;=0) && (tx_sg.indexOf('&lt;g ')&gt;=0)))   {     obj.setTransformMatrix(transformMatrix1);   }        obj.setTop(transformMatrix2[5]+m_y*transformMatrix2[3]);*\/ if (tx_sg.indexOf('&lt;line x1=&quot;0&quot;')&gt;=0){       obj.setLeft(transformMatrix2[4]+(m_x)*transformMatrix2[0]-(strokeWidth1\/2)*transformMatrix2[0]);\/\/(m_x-0.5)*transformMatrix2[0]        obj.setTop(transformMatrix2[5]+(m_y)*transformMatrix2[3]-(strokeWidth1\/2)*transformMatrix2[3]); \/\/(m_y-0.5)*transformMatrix2[3]      } else     if ((tx_sg.indexOf('&lt;rect ')&gt;=0) || (tx_sg.indexOf('&lt;polygon ')&gt;=0) || (tx_sg.indexOf('&lt;line x1=&quot;-')&gt;=0)|| (tx_sg.indexOf('&lt;circle cx=')&gt;=0))   {         obj.setLeft(transformMatrix2[4]+(m_x)*transformMatrix2[0]-(strokeWidth1\/2)*transformMatrix2[0]);\/\/(m_x-0.5)*transformMatrix2[0]        obj.setTop(transformMatrix2[5]+(m_y)*transformMatrix2[3]-(strokeWidth1\/2)*transformMatrix2[3]); \/\/(m_y-0.5)*transformMatrix2[3] } else   if (tx_sg.indexOf('&lt;path ')&gt;=0)   {        obj.setLeft(transformMatrix2[4]+(m_x-strokeWidth1\/2)*transformMatrix2[0]);        obj.setTop(transformMatrix2[5]+(m_y-strokeWidth1\/2)*transformMatrix2[3]);  } else     if ((tx_sg.indexOf('transform=&quot;translate')&gt;=0) && (tx_sg.indexOf('&lt;g ')&gt;=0))\/\/if (tx_sg.indexOf('&lt;g transform=&quot;translate')&gt;=0)   {    var  poz2 = tx_sg.indexOf(&quot;&lt;\/tspan&gt;&quot;);    var  poz1 = tx_sg.indexOf(&quot;&lt;tspan &quot;);    if ((poz2&gt;0) && (poz1&gt;0))    {     var  poz3 = tx_sg.indexOf(&quot;&gt;&quot;,poz1+1);     if (poz3&gt;0){       var str = tx_sg.substring(poz3+1,poz2);         }   }\/\/  if ((poz2&gt;0) && (poz1&gt;0))  tx_sg = obj.toSVG(); poz2 = tx_sg.indexOf(&quot;&lt;\/tspan&gt;&quot;); poz1 = tx_sg.indexOf(&quot;&lt;tspan &quot;);    if ((poz2&gt;0) && (poz1&gt;0))    {     var  poz3 = tx_sg.indexOf('x=&quot;',poz1+1);     if (poz3&gt;0){       var  poz4 = tx_sg.indexOf('&quot;',poz3+4);       str_x = tx_sg.substring(poz3+3,poz4);           }       poz3 = tx_sg.indexOf('y=&quot;',poz1+1);     if (poz3&gt;0){       var  poz4 = tx_sg.indexOf('&quot;',poz3+4);       str_y = tx_sg.substring(poz3+3,poz4);           }    }\/\/  if ((poz2&gt;0) && (poz1&gt;0))   poz1 = tx_sg.indexOf('transform=&quot;translate(');  if (poz1&gt;0)     {          poz2 = tx_sg.indexOf(&quot; &quot;,poz1+21);          var  poz3 = tx_sg.indexOf(')',poz2+1);           tr_y = tx_sg.substring(poz2,poz3);        }              m_x = obj.getLeft();              m_y = obj.getTop();              transformMatrix2 = obj.get('transformMatrix');    \t      obj.setTransformMatrix(transformMatrix1);              obj.setTop(transformMatrix2[5]-parseFloat(tr_y)-parseFloat(str_y)-strokeWidth1*0.58);        obj.setLeft(transformMatrix2[4] + parseFloat(str_x) - (strokeWidth1\/2) ); } else   {              obj.setLeft(transformMatrix2[4]+(m_x)*transformMatrix2[0]-(strokeWidth1\/2)*transformMatrix2[0]);\/\/(m_x-0.5)*transformMatrix2[0]        obj.setTop(transformMatrix2[5]+(m_y)*transformMatrix2[3]-(strokeWidth1\/2)*transformMatrix2[3]); \/\/(m_y-0.5)*transformMatrix2[3]     }        obj.setScaleX(transformMatrix2[0]);        obj.setScaleY(transformMatrix2[3]);                 obj.set('transparentCorners','true');        obj.setCoords();        kol = kol + 1; }); if (kol === 0) {  $.post(&quot;After_load&quot;, kol);  } else   {     Is_After_load = true; }     }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 canvas \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043d\u0430 \u043d\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0436\u0435. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">setTimeout(function() {   if (!Is_After_load){    After_load();    } }, 5000);  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0443. Html-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 idhttpserver. \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Chromium, \u0432 \u0442\u043e\u0447\u043d\u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 DcefBrowser. Idhttpserver \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u0442 15500, Chromium \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 <a href=\"http:\/\/127.0.0.1\">127.0.0.1<\/a>:15500\/. \u041c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043a\u0440\u044b\u0442\u044c <a href=\"http:\/\/127.0.0.1\">127.0.0.1<\/a>:15500\/ \u043b\u044e\u0431\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438 \u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e. \u041f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u044f \u0441\u0432\u043e\u0439 Chromium \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043c\u044b \u0434\u0430\u0451\u043c \u0435\u043c\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c java-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e. <br \/>  Index.html \u0447\u0435\u0440\u0435\u0437 idhttpserver \u043c\u044b \u043e\u0442\u0434\u0430\u0451\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c:   <\/p>\n<ol>\n<li>Canvas \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. <\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442 SVG-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/li>\n<li>\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 SVG-\u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. <\/li>\n<li>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u043e\u0442 \u041e\u0420\u0421-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. <\/li>\n<\/ol>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>$.post<\/code> \u0438 <code>toSVG <\/code>\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438:<br \/>  <i>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u0432 SVG:<\/i><br \/>  <code>function Post_sheme() { <br \/>  $.post(&quot;save.php&quot;, canvas.toSVG());<br \/>  };<\/code><br \/>  \u0412 http-\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043b\u043e\u0432\u0438\u043c post-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 SVG <code>ARequestInfo.UnparsedParams<\/code>.<br \/>  <i>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 SVG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. <\/i>\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443\u00bb, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <code>$.post(&quot;new.php?&quot;+$(&quot;input[name=namenewsvg]&quot;).val(), Buff_clipb);<\/code><br \/>  \u0413\u0434\u0435 <code>$(&quot;input[name=namenewsvg]&quot;).val() <\/code>\u2013 \u044d\u0442\u043e \u0438\u043c\u044f SVG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<br \/>  <i>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/i> \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">var tx = canvas.getActiveGroup().toSVG();           tx = '&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;&lt;!DOCTYPE svg PUBLIC &quot;-\/\/W3C\/\/DTD SVG 1.1\/\/EN&quot; &quot;http:\/\/www.w3.org\/Graphics\/SVG\/1.1\/DTD\/svg11.dtd&quot;&gt;&lt;svg width=&quot;100%&quot; height=&quot;100%&quot; version=&quot;1.1&quot; xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;'            +tx+ '&lt;\/svg&gt;'; $.post(&quot;copy.php&quot;, tx); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 http-\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043b\u043e\u0432\u0438\u043c post-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430   <\/p>\n<pre><code class=\"delphi\">Clipboard.AsText := ARequestInfo.UnparsedParams;<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0451 SVG. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SVG\u00bb \u2014 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430, \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u00bb.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0441\u0432\u043e\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 \u041e\u0420\u0421-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 SVG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c.<br \/>  \u0414\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u0435\u043a\u0441\u0442. \u041d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u00ab\u0442\u0435\u043a\u0441\u0442\u00bb. \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e. \u041d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u00ab\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430\u00bb \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0430\u043d\u0435\u0442 <code>{{val.\u0418\u043c\u044f_\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439}}<\/code>. \u0422.\u0435. \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>text<\/code>. <br \/>  \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u041e\u0434\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e. \u0422.\u0435. \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u042d\u043b\u0435\u043c\u0435\u043d\u0442, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0438\u0434\u0438\u043c.<br \/>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e, \u0432 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u044b\u0431\u0435\u0440\u0430\u0442\u044c <code>\u0418\u043c\u044f_\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439_on<\/code>. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e, \u0432 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c <code>\u0418\u043c\u044f_\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439_off<\/code>. \u0421\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 id.<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">function setIDObj() {          var activeObject = canvas.getActiveObject();      if (activeObject) {     activeObject.set({      id : $(&quot;input[name=nameobj]&quot;).val()      });      var tx_sg = activeObject.toSVG();       var poz2 = tx_sg.indexOf(&quot;&lt;\/tspan&gt;&quot;);      var poz1 = tx_sg.indexOf(&quot;&lt;tspan &quot;);         if ((poz2&gt;0) && (poz1&gt;0))    {     var ttx = $(&quot;input[name=nameobj]&quot;).val();     if (ttx.indexOf(&quot;{{&quot;)&lt;=0)      {       ttx = &quot;{{val.&quot;+ttx+&quot;}}&quot;;     }      activeObject.set({         text: ttx    });     canvas.renderAll();    }    }   }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435. \u041c\u043d\u043e\u0433\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 SVG. \u041f\u043e\u043a\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/720\/a46\/ce1\/720a46ce18674091b0004d3662353a14.png\"\/><br \/>  \u0423\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0445\u0435\u043c\u0443 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0432 Visio, \u043a\u043e\u043f\u0438\u0440\u0443\u044e \u0435\u0451 \u0432 Inkscape, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e \u0432 SVG, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435, \u043a\u043e\u043f\u0438\u0440\u0443\u044e, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c SVG\u00bb \u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u2013 \u043a\u043d\u043e\u043f\u043a\u0430 \u00ab\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u00bb.<br \/>  \u0418\u0437 Visio \u0432 Inkscape \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442.\u043a. Visio \u0441\u043e\u0437\u0434\u0430\u0435\u0442 SVG, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 FabricJS \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c.<br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 online \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e <a href=\"http:\/\/sh.briztop.ru\">\u0437\u0434\u0435\u0441\u044c<\/a>.<br \/>  \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f SCADA-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c <a href=\"http:\/\/opc-servers.ru\/program\/108-soloscada\">\u0437\u0434\u0435\u0441\u044c<\/a>.<br \/>  \u0410 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0436\u0438\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/325640\/\"> https:\/\/habrahabr.ru\/post\/325640\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412<a href=\"https:\/\/habrahabr.ru\/post\/322990\/\"> \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <\/a>\u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043c\u043d\u0435\u043c\u043e\u0441\u0445\u0435\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e \u0433\u043e\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u0412\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c61\/a29\/4eb\/c61a294ebd79442695ca6a4e5bdfbb85.png\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-284422","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=284422"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284422\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}