Мне часто приходится привязывать/перепревязывать растры. Сечас появилась встроенная утилита ВЫРОВНЯТЬ, но с макросом работать быстрее, если есть кнопка.
Не очень грамотно, но зато эффективно:
Sub Rastr()
'Привязка растра и блока по двум точкам.
Dim Rst As AcadRasterImage
Dim pR1 As Variant, pR2 As Variant 'òî÷êè íà ðàñòðå
Dim pM1 As Variant, pM2 As Variant 'íà Ìîäåëè ÷åðòåæà
Dim l1 As Double, l2 As Double, ug1 As Double, ug2 As Double
Dim dX As Double, dY As Double, m1 As Double, dUg As Double
Dim SelSet As AcadSelectionSet
Set SelSet = ThisDrawing.ActiveSelectionSet
Dim i As Integer
i = SelSet.Count
If i <> 1 Then Exit Sub
If SelSet.Item(0).ObjectName <> "AcDbRasterImage" Then
MsgBox ("Выбран объект " & SelSet.Item(0).ObjectName & Chr(10) & " Выберите растр для привязки и повторите попытку")
Exit Sub
End If
Set Rst = SelSet.Item(0)
' Return a point using a prompt
pR1 = ThisDrawing.Utility.GetPoint(, "Первая точка на растре: ")
pM1 = ThisDrawing.Utility.GetPoint(, "Первая точка на чертеже: ")
pR2 = ThisDrawing.Utility.GetPoint(, "Первая точка на растре: ")
pM2 = ThisDrawing.Utility.GetPoint(, "Вторая точка на чертеже: ")
'Выбрали 4 точки. Вычислим длины и углы
dX = pR1(0) - pR2(0)
dY = pR1(1) - pR2(1)
l1 = Sqr(dX * dX + dY * dY)
ug1 = Atn(dY / dX)
dX = pM1(0) - pM2(0)
dY = pM1(1) - pM2(1)
l2 = Sqr(dX * dX + dY * dY)
If dX <> 0 Then
ug2 = Atn(dY / dX)
Else
ug2 = 1.5707963267949
End If
m1 = l1 / l2
dUg = ug1 - ug2
Rst.ScaleFactor = Rst.ScaleFactor / m1
Rst.Rotation = Rst.Rotation - dUg
pM2 = Rst.Origin
Dim p(0 To 2) As Double
dX = pM2(0) - pR1(0)
dY = pM2(1) - pR1(1)
ug1 = Atn(dY / dX)
ug1 = ug1 - dUg
l1 = Sqr(dX * dX + dY * dY)
l1 = l1 / m1 '163.28
dY = l1 * Sin(ug1)
dX = l1 * Cos(ug1)
p(0) = pM1(0) - dX
p(1) = pM1(1) - dY
Rst.Origin = p
End Sub