Alexander писал(а):
В прилагаемом примере у меня все работает, создаю свои задачки - не работает.
От, підшаманив трохи. Працює незалежно від десяткового розділювача. Біда була втому, що в коді розумілось: ліва сторона прямокутника має Y менше 1 000 000, у Вас більше. Тоді в скрипті, припустим
$Left=10 000 000, тоді все працює "на ура"
Код:
$C=@Map.SelCount
@If $C<>3 @Break Нужно пометить прямоугольник и 2 точки, к которым требуется переместить прямоугольник
;
;получаем индексы прямоугольника и 2-х точек
$N=1
$Rect=0
$Pnt1=0
$Pnt2=0
%Start1
$C=@Map.Object[$N].Count
@If ($C=5) and ($Rect=0) then $Rect=$N
@If ($C=1) and ($Pnt1=0) then $Pnt1=$N
@If ($C=1) and ($Pnt2=0) and ($Pnt1<>$N) then $Pnt2=$N
$N=@Map.NextSelected $N
@If $N>0 @Goto %Start1
@If ($Rect=0) or ($Pnt1=0) or ($Pnt2=0) then @Break Среди помеченных не найдены прямоугольник либо точки
;
$Separator=@DecimalSeparator
;находим верхнюю и левую границы прямоугольника
;в карте не должно быть отрицательных координат!
$Top=0
$Left=10000000
$N=1
%Start2
$P=@Map.Object[$Rect].Point[$N]
$X=@StringPart 1 $P
@If $Separator=, then $X=@Calc Replace("$X",",",".",1)
$X=@DequoteText $X
$Y=@StringPart 2 $P
@If $Separator=, then $Y=@Calc Replace("$Y",",",".",1)
$Y=@DequoteText $Y
@If $X>$Top then $Top=$X
@If $Y<$Left then $Left=$Y
$N=$N+1
@If $N<5 @Goto %Start2
;
;определяем какая точка выше
$P1=@Map.Object[$Pnt1].Point[1]
$X1=@StringPart 1 $P1
@If $Separator=, then $X1=@Calc Replace("$X1",",",".",1)
$X1=@DequoteText $X1
;
$Y1=@StringPart 2 $P1
@If $Separator=, then $Y1=@Calc Replace("$Y1",",",".",1)
$Y1=@DequoteText $Y1
$P2=@Map.Object[$Pnt2].Point[1]
$X2=@StringPart 1 $P2
@If $Separator=, then $X2=@Calc Replace("$X2",",",".",1)
$X2=@DequoteText $X2
$Y2=@StringPart 2 $P2
@If $Separator=, then $Y2=@Calc Replace("$Y2",",",".",1)
$Y2=@DequoteText $Y2
;
;находим векторы перемещения прямоугольника по X и по Y
;если первая точка выше
@If $X1>=$X2 then $VX=$X1-$Top
@If $X1>=$X2 then $VY=$Left-$Y2
;если вторая точка выше
@If $X1<$X2 then $VX=$X2-$Top
@If $X1<$X2 then $VY=$Left-$Y1
;
;перемещаем прямоугольник
@Map.Undo.StartOperationGroup
$N=1
%Start3
$P=@Map.Object[$Rect].Point[$N]
$X=@StringPart 1 $P
@If $Separator=, then $X=@Calc Replace("$X",",",".",1)
$X=@DequoteText $X
$Y=@StringPart 2 $P
@If $Separator=, then $Y=@Calc Replace("$Y",",",".",1)
$Y=@DequoteText $Y
$Z=@StringPart 3 $P
$X=$X+$VX
@If $Separator=, then $X=@Calc Replace("$X",".",",",1)
$X=@DequoteText $X
$Y=$Y-$VY
@If $Separator=, then $Y=@Calc Replace("$Y",".",",",1)
$Y=@DequoteText $Y
@Map.Object[$Rect].Point[$N] $X $Y $Z
$N=$N+1
@If $N<=5 @Goto %Start3
@Map.RefreshObject $Rect
@Window.Refresh