'скрипт использует бесплатное ПО Graphviz 'дистрибутив для виндовс скачан 'http://www.graphviz.org/Download_windows.php r=setlocale("ru") ' g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\dot.exe" ' g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\circo.exe" 'large pechen g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\sfdp.exe" 'derevo g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\neato.exe" 'small pechen g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\fdp.exe" 'ploho g_Path_To_DOT = "C:\projects\KZ\Invest\Graf\Graphviz 2.28\bin\twopi.exe" 'путь к одному из модулей рисования графов Graphviz g_Path_To_DOT = "C:\projects\GrafViz\Graphviz 2.34\bin\sfdp.exe" 'g_Path_To_DOT = "C:\projects\GrafViz\Graphviz 2.28\bin\sfdp.exe" g_Graf_Out_File = "C:\projects\out_grf.gv" ' файл в формате Graphviz из узлов и ветвей для построения графа g_Graf_Out_Type = "-Tpng" ' вывести получившийся граф в PNG формате g_Graf_Out = "C:\projects\res4.png" ' то самый файл в PNG формате g_Graf_Out_TXT = "C:\projects\res4.txt" ' граф полученный Graphviz в виде текста g_SCALE = 5 ' на столько поделить координаты Graphviz '///////////////////////////////////////////////////////////////////////////////////////////////////////////////// main SUB main WriteCurrentSchemToDotGraph g_Graf_Out_File RunDot g_Graf_Out_File GetGraf g_Graf_Out_TXT printf "Ok" END SUB 'записать информацию из узлов и ветвей в текстовы файл понятный graphviz SUB WriteCurrentSchemToDotGraph( Graf_Out_File ) SET fso = CreateObject("Scripting.FileSystemObject") SET f = fso.CreateTextFile( Graf_Out_File, true) SET Table_node = Rastr.Tables("node") SET node_Col_ny = Table_node.Cols("ny") SET node_Col_uhom = Table_node.Cols("uhom") SET Table_vetv = Rastr.Tables("vetv") SET vetv_Col_ip = Table_vetv.Cols("ip") SET vetv_Col_iq = Table_vetv.Cols("iq") SET vetv_Col_np = Table_vetv.Cols("np") str = "digraph pvn {" : f.writeLine str str = " ordering = out " : f.writeLine str str = " splines = line " : f.writeLine str ' str = " splines = ortho ": f.writeLine str str = " nodesep = 20 " : f.writeLine str str = " ranksep = 30 " : f.writeLine str 'Table_node.SetSel("uhom>200") Table_node.SetSel("ny>0") CurrentRow_node = Table_node.FindNextSEl( -1 ) WHILE( CurrentRow_node <> -1 ) ny = node_Col_ny.Z( CurrentRow_node ) ' str = "node_"+CSTR( ny ) +"[" +" shape=circle "+ " "" "+ CSTR(ny)+" "" ]" str = "node_"+CSTR( ny ) +"[" +" shape=circle "+ " ]" f.writeLine(str) IF( CurrentRow_node < 10) THEN 'printf "ny-> "+ CSTR(ny) printf str END IF CurrentRow_node = Table_node.FindNextSEl( CurrentRow_node ) WEND 'Table_vetv.SetSel("(ip.uhom>200)&(iq.uhom>200)") Table_vetv.SetSel("ip>0") CurrentRow_vetv = Table_vetv.FindNextSel( -1 ) WHILE( CurrentRow_vetv <> -1 ) ip = vetv_Col_ip.Z( CurrentRow_vetv ) iq = vetv_Col_iq.Z( CurrentRow_vetv ) np = vetv_Col_np.Z( CurrentRow_vetv ) str = "node_"+CSTR( ip ) +" -> "+ "node_"+CSTR( iq ) f.writeLine(str) CurrentRow_vetv = Table_vetv.FindNextSel( CurrentRow_vetv ) WEND str = "}" f.writeLine str f.close printf "Write grapf OK" END SUB 'запустить утилиту построения графа по записанным узлам и ветвям SUB RunDot( ForFile ) SET Shell = CreateObject("WScript.Shell") str = g_Path_To_DOT +" -o"+g_Graf_Out_TXT +" "+ ForFile SET oExec = Shell.Exec( str ) printf "Exec-> "+ CSTR(str) Do While oExec.Status = 0 Sleep 100 Loop printf "Ок" str = g_Path_To_DOT +" -o"+g_Graf_Out+ " "+g_Graf_Out_Type+ " "+ForFile SET oExec = Shell.Exec( str ) printf "Exec-> "+ CSTR(str) Do While oExec.Status = 0 Sleep 100 Loop printf "DOT Ok" END SUB 'извлечь полученный граф из текстового файла graphviz SUB GetGraf( Path2File ) Rastr.LockEvent= TRUE SET Table_graph_node = Rastr.Tables( "graph_node" ) SET graph_node_Col_ny = Table_graph_node.Cols("ny") SET graph_node_Col_k_x = Table_graph_node.Cols("k_x") SET graph_node_Col_k_y = Table_graph_node.Cols("k_y") SET graph_node_Col_npri = Table_graph_node.Cols("npri") SET graph_node_Col_viz = Table_graph_node.Cols("viz") SET graph_node_Col_wid = Table_graph_node.Cols("wid") Table_graph_node.Size = 0 CurrentRow_graph_node = 0 CONST ForReading = 1, ForWriting = 2 SET fso = CreateObject("Scripting.FileSystemObject") SET File = FSO.GetFile( Path2File ) CONST str_node = "node_" CONST str_strlk = " -> " CONST NOT_FOUND = 0 Set TextStream = File.OpenAsTextStream( ForReading ) Counter = 0 DO WHILE Not TextStream.AtEndOfStream str = TextStream.ReadLine IF( InStr( 1, str, str_node, 1 ) <> NOT_FOUND ) THEN nRes = GetNodeNum( ny, str ) 'printf "ny->"+CSTR(ny) END IF IF( InStr( 1, str, str_strlk, 1 ) = NOT_FOUND AND (InStr( 1, str, "pos=", 1 ) <> NOT_FOUND) ) THEN StrVal = GetVal( "pos=", str ) X = 0 Y = 0 nRes = GetXY( X, Y, StrVal ) IF( nRes > 0 ) THEN IF( Counter < 100 ) THEN printf "["+CSTR(ny)+ "]"+ " [ " + CSTR(X)+ " : "+ CSTR(Y) + " ]" + " from string-> ["+ CSTR(StrVal) + "]" Counter = Counter + 1 END IF Table_graph_node.AddRow graph_node_Col_ny.Z(CurrentRow_graph_node) = ny graph_node_Col_k_x.Z(CurrentRow_graph_node) = X/g_SCALE graph_node_Col_k_y.Z(CurrentRow_graph_node) = Y/g_SCALE graph_node_Col_npri.Z(CurrentRow_graph_node) = 1 graph_node_Col_viz.Z(CurrentRow_graph_node) = 1 graph_node_Col_wid.Z(CurrentRow_graph_node) = 1 CurrentRow_graph_node = CurrentRow_graph_node +1 ELSE printf "ERROR can't get coordinats!" END IF END IF ' IF( InStr( 1, str, str_strlk, 1 ) = NOT_FOUND ) THEN ' 'printf "ND-> "+ str ' ny = 0 ' nRes = GetNodeNum( ny, str ) ' IF( nRes > 0 ) THEN ' StrVal = GetVal( "pos=", str ) ' X = 0 ' Y = 0 ' nRes = GetXY( X, Y, StrVal ) ' IF( nRes > 0 ) THEN ' IF( Counter < 100 ) THEN ' printf "["+CSTR(ny)+ "]"+ " [ " + CSTR(X)+ " : "+ CSTR(Y) + " ]" + " from string-> ["+ CSTR(StrVal) + "]" ' Counter = Counter + 1 ' END IF ' Table_graph_node.AddRow ' graph_node_Col_ny.Z(CurrentRow_graph_node) = ny ' graph_node_Col_k_x.Z(CurrentRow_graph_node) = X/g_SCALE ' graph_node_Col_k_y.Z(CurrentRow_graph_node) = Y/g_SCALE ' graph_node_Col_npri.Z(CurrentRow_graph_node) = 1 ' graph_node_Col_viz.Z(CurrentRow_graph_node) = 1 ' graph_node_Col_wid.Z(CurrentRow_graph_node) = 1 ' CurrentRow_graph_node = CurrentRow_graph_node +1 ' ELSE ' printf "ERROR can't get coordinats!" ' END IF ' ELSE ' printf "ERROR can't get NodeNum!" ' END IF ' ELSE ' 'printf "strlka-> "+ str ' END IF ' END IF LOOP ' Do While Not TextStream.AtEndOfStream ' str = TextStream.ReadLine ' IF( InStr( 1, str, str_node, 1 ) <> NOT_FOUND ) THEN ' IF( InStr( 1, str, str_strlk, 1 ) = NOT_FOUND ) THEN ' 'printf "ND-> "+ str ' ny = 0 ' nRes = GetNodeNum( ny, str ) ' IF( nRes > 0 ) THEN ' StrVal = GetVal( "pos=", str ) ' X = 0 ' Y = 0 ' nRes = GetXY( X, Y, StrVal ) ' IF( nRes > 0 ) THEN ' IF( Counter < 100 ) THEN ' printf "["+CSTR(ny)+ "]"+ " [ " + CSTR(X)+ " : "+ CSTR(Y) + " ]" + " from string-> ["+ CSTR(StrVal) + "]" ' Counter = Counter + 1 ' END IF ' Table_graph_node.AddRow ' graph_node_Col_ny.Z(CurrentRow_graph_node) = ny ' graph_node_Col_k_x.Z(CurrentRow_graph_node) = X/g_SCALE ' graph_node_Col_k_y.Z(CurrentRow_graph_node) = Y/g_SCALE ' graph_node_Col_npri.Z(CurrentRow_graph_node) = 1 ' graph_node_Col_viz.Z(CurrentRow_graph_node) = 1 ' graph_node_Col_wid.Z(CurrentRow_graph_node) = 1 ' CurrentRow_graph_node = CurrentRow_graph_node +1 ' ELSE ' printf "ERROR can't get coordinats!" ' END IF ' ELSE ' printf "ERROR can't get NodeNum!" ' END IF ' ELSE ' 'printf "strlka-> "+ str ' END IF ' END IF ' Loop TextStream.Close SET regEx = New RegExp ' Create regular expression. regEx.Pattern = patrn ' Set pattern. regEx.IgnoreCase = True ' Set case insensitivity. regEx.Global = True ' Set global applicability. Set Matches = regEx.Execute( FileText ) ' Execute search. For Each Match in Matches ' Iterate Matches collection. RetStr = RetStr & "Match found at position " RetStr = RetStr & Match.FirstIndex & ". Match Value is '" RetStr = RetStr & Match.Value & "'." & vbCRLF Next RegExpTest = RetStr printf "OK GetGraf" Rastr.LockEvent= FALSE END SUB 'выделитьномер узла в текстовом файле graphviz FUNCTION GetNodeNum( ByRef NodeNum, str ) GetNodeNum = -1 const NOT_FOUND = 0 const strPatern = "node_" Pos = InStr( 1, str, strPatern , 1 ) IF( Pos = NOT_FOUND ) THEN EXIT FUNCTION END IF PosBeg = Pos+ LEN( strPatern ) Pos = InStr( PosBeg, str, " ", 1 ) IF( Pos = NOT_FOUND ) THEN EXIT FUNCTION END IF PosEnd = Pos StrVal = Mid( str, PosBeg, PosEnd-PosBeg ) IF( IsNumeric( StrVal ) = FALSE ) THEN : EXIT FUNCTION : END IF NodeNum = CLNG( StrVal ) GetNodeNum = 1 END FUNCTION 'замена точки на запятую для корректного преобразования координат из строки в число в соответствии с русской локалью FUNCTION GetXY( ByRef X, ByRef Y, str ) GetXY = -1 CONST NOT_FOUND = 0 Pos = InStr( 1, str, ",", 1 ) IF( Pos = NOT_FOUND ) THEN : EXIT FUNCTION : END IF StrX = Left(str, Pos-1) StrY = Right(str, LEN(str)- Pos) StrX = Replace( StrX, ".", "," ) StrY = Replace( StrY, ".", "," ) IF( IsNumeric( StrX ) = FALSE ) THEN : EXIT FUNCTION : END IF IF( IsNumeric( StrY ) = FALSE ) THEN : EXIT FUNCTION : END IF X = CLNG( StrX ) Y = CLNG( StrY ) GetXY = 1 END FUNCTION 'поиск строки в кавычках FUNCTION GetVal( strPar, str ) GetVal = "NO" CONST NOT_FOUND = 0 Pos = InStr( 1, str, strPar, 1 ) IF( Pos = NOT_FOUND ) THEN EXIT FUNCTION END IF PosBegin = Pos + LEN(strPar)+ 1 ' " -1 quot Pos = InStr( PosBegin, str, """", 1 ) IF( Pos = NOT_FOUND ) THEN EXIT FUNCTION END IF PosEnd = Pos ' -2 quot Val = Mid( str, PosBegin, PosEnd-PosBegin ) GetVal = Val END FUNCTION SUB printf( TexT ) Rastr.PrintP CSTR(TexT) END SUB