[AI CC-CC2021] Соединение отрезков линий в непрерывные линии

SharadaNsk

Участник
Топикстартер
Сообщения
29
Реакции
4
Добрый день.

Имеется большое количество отрезков линий, находящихся в одном слое. Многие линии имеют на концах точки соединения с другими линиями (с одной, двумя и даже тремя линиями).

Требуется скрипт, который бы соединял отрезки линий в непрерывную линию, если в точке соединения две линии, и не соединял, если в точке соединения более трех линий. Само собой, не должны соединятся отрезки, которые не имеют точек соединения (разрывы).

См. поясняющий рисунок.



116498
 

NNN5

Модератор
15 лет на форуме
Сообщения
1 256
Реакции
1 012
Есть такой скрипт Join Reasonably.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 187
Реакции
10 844

SharadaNsk

Участник
Топикстартер
Сообщения
29
Реакции
4
Моя сеть отрезков имеет обычно вот такой вид. Join Reasonably тут пасует ;-)
116515
 

NNN5

Модератор
15 лет на форуме
Сообщения
1 256
Реакции
1 012
Так. Стоп. А линии у вас все разной толщины! Вы их как соединять собираетесь? Вам требуется, чтобы они остались линиями?
Мне на ум приходит такое решение: превратить в замкнутые контуры (Expand), а потом соединять с помощью Pathfinder или инструмента Shape Builder.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 187
Реакции
10 844
Мне на ум приходит такое решение: превратить в замкнутые контуры (Expand), а потом соединять с помощью Pathfinder или инструмента Shape Builder.
Требуется скрипт, который бы соединял отрезки линий в непрерывную линию
 

qsedftghk

фея
15 лет на форуме
Сообщения
2 032
Реакции
1 198
В качестве бреда: Взять один слой линий - растеризовать на 300 dpi. А затем Image Trace в режиме LineArt (с галочкой на Stroke + может, движки всякие там подвигать). Потом expand. По идее, при трассировке, какие-то линии объединятся и уже будут одной линией.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 187
Реакции
10 844
А вот и скрипт
JavaScript:
var mindist=4;
function getDist(pt1,pt2)
{
 var dx=(pt1.anchor[0]-pt2.anchor[0]);
 var dy=(pt1.anchor[1]-pt2.anchor[1]);
  return Math.sqrt(dx*dx+dy*dy);
}

function addObj(mas,obj)
{
    for (var i=0;i<mas.length;i++)
     if (mas[i]==obj) return mas;
    mas.push(obj);
    return mas;
}

// ------------------------------------------------
// reverse the order of pathPoints in PathItem "pi"
function pireverse(pi){
  var p = pi.pathPoints;
  var arr = [];
 
  for (var i=0; i<p.length; i++) {
    with(p[i]) arr.unshift( [anchor, rightDirection, leftDirection, pointType] );
  }

  for (i=0; i<arr.length; i++) {
    with(p[i]){
      anchor         = arr[i][0];
      leftDirection  = arr[i][1];
      rightDirection = arr[i][2];
      pointType      = arr[i][3];
    }
  }
}
// -----------------------------------------
// join the 1st anchor of PathItem "pi2"
// and the last anchor of PathItem "pi1"
function pijoin(pi1, pi2){
 
 
  if (getDist(pi1.pathPoints[0],pi2.pathPoints[0])<=mindist) pireverse(pi1); else
   if  (getDist(pi1.pathPoints[pi1.pathPoints.length-1],pi2.pathPoints[pi2.pathPoints.length-1])<=mindist) pireverse(pi2); else
    if  (getDist(pi1.pathPoints[0],pi2.pathPoints[pi2.pathPoints.length-1])<=mindist) {pireverse(pi1);pireverse(pi2);} else
     if  (getDist(pi1.pathPoints[pi1.pathPoints.length-1],pi2.pathPoints[0])>mindist) return false;

 var p1 = pi1.pathPoints;
 var p2 = pi2.pathPoints;   
 
  p1[p1.length-1].rightDirection = p1[p1.length-1].anchor;
  p2[0].leftDirection  = p2[0].anchor;
 
  var pp1;
  for(var i=0; i<p2.length; i++){
    pp1 = p1.add();
    with(pp1){
      anchor         = p2[i].anchor;
      rightDirection = p2[i].rightDirection;
      leftDirection  = p2[i].leftDirection;
      pointType      = p2[i].pointType;
    }
  }
  pi2.remove();
  return true;
}

mySelection = activeDocument.selection;

if (mySelection.length>0){
 if (mySelection instanceof Array){
 
  var pnts=new Array();
  for (i=0;i<mySelection.length-1;i++)
  {
   var obj1=mySelection[i];
   for (j=i+1;j<mySelection.length;j++)
   {
    var obj2=mySelection[j];
    if ((getDist(obj1.pathPoints[0],obj2.pathPoints[0])<=mindist) ||
         (getDist(obj1.pathPoints[obj1.pathPoints.length-1],obj2.pathPoints[0])<=mindist) ||
         (getDist(obj1.pathPoints[obj1.pathPoints.length-1],obj2.pathPoints[obj2.pathPoints.length-1])<=mindist) ||
         (getDist(obj1.pathPoints[0],obj2.pathPoints[obj2.pathPoints.length-1])<=mindist) )
    {
      var flag=true;
 
      for (k=0;k<mySelection.length;k++)
      if( (k!=i) && (k!=j))
   {
    var obj3=mySelection[k];
    if ((getDist(obj1.pathPoints[0],obj3.pathPoints[0])<=mindist) ||
         (getDist(obj1.pathPoints[obj1.pathPoints.length-1],obj3.pathPoints[0])<=mindist) ||
         (getDist(obj1.pathPoints[obj1.pathPoints.length-1],obj3.pathPoints[obj3.pathPoints.length-1])<=mindist) ||
         (getDist(obj1.pathPoints[0],obj3.pathPoints[obj3.pathPoints.length-1])<=mindist) )
    {
      
       flag=false;
       break;     
    }

   }
   if (flag) {
      
       pnts=addObj(pnts,obj1);
       pnts=addObj(pnts,obj2);
   }
    }
   }
  }
 
  var i=0
  while (i<pnts.length)
  {
      var j=i+1;
      while (j<pnts.length)
      {
        if (pijoin(pnts[i],pnts[j]))    pnts.splice(j,1); else j++;
      }
   i++;
  }
 }
}
пару процедур использовал из японского скрипта, возможна дальнейшая оптимизация по скорости работы.
 
  • Спасибо
Реакции: SharadaNsk

Gadalka

R.I.P.
Сообщения
2 530
Реакции
868
Как вариант:

116531