Skip to content

Instantly share code, notes, and snippets.

@mashalov
Last active July 10, 2024 22:47
Show Gist options
  • Save mashalov/4fce5bffb7224c21b5f735bb42c6cbee to your computer and use it in GitHub Desktop.
Save mashalov/4fce5bffb7224c21b5f735bb42c6cbee to your computer and use it in GitHub Desktop.
'список районов на эквивалентирование
AreasToReduce = "1,4,7"
Set nodes = Rastr.Tables("node")
Set nodeId = nodes.Cols("ny")
Set nodeArea = nodes.Cols("na")
' карта номеров узлов к индексам
Set nodeMap = CreateObject("Scripting.Dictionary")
' сет районов на эквивалентирование
Set areaMap = CreateObject("Scripting.Dictionary")
' индексируем узлы
for x = 0 to nodes.Size - 1
nodeMap.Add nodeId.Z(x), x
next
' заселяем сет районов
for each area in split(AreasToReduce,",")
areaMap.Add CInt(area), 0
next
Set sel = nodes.Cols("sel")
' дропаем отметки всех узлов
sel.Calc 0
' проходим по списку районов на эквивалентирование
for each area in areaMap
' отмечаем узлы, отнесенные к району на эквивалентирование
nodes.SetSel "na="& area
sel.Calc 1
next
' теперь сбрасываем отметки у пограничных узлов районов
' определяем их по наличию хотя бы одной линии, уходящей
' в неэквивалентируемый район
Set branches = Rastr.Tables("vetv")
Set ip = branches.Cols("ip")
Set iq = branches.Cols("iq")
' проходим по ветвям
for x = 0 to branches.Size - 1
' получаем индексы узлов ветви
ipX = nodeMap.Item(ip.Z(x))
iqX = nodeMap.Item(iq.Z(x))
' получаем номера районов между которыми ветвь
iparea = nodeArea.Z(ipX)
iqarea = nodeArea.Z(iqX)
' если ветвь между разными районами
if iparea <> iqarea Then
' снимаем отметки с пограничных узлов
' проверяя попадают ли они в эквивалентируемые районы
' и не эквивалентируемые районы
' по прямому и обратному направлению ветви
UnselectBoundaryNode ipx, iqarea
UnselectBoundaryNode iqx, iparea
End If
next
' снять отметку с узла, если он входит в эквивалентируемый
' район, но является пограничным
' nodeIndex - индекс узла
' iqArea - номер района другого узла ветви
Sub UnselectBoundaryNode(nodeIndex, iqArea)
' если узел отмечен (то есть он в эквивалентируемом районе)
' и ветвь от него уходит в неэквивалентируемый район - узел пограничный
if sel.Z(nodeIndex) and not areamap.Exists(iqArea) Then
Rastr.PrintP "Пограничный узел " & nodeId.Z(nodeIndex) & " - районы " & nodeArea.Z(nodeIndex) & " и " & iqArea
' и мы снимаем с него отметку
sel.Z(nodeIndex) = 0
End If
End Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment