--исходим из того что CONN уже выполнена и PL и PA уже совмещены
define function !!flipconn(!arg1 is real) is boolean
--$p !arg1 = $!arg1
var !mode mode
--q var !mode

if !arg1 neq -1 then
  flip
endif 

conn

!prev = prev of ce
handle any
  return
endhandle


--$p --PREV--
if not !!isinvert( prev of $!!ce) then
 --$p norm flow
 !prevdir = p31dir of prev
 --$p get p31 of prev
 
 if !mode eq 'Backwards' then
   !prevdir = p30dir of prev
   --$p get p30 of prev
 endif
 
else
 --$p invert flow
 !prevdir = p30dir of prev
 --$p get p30 of prev
 
 if !mode eq 'Backwards' then
   !prevdir = p31dir of prev
   --$p get p31 of prev
 endif
 
endif

--если позиция P1 и PA совпадает значит обычное направление и надо брать выход P30 (иначе P31)

--$p --CE--
if not !!isinvert( !!ce) then
 --$p norm flow
 !cedir = p30dir
 --$p get p30 of CE
 
 if !mode eq 'Backwards' then
   !cedir = p31dir
   --$p get p31 of CE
 endif
else
 --$p invert flow
 !cedir = p31dir
 --$p get p31 of CE
 
 if !mode eq 'Backwards' then
   !cedir = p30dir
   --$p get p30 of CE
 endif
endif
--$p !cedir = $!cedir | !prevdir = $!prevdir



--1 определяем направление точки выхода PL(например P31) предыдущего

--!prevdir = p31dir of prev
--$p $!prevdir
--2 опрееляем напрвление точки PA(например P30) текущего
--!cedir = p31dir of ce
--$p $!cedir
--определяем угол тобы довернуть до совмещения

!angle = !cedir.angle(!prevdir)
!angle = !angle * !arg1
--$p $!angle

if !mode eq 'Forwards' then
  rot thr pA about pa by $!angle
else
  rot thr pL about pL by $!angle
endif

--$p выполнен поворот $!angle

--получаем оба направления после поворота
--если совпало, то делаем тоже самое со знаком минус

if not !!isinvert( !!ce) then
 --$p norm flow
 !previnvert = false
 !prevdir = p31dir of prev
 
 if !mode eq 'Backwards' then
   !prevdir = p30dir of prev
 endif
else
 --$p invert flow
 !previnvert = true
 !prevdir = p30dir of prev
 
 if !mode eq 'Backwards' then
   !prevdir = p31dir of prev
 endif
endif


if not !!isinvert( !!ce) then
 --$p norm flow
 !ceinvert = false
 !cedir = p30dir
 
 if !mode eq 'Backwards' then
   !cedir = p31dir
 endif
else
 --$p invert flow
 !ceinvert = true
 !cedir = p31dir
 
 if !mode eq 'Backwards' then
   !cedir = p30dir
 endif
endif
--$p !cedir = $!cedir | !prevdir = $!prevdir
--есл ещё не поворачивали не совпадает то

if !arg1 neq -1 and not !cedir.angle(!prevdir) le 0.1 then
  --$p 2й запуск
  !!flipconn(-1)
endif
