Last active
July 10, 2024 22:47
-
-
Save mashalov/4fce5bffb7224c21b5f735bb42c6cbee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'список районов на эквивалентирование | |
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