define object OSTEC

endobject


define method .ROTATE(!ang is real)
$P $!ang
rot thr ce about U wrt ce by $!ang
endmethod

--цель данного метода перхват любой ошибки тк в edg они плохо ловятся не надёшь потом
define method .TrayPickActionMeth(!data is edgPositionData)
  !this.TrayPickActionmethHANDLED(!data)
  handle any
    q var !!error
  endhandle
endmethod

--цель данного метода точно поймат координату из DATA даже если клик был на ребре, а не на поверхности
define method .TrayPickActionMethHANDLED(!data is edgPositionData)
--q var !data

if !data.line.set() then
  !pos = !data.line.intersection(!data.POINTVECTOR)
  !this.TrayConn(!data.item,!pos)
  --$p line pick detected
else
  !this.TrayConn(!data.item,!data.position)
endif

endmethod


define method .TrayConn(!ref2 is dbref, !PickPos is position)
--define method .TrayConn(!data is edgPositionData)
if type neq 'ELCONN' then 
  return
endif
!purp = purp of cate of catref of  prtref of spref


--q var !data
--!pos = !data.position
--q var !pos
--pin3 at $!pos
--!ori = !data.plane.orientation
--!dir = !data.plane.orientation.zdir()
--q var !dir
--$p $!ori
--pos $!pos
--ori $!ori

!p1pos = !ref2.ppos[1]
!p2pos = !ref2.ppos[2]

--pin1 at $!p1pos
--pin2 at $!p2pos

!line = object line(!p1Pos, !p2Pos)
!onlinepos = !line.near(!PickPos)
--pin4 at $!onlinepos

$(
pos $!onlinepos

--направление вдоль лотка
!alongdir=!line.direction()
--направление вверх лотка
!P31dir = !data.item.pdir[31]

ori Z is $!P31dir and X is $!alongdir
--для типа BRCK произовдим смещение по оси Y на величину расстояни от P0 до P1 (этой полки)
if !purp eq 'BRCK' then
  !P1dist = !!ce.ppos[1].wrt(!!ce).north
  $p $!p1dist
  --смещаем
  !newpos = !!ce.pos.offset(!!ce.ori.ydir(),-!p1dist)
  pos $!newpos
endif

$)
!P31dir = !ref2.pdir[31].opposite()
!!connPP(!onlinepos, !P31dir, 1 )

endmethod

define method .Pickactionmeth(!data is edgPositionData)
  !this.PickactionmethHANDLED(!data)
  handle any
    q var !!error
  endhandle
endmethod

define method .PickactionmethHANDLED(!data is edgPositionData)
!purp = purp of cate of catref of  prtref of spref
--q var !data.plane.orientation
--!!ori = !data.plane.orientation
--q var !!ori

--позиция клика
!pos = !data.position
--q var !pos
--pin1 at $!pos
!ori = !data.plane.orientation
--!Zdir = !data.plane.orientation.zdir()
--$p AAA
!Zdir = !ori.zdir()
--q var !dir
--$p $!ori
--pos $!pos
--ori $!ori

!!connPP(!pos,!zdir,8)

!Udir = object direction('U')
--для настенных кронштейнов Z вверх
if !purp eq 'BRWL' then
  if !zdir neq !udir then
    ori Y is $!Zdir and Z is U
  endif
endif

if !purp eq 'BRFL' then
  if !zdir neq !udir then
    ori Z is $!Zdir and X is U
  endif
endif

--$p here
if !purp eq 'BRTR' then
  --$p убираем распорку (если она была)
  --только для консолей котоыре могут к торце или к стене коннектиться
  !!setprop(!!CE,'RASP',0)
endif


--для напольных если их поставили на стену X направлем вертикально

$(
if !purp eq 'CONS' then
  --ничего делать не надо
endif

if !purp eq 'RDEN' then
  --замеряем расстояние P0 P8
  !p8dist = !!ce.ppos[8].wrt(!!ce).up
  --$p p8dist $!p8dist

 --1 модифицируем ориентацию полученную после клика для совмещения точки P8 с Направлением Z 
  !xdir = !ori.xdir()
  --!zdir = !ori.zdir().opposite()
  
  !zdir = !!ce.pdir[8].opposite()
  
  ori X is $!xdir and Z is $!zdir
  --смещаем
  !newpos = !pos.offset(!zdir,-!p8dist)
  pos $!newpos
endif

if !purp eq 'BRFL' then
  --замеряем расстояние P0 P8
  !p8dist = !!ce.ppos[8].wrt(!!ce).up
  --$p p8dist $!p8dist

  --смещаем
  !newpos = !pos.offset(!!ce.pdir[8].opposite(),-!p8dist)
  pos $!newpos

endif

if !purp eq 'BRWL' then
 --1 модифицируем ориентацию полученную после клика для совмещения точки P8 с Направлением Z 
  !Zdir = !ori.Zdir()
  --!zdir = !ori.zdir().opposite()
--  !zdir = !!ce.pdir[8].opposite()
  
  ori Y is $!Zdir and Z is U
endif
$)
endmethod


define method .PickactionmethHANDLEDOLD(!data is edgPositionData)
!purp = purp of cate of catref of  prtref of spref
--q var !data
--!pos = !data.pointvector.position
!pos = !data.position
--q var !pos
--pin1 at $!pos
!ori = !data.plane.orientation
--!dir = !data.plane.orientation.zdir()
--q var !dir
--$p $!ori
pos $!pos
ori $!ori

if !purp eq 'CONS' then
  --ничего делать не надо
endif

if !purp eq 'RDEN' then
  --замеряем расстояние P0 P8
  !p8dist = !!ce.ppos[8].wrt(!!ce).up
  --$p p8dist $!p8dist

 --1 модифицируем ориентацию полученную после клика для совмещения точки P8 с Направлением Z 
  !xdir = !ori.xdir()
  --!zdir = !ori.zdir().opposite()
  
  !zdir = !!ce.pdir[8].opposite()
  
  ori X is $!xdir and Z is $!zdir
  --смещаем
  !newpos = !pos.offset(!zdir,-!p8dist)
  pos $!newpos
endif

if !purp eq 'BRFL' then
  --замеряем расстояние P0 P8
  !p8dist = !!ce.ppos[8].wrt(!!ce).up
  --$p p8dist $!p8dist

  --смещаем
  !newpos = !pos.offset(!!ce.pdir[8].opposite(),-!p8dist)
  pos $!newpos

endif

if !purp eq 'BRWL' then
 --1 модифицируем ориентацию полученную после клика для совмещения точки P8 с Направлением Z 
  !Zdir = !ori.Zdir()
  --!zdir = !ori.zdir().opposite()
--  !zdir = !!ce.pdir[8].opposite()
  
  ori Y is $!Zdir and Z is U
endif
endmethod




define method .Traypick()
!packet     = object EDGPACKET()
--!packet.pickPacket.stdAID('Pick AID')
!packet.pickPacket.stdposition('Pick Position!!!')
--!packet.pickPacket.picks[1].pick.input[4] = |SPHERE BOX|

!packet.action     = '!!OSTEC.TrayPickActionmeth(!this.return[1])'

!!edgCntrl.add(!packet)
endmethod

define method .pick()
!packet     = object EDGPACKET()
--!packet.pickPacket.stdAID('Pick AID')
!packet.pickPacket.stdposition('Pick Position!!!')
--!packet.pickPacket.picks[1].pick.input[4] = |SPHERE BOX|

!packet.action     = '!!OSTEC.Pickactionmeth(!this.return[1])'

!!edgCntrl.add(!packet)
endmethod

define method .setactiveButton(!cn is string)
  !!appdesmain.bOstecConn.active = ift(!cn.substring(1,1) eq '+',true, false)
  !!appdesmain.bOstecPick.active = ift(!cn.substring(2,1) eq '+',true, false)
  !!appdesmain.bOstecTrayPick.active = ift(!cn.substring(3,1) eq '+',true, false)
  !!appdesmain.bOstecRotate.active = ift(!cn.substring(4,1) eq '+',true, false)
endmethod

define method .track()
if !!ce.type neq 'ELCONN' then
  !this.setactiveButton('----')
  return
endif
!purp = purp of cate of catref of  prtref of spref of ce
handle any
!purp = ''
endhandle
$p $!purp
!a = array()
!a.append(';----')
!a.append('STND;++-+')
!a.append('STNC;++-+')
!a.append('STLN;+---')
!a.append('CONS;++-+')
!a.append('BRCK;+-+-')
!a.append('KOD;+-+-')
!a.append('BRWL;-++-')
!a.append('BRFL;-+++')
!a.append('BRTR;+++-')
!a.append('BRIP;+-+-')
!a.append('LNIP;+---')
!a.append('KSVN;+---')
!a.append('BRRD;++++')
!a.append('RDEN;++-+')
!a.append('ROD;+---')
!a.append('BREN;++-+')
!a.append('SPRT;++-+')
!a.append('SPPL;+-+-')
!a.append('UKSH;++-+')
!keys = array()
!vals = array()
do !i from 1 to !a.size()
  !keys[!i] = !a[!i].split(';')[1]
  !vals[!i] = !a[!i].split(';')[2]
enddo
!activeButtons = !vals[!keys.findfirst(!purp)]
handle any
!activeButtons = '----'
endhandle
!this.setactiveButton(!activeButtons)


--q name
$(


!desc = desc of cate of catref of  prtref of spref
!purp = purp of cate of catref of  prtref of spref
!this.pCateDesc.val = !purp & ' ' & !desc
$)
endmethod

define method .initcall()
!this.track()
endmethod

define method .help()
!formpath = !!pml.getPathName('Connectform.pmlfrm').replace('/Connectform.pmlfrm','').replace('/','\')
SYSCOM |$!formpath\Connectform.docx &| 
endmethod


--метод инициализирует едж запрос
define method .ConnPick()
!packet     = object EDGPACKET()
--!packet.pickPacket.stdAID('Pick AID')
!packet.pickPacket.stdposition('Pick Position!!!')

--!packet.definePosition('Pick Position!!!')



--!packet.pickPacket.picks[1].pick.input[4] = |SPHERE BOX|

!packet.action     = '!!OSTEC.ConnPickActionMeth(!this.return[1])'
!!edgposcntrl.setpick(7) $*установка режима  graphics
!!edgCntrl.add(!packet)

endmethod

--это первый обрабочик для отлова ошибок
define method .ConnPickActionmeth(!data is edgPositionData)
  !this.ConnPickActionMethHANDLED(!data)
  handle any
    q var !!error
  endhandle
endmethod

--это преодбработчик обрабатывающий !data
--данный метод получает dbref и position и передаёт в окончательный "коннектящий метод"
define method .ConnPickActionMethHANDLED(!data is edgPositionData)
--q var !data

if !data.line.set() then
  !pos = !data.line.intersection(!data.POINTVECTOR)
  !this.ConnALL(!data.item,!pos)
  --$p line pick detected
else
  !this.ConnALL(!data.item,!data.position)
endif

--return
$(
!purp = purp of cate of catref of  prtref of spref


--позиция клика
!pos = !data.position
--q var !pos
--pin1 at $!pos
--!ori = !data.plane.orientation
!Zdir = !data.plane.orientation.zdir()
--q var !dir
--$p $!ori
$)
endmethod

--метод доориентации элемента после коннекта

--1) что вращаем (CE)
--2) координта вокруг которой
--3) направлние вокруг которого сращаем (например "U wrt ce" или P1dir)
--4) что совместить (например P3dir of ref1)
--5) с чем совместить (например P3dir of ref2)

--!pp вокруг чего поворачиваем
--!Axisdir ось вращения
--!dirFromExpr выражение что повернуть (для постконстроля)
--!dirTo направление целевое куда повернуть
define method .orient( !pp is string, !axisDir is direction, !dirFromExpr is string, !dirTo is direction)
--подразумевается что после коннекта направления для совмещения перпендикулярны оси вращения, а значит ось вращенияч может быть автоматчиески определена
--!axisdir = !dirfrom.Orthogonal(!dirTo)



	!dirFrom = $!dirFromExpr
    !ang = !dirFrom.angle(!DirTo)
	--$P $!ang
--$p $!dirfrom
--$p $!dirto
	rot thr $!pp about $!axisdir by $!ang
	!ResultDir = $!dirFromExpr
	if !ResultDir.angle(!dirTo) neq 0 then
	--2 раза крутим обратно тк ошиблись с направлением
	rot thr $!pp about $!axisdir by -$!ang
	rot thr $!pp about $!axisdir by -$!ang
	endif
	--если результирующее направления не совпало то надо назад крутить 2 раза
	

endmethod

--в метод передаёся спиок номеров допустимых точек он возвращает номер ближайшей из допустимых
define method .nearestPP(!el is dbref, !pickpos is position, !ppList is array) is real
  !nearest = -1
  !min = 10000000
  do !Pnum values !pplist
    !dist = !el.ppos[real(!pnum)].distance(!pickpos)
	handle any
	  --$p point $!pnum not found
	  !dist = 10000000
	endhandle
    if !dist lt !min then
	!min = !dist
	!nearest = real(!Pnum)
	endif
  enddo
  return !nearest
endmethod

--данный метод вызывается из колбека едж метода откуда приходит элемент и координата клика
define method .ConnALL(!ref2 is dbref, !PickPos is position)
--сверка типа текущего элемента
if type neq 'ELCONN' then
  !!alert.message('Перед вызовом команды должен быть выбран ELCONN')
  return
endif

if type of $!ref2 neq 'ELCONN' then
  !!alert.message('Необходимо указать на элемент типа ELCONN')
  return
endif

!purp1 = purp of cate of catref of  prtref of spref of ce
--запрашиваем 2й элемент
--var !Ref2 refno of id@

!Seria1 = csta of cata of catref of prtref of spref of ce
!Seria2 = csta of cata of catref of prtref of spref of $!ref2

!ff1 = !Seria2.split().findfirst(!seria1)
!ff2 = !Seria1.split().findfirst(!seria2)
--$p $!Seria1 $!seria2
--if !Seria1 neq !Seria2 then
if unset(!ff1) and unset(!ff2) then
  !!alert.message('Элемент серии $!seria1 нельзя присоединять к серии $!seria2')
  return
endif


--сверка серии элемента LN SN3 SN5 VN


--сверка типа выбранного элемента
if type of $!Ref2 neq 'ELCONN' then
  !!alert.message('Необходимо указать ELCONN. Действие отменено')
  return
endif

!purp2 = purp of cate of catref of  prtref of spref of $!ref2

if !purp1 eq 'ROD' then
  if !purp2 eq 'RDEN' then
    conn P11 to P12 of $!ref2
  elseif !purp2 eq 'BRRD' then
    conn P10 to P9 of $!ref2
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif
elseif !purp1 eq 'STLN' then
  if !purp2 eq 'STND' then
    !pnum = !this.nearestPP(!ref2,!PickPos,split('6 16'))
    conn P7 to P$!pnum of $!ref2
	
	!this.orient( 'P5', !!ce.pdir[7], '!!ce.pdir[3]', !ref2.pdir[3])
	
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif
elseif !purp1 eq 'STND' or !purp1 eq 'STNC' then
  --смысл в том что STND и STNC идентичны по поведению. кроме того что STND и CONS совеместимы, а STNC и CONS нет
  if !purp2 eq 'CONS' and !purp1 neq 'STNC' then
    !pnum = !this.nearestPP(!ref2,!pickPos,split('7 77'))
    conn P6 to P$!pnum of $!ref2

	if !pnum eq 77 then
	  !this.orient( 'P6', !!ce.pdir[6], '!!ce.pdir[3]', !ref2.pdir[3].opposite())
	else
	  !this.orient( 'P6', !!ce.pdir[6], '!!ce.pdir[3]', !ref2.pdir[3] )
	endif	
	
$(
    --определем направления P3 для доворота после коннекта
    !dirCons = !ref2.pdir[3]
    !dirStand = !!ce.pdir[3]
	--крутим в другую сторону
	if !pnum eq 77 then
	  !dirStand = !dirStand.opposite()
	endif
    --определем угол
    !ang = !dirStand.angle(!DirCons)
    --сравниваем направления осуществляем доворот
    if !dirStand.LT(!dirCons) then
      rot thr P6 about U wrt ce by $!ang
    else
      rot thr P6 about U wrt ce by -$!ang
    endif
	$)
  elseif !purp2 eq 'KOD' or !purp2 eq 'UKSH' then
    --запоминаем Z
    !Z = !!ce.pos.up
    --коннектим
    conn P4 to P5 of $!ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
  elseif !purp2 eq 'BRCK' then
    --запоминаем Z
    !Z = !!ce.pos.up
    --коннектим
    conn P3 to P2 of $!Ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
  elseif !purp2 eq 'BRTR' then
    --запоминаем Z
    !Z = !!ce.pos.up
    --коннектим
    conn P9 to P8 of $!Ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
  elseif !purp2 eq 'STLN' then
    conn P6 to P5 of $!Ref2
	
	!this.orient( 'P6', !!ce.pdir[6], '!!ce.pdir[3]', !ref2.pdir[3])
	$(
		--определем направления P3 для доворота после коннекта
    !dirStln = !ref2.pdir[3]
    !dirStand = !!ce.pdir[3]
    --определем угол
    !ang = !dirStand.angle(!DirStln)
    --сравниваем направления осуществляем доворот
    if !dirStand.LT(!dirStln) then
      rot thr P6 about U wrt ce by $!ang
    else
      rot thr P6 about U wrt ce by -$!ang
    endif
	$)
	elseif !purp2 eq 'LNIP' then
	
	!pnum = !this.nearestPP(!ref2,!pickpos,split('8 16'))
	--определяем к какому конце ближе кликнули P16 значит ближе к верху (вдоль стыкуем)
	if !pnum eq 16 then
      conn P6 to P16 of $!Ref2
	  !this.orient( 'P6', !!ce.pdir[6], '!!ce.pdir[3]', !ref2.pdir[3])
	elseif !pnum eq 8 then
	  $p перпендикулярный коннект P8
	  conn P9 to P8 of $!Ref2
	  !this.orient( 'P9', !!ce.pdir[9], '!!ce.pdir[3]', !ref2.pdir[3])
	endif

	
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif
elseif !purp1 eq 'CONS' then
  if !purp2 eq 'STND' then
    --коннектим
    conn P7 to P6 of $!ref2
    --определем направления P3 для доворота после коннекта
    !dirStand = !ref2.pdir[3]
    !dirCons = !!ce.pdir[3]
    
    --определем угол
    !ang = !dirStand.angle(!DirCons)
    --сравниваем направления осуществляем доворот
    if !dirStand.LT(!dirCons) then
      rot thr P7 about U by $!ang
    else
      rot thr P7 about U by -$!ang
    endif
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'KOD' then
  if !purp2 eq 'STND' or !purp2 eq 'STNC' then
    !Z = !!ce.pos.up
    --коннектим
    conn P5 to P4 of $!ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'BRCK' then
  if !purp2 eq 'STND' or !purp2 eq 'STNC' then
    --вариант с восстановлением Z координаты
	$(
    !Z = !!ce.pos.up
    --коннектим
    conn P2 to P3 of $!ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
	$)
	--вариант с "чистым" коннектом
	
	!p3pos = !ref2.ppos[3]
	!tmppos = !p3pos.offset(!ref2.pdir[8],3000)
	

    !line = object line( !p3Pos, !tmppos)
    !onlinepos = !line.near(!PickPos)
    --pin4 at $!onlinepos

    pos $!onlinepos
    --направление перпендикулярно стойке
    !P3dir = !ref2.pdir[3]
    ori Z is U and Y is $!p3dir	
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
--торцевые полки BRTR в серии СН3 и СН5 (BRIP сборные полки подобные по поведению для профиля IPN80)
elseif !purp1 eq 'BRTR' or !purp1 eq 'BRIP' or !purp1 eq 'KSVN' then
  if !purp2 eq 'STND' or !purp2 eq 'STNC' then
    !!setprop(!!CE,'RASP',1)
    --получаем ближайшую из допустимых
	!pnum = !this.nearestPP(!ref2,!pickpos,split('9 99'))
	$p nearest $!pnum

	--вариант с "чистым" коннектом
	!pXpos = !ref2.ppos[!pnum] $* ккодината P точки к которой коннектим
	!tmppos = !pXpos.offset(!ref2.pdir[8],3000) $* временная точка чтобы создать объект line
	--pin1 at $!pxpos
	--pin2 at $!tmppos

    !line = object line( !pXPos, !tmppos)
    !onlinepos = !line.near(!PickPos) $* получили точку на линии к котрой надо коннектиться
	--pin3 at $!pickpos
    --pin4 at $!onlinepos

    pos $!onlinepos
    --направление перпендикулярно стойке
    !PXdir = !ref2.pdir[!pnum]
	!P8ofSTND = !ref2.pdir[8]
    ori Z is U and Y is $!pXdir
	handle any
	  ori Z is $!P8ofSTND and Y is $!pXdir
	endhandle

  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
  elseif !purp1 eq 'LNIP' then
  if !purp2 eq 'STND' or !purp2 eq 'STNC' then
    --получаем ближайшую из допустимых
	!pnum = !this.nearestPP(!ref2,!pickpos,split('8 26 9 19 29 99 89 79'))
	$p nearest $!pnum
	
	--если ближайшей оказалась торцевая точка а не боковая то простой коннект как для STLN
	if !pnum eq 8 or !pnum eq 26 then
	--заменяем 8 на 6 это низ
    if !pnum eq 8 then
	  !pnum = 6
	endif
	--заменяем 26 на 16 это верх 
	if !pnum eq 26 then
	  !pnum = 16
	endif
	$p торец $!pnum
	conn P16 to P$!pnum of $!ref2
	
	!this.orient( 'P8', !!ce.pdir[8], '!!ce.pdir[3]', !ref2.pdir[3])
	
	--иначе как для боковых полок
	else

	--вариант с "чистым" коннектом
	!pXpos = !ref2.ppos[!pnum] $* ккодината P точки к которой коннектим
	!tmppos = !pXpos.offset(!ref2.pdir[8],3000) $* временная точка чтобы создать объект line
	--pin1 at $!pxpos
	--pin2 at $!tmppos

    !line = object line( !pXPos, !tmppos)
    !onlinepos = !line.near(!PickPos) $* получили точку на линии к котрой надо коннектиться
	--pin3 at $!pickpos
    --pin4 at $!onlinepos

    pos $!onlinepos
    --направление перпендикулярно стойке
    !PXdir = !ref2.pdir[!pnum]
	!p8dir = !ref2.pdir[8]
	--случай для соединителя Z в сторону P9 (или 99) а X вдоль стойки (вдоль направления P8)
	ori Z is $!pXdir and X is $!p8dir
	endif
    
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'UKSH' then
  if !purp2 eq 'STND' then
    !Z = !!ce.pos.up
    --коннектим
    conn P5 to P4 of $!ref2
    --восстанавливаем кооринату Z
    !tmppos = !!ce.pos
    !tmppos.up = !Z
    !!ce.pos = !tmppos
	
	$(
	!pnum = 4
	!pXpos = !ref2.ppos[!pnum] $* ккодината P4 точки к которой коннектим
	!tmppos = !pXpos.offset(!ref2.pdir[6],3000) $* временная точка чтобы создать объект line
	--pin1 at $!pxpos
	--pin2 at $!tmppos

    !line = object line( !pXPos, !tmppos)
    !onlinepos = !line.near(!PickPos) $* получили точку на линии к котрой надо коннектиться
	
	pos $!onlinepos
    --направление перпендикулярно стойке
    !PXdir = !ref2.pdir[!pnum]
    ori Z is U and Y is $!pXdir	
	$)
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'RDEN' then
  if !purp2 eq 'ROD' then
    conn P12 to P11 of $!ref2
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'BRRD' then
  if !purp2 eq 'ROD' then
    conn P9 to P10 of $!ref2
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'SPRT' then
  if !purp2 eq 'SPPL' then
    conn P4 to P5 of $!ref2
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
elseif !purp1 eq 'SPPL' then
  if !purp2 eq 'SPRT' then
    conn P5 to P4 of $!ref2
  else 
    !!alert.message('нельзя присоединить ' & !purp1 & ' к типу' & !PURP2)
  endif  
  
else
  !!alert.message('присоединение выбранного элемента типа $!purp1 не поддерживается этой командой')
endif



endmethod