Андрей Семин
Постоянный посетитель

Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
12.01.2012 20:11:29
|
Рабинович - это программный комплекс КАСКАД-НТ
cascade-nt.ru
Штука неплохая, но весьма и весьма специфическая.
В условиях быстро меняющейся обстановки и постоянно меняющихся режимных задач не могу рекомендовать кому бы то ни было использование кАСКАДа. Для него нужно достаточно долго накатывать колею, чтобы он потом быстро ездил
|
|
|
Евгений Машалов
Администратор

Всего сообщений: 990
Дата регистрации: 23.04.2007
|
Создано:
12.01.2012 21:07:47
|
Спасибо
|
|
|
Федор Шарутин
Посетитель
Всего сообщений: 22
Дата регистрации: 18.04.2008
|
Создано:
05.03.2012 12:05:27
|
Цитата |
---|
Евгений Машалов пишет:
Колоссальный респект !
Наверное имеет смысл нам это в хардкоде реализовать, если Вы не возражаете ? |
Нет еще реализации в Растре алгоритма, предложенного Андреем? Я что то не нашел. По результату судя для небольших кусков макрос для меня вполне приемлим в Растре, но честно не хочется залазить в шаблоны для организации новых полей. Может стоит подождать если "прикрутка" в основной модуль Растра не за горами?
|
|
|
Андрей Семин
Постоянный посетитель

Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
13.03.2012 19:42:56
|
 |
Добрый день Федор Валентинович !
Выкладываю макрос с которым не надо копаться в шаблонах.
Еще добавил учет длины линии пропорционально сопротивлению.
Dim grad_x()
Dim grad_y()
Dim LO()
create_graph_cxema
sub create_graph_cxema
' Настроечные парметры. Играясь с ними можно добится разного эффекта
'l0=5 'условная длини линии
G=5 ' коэффициент жесткости линни
kq=50 ' коэффициет характеризующий силу взаимного отталкивания узлов
set node=Rastr.Tables("node")
set vetv=Rastr.Tables("vetv")
set gnode=Rastr.Tables("graph_node")
set gvetv=Rastr.Tables("graph_vetv")
Redim grad_x(node.count)
Redim grad_y(node.count)
Redim L0(vetv.count)
init l0 ' процедура задания начального приближения координат узлов
for k=1 to 1000 ' Число итераций
CalcGrad l0,G,KQ
norma=0
for i=0 to node.size-1
norma=norma+grad_x(i)*grad_x(i)+grad_y(i)*grad_y(i)
next
norma=sqr(norma)
for i=0 to node.size-1
gnode.Cols("k_x").z(i)=gnode.Cols("k_x").z(i)+grad_x(i)/norma
gnode.Cols("k_y").z(i)=gnode.Cols("k_y").z(i)+grad_y(i)/norma
next
Rastr.PrintP k
next
end sub
sub CalcGrad(l0,g,kq)
set node=Rastr.Tables("node")
set vetv=Rastr.Tables("vetv")
set gnode=Rastr.Tables("graph_node")
set gvetv=Rastr.Tables("graph_vetv")
NN=node.size
for i1=0 to NN-1
grad_x(i1)=0
grad_y(i1)=0
next
for i1=0 to NN-1
x=gnode.Cols("k_x").z(i1)
y=gnode.Cols("k_y").z(i1)
for j1=0 to NN-1
xj=gnode.Cols("k_x").z(j1)
yj=gnode.Cols("k_y").z(j1)
if (i1<>j1) then
l=sqr((x-xj)*(x-xj)+(y-yj)*(y-yj))
if l<>0 then
grad_x(i1)=grad_x(i1)+kq*kq*(x-xj)/(l*l*l)
grad_y(i1)=grad_y(i1)+kq*kq*(y-yj)/(l*l*l)
end if
end if
next
next
for i2=0 to NN-1
vetv.setsel("ip="&node.Cols("ny").zs(i2)&"|iq="&node.Cols("ny").zs(i2))
kk=vetv.findnextsel(-1)
xx=gnode.Cols("k_x").z(i2)
yy=gnode.Cols("k_y").z(i2)
while kk<>(-1)
if (vetv.Cols("ip").z(kk)=node.Cols("ny").z(i2)) then
node.setsel("ny="&vetv.Cols("iq").z(kk))
xkk=gnode.cols("k_x").z(node.findnextsel(-1))
ykk=gnode.cols("k_y").z(node.findnextsel(-1))
end if
if (vetv.Cols("iq").z(kk)=node.Cols("ny").z(i2)) then
node.setsel("ny="&vetv.Cols("ip").z(kk))
xkk=gnode.cols("k_x").z(node.findnextsel(-1))
ykk=gnode.cols("k_y").z(node.findnextsel(-1))
end if
l=(xkk-xx)*(xkk-xx)+(ykk-yy)*(ykk-yy)
l=sqr(l)
grad_x(i2)=grad_x(i2)+(xkk-xx)*g*(l-l0(kk))/l
grad_y(i2)=grad_y(i2)+(ykk-yy)*g*(l-l0(kk))/l
kk=vetv.findnextsel(kk)
wend
next
end sub
sub init(l0)
set node=Rastr.Tables("node")
set vetv=Rastr.Tables("vetv")
set gnode=Rastr.Tables("graph_node")
set gvetv=Rastr.Tables("graph_vetv")
gnode.cols("k_x").Prop(1)= 1
gnode.cols("k_y").Prop(1)= 1
gnode.DelRows
for i=0 to node.count-1
gnode.AddRow
gnode.Cols("ny").z(gnode.size-1)=node.cols("ny").z(i)
gnode.Cols("k_x").z(gnode.size-1)=100*rnd
gnode.Cols("k_y").z(gnode.size-1)=100*rnd
gnode.Cols("viz").z(gnode.size-1)=1
next
gvetv.DelRows
for i=0 to vetv.count-1
gvetv.AddRow
gvetv.Cols("ip").z(gvetv.size-1)=vetv.Cols("ip").z(i)
gvetv.Cols("iq").z(gvetv.size-1)=vetv.Cols("iq").z(i)
l0(i)=vetv.Cols("x").z(i)/5
next
end sub
|
|
|
Александр Александров
Администратор
Всего сообщений: 597
Дата регистрации: 31.05.2008
|
Создано:
05.04.2012 16:38:33
|
Выложил свои наработки по вопросу создания графа сети из режимной информации. Скрипт использует
сободное программное обеспечение Graphviz. Максимальная переработанная схема содержала более 3000 узлов.
Ссылка
|
|
|
Андрей Семин
Постоянный посетитель

Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
07.04.2012 16:01:05
|
В принципе штука весьма достойная. Но не совсем понял как эту схему затащить в Rastr ?
|
|
|
Александр Александров
Администратор
Всего сообщений: 597
Дата регистрации: 31.05.2008
|
Создано:
07.04.2012 23:30:34
|
Скрипт работает следующим образом:
1) Пробегаем список узлов и ветвей загруженных в Растр и пишем текстовый файл с их описанием для Graphviz.
2) Запускаем один из многочисленных модулей построения графа Graphviz. На выходе он пишет текстовый файл с описанием изображения графа.
3) Читаем полученное изображения графа в Растр.
Так что схема затаскивается сама
|
|
|
Федор Шарутин
Посетитель
Всего сообщений: 22
Дата регистрации: 18.04.2008
|
Создано:
31.10.2013 13:11:47
|
Цитата |
---|
Скрипт работает следующим образом:
1) Пробегаем список узлов и ветвей загруженных в Растр и пишем текстовый файл с их описанием для Graphviz.
2) Запускаем один из многочисленных модулей построения графа Graphviz. На выходе он пишет текстовый файл с описанием изображения графа.
3) Читаем полученное изображения графа в Растр.
Так что схема затаскивается сама |
То есть, если полученный текстовый файл соответсвет по внутреннему представлению файлу гарфики растра с расширением "grf"?
И достаточно подменить расшиерение "txt" на "grf" изатащить полученную макросом графику в Растр через его интерфейс "загрузить"?
|
|
|
Александр Александров
Администратор
Всего сообщений: 597
Дата регистрации: 31.05.2008
|
Создано:
31.10.2013 13:49:27
|
Цитата |
---|
?То есть, если созданный макросом текстовый файл соответствует по внутреннему представлению файлу графики Растра с расширением "grf"?? |
- нет, только расположение узлов, не передаются изломы, оринтация шин и тд.
Более продвинутый макрос работы с графикой Растр
http://www.rastrwin.ru/macro/grf2svg.php
Цитата |
---|
?И достаточно подменить расширение "txt" на "grf" и затащить полученную макросом графику в Растр через его интерфейс "загрузить"?? |
- расположение узлов получится загрузить.
|
|
|