procedure TAlgWin.SVG2;
var Mass,Prog,Chisl,Objs,Atrs: TStringList;
LD: TList;
I,J,N,N1,N2,Code,LV,K: integer;
OB: TObj;
PN,PNN: TNames;
PTS: TStroka;
XMin,XMax,YMin,YMax,Value: real;
S,SS,S1,S2,S3,SZ,SL: string;
label 1;
begin
if SVGOUT_Dlg.RadioButton2.Checked then
BEGIN
Mass:=TStringList.Create;
Prog:=TStringList.Create;
Chisl:=TStringList.Create;
Objs:=TStringList.Create;
Atrs:=TStringList.Create;
Mass.Add('<HTML>');
Mass.Add('');
Mass.Add('<HEAD>');
Mass.Add('<script src="abc.js"></script>');
Mass.Add('</HEAD>');
Mass.Add('<BODY>');
Mass.Add('<SCRIPT>');
Mass.Add(' var NS="http://www.w3.org/2000/svg";');
Mass.Add('');
Mass.Add(' var SVG=function(h,w)');
Mass.Add(' {');
Mass.Add(' var svg=document.createElementNS(NS,"svg");');
Mass.Add(' svg.width=w;');
Mass.Add(' svg.height=h;');
Mass.Add(' return svg;');
Mass.Add(' }');
Mass.Add('');
Mass.Add(' var svg=SVG('+IntToStr(PaintBox1.Width)+','+IntToStr(PaintBox1.Height)+');');
Mass.Add(' var SCR=InitSCR(0,0,'+IntToStr(PaintBox1.Width)+','+IntToStr(PaintBox1.Height)+');');
Mass.Add(' svg.setAttribute("viewBox","'+IntToStr(Trunc (SCR.FXMin))+' '+IntToStr(Trunc(SCR.FYMax))+' '+IntToStr(Trunc(SCR.FXMax-SCR.FXMin))+' '+IntToStr(Trunc(SCR.FYMin-SCR.FYMax))+'");');
Mass.Add(' document.body.appendChild(svg);');
Mass.Add('');
Mass.Add(' var rect=function(h,w,fill)');
Mass.Add(' {');
Mass.Add(' var SVGObj= document.createElementNS(NS,"rect");');
Mass.Add(' SVGObj.width.baseVal.value=w;');
Mass.Add(' SVGObj.height.baseVal.value=h;');
Mass.Add(' SVGObj.setAttribute("height",h);');
Mass.Add(' SVGObj.style.fill=fill;');
Mass.Add(' return SVGObj;');
Mass.Add(' }');
Mass.Add('');
Prog.Add('do {');
Prog.Add(' var N=false;');
Objs.Add(' var arr = new Array();');
for I := 0 to Alg.Prog.Count - 1 do
begin
PTS:=Alg.Prog[I];
// формируем название функции
S:='';
S1:=PTS.FUN;
S3:='';
N1:=PTS.GetNParam(PTS.LText);
for J := 1 to N1 do
begin
S2:=PTS.GetText(PTS.LText,J);
S3:=S3+'('+S2+'.OB == undefined)';
if J<N1 then S3:=S3+' && ';
end;
if N1>1 then S3:='('+S3+')';
S:=S+'if '+S3+' N=EExec'+S1+'(';
// формируем список выходных параметров
N1:=PTS.GetNParam(PTS.LText);
SS:='';
for J := 1 to N1 do
begin
S2:=PTS.GetText(PTS.LText,J);
Objs.Add(' var '+S2+'=new Object();');
Objs.Add(' arr.push('+S2+');');
// формирование значений атрибутов
PNN:=Alg.GetPnByName(S2);
LV:=PNN.FAtt.Lv;
SZ:='Lv:'+IntToStr(Lv);
SL:='';
for K := 0 to PNN.FAtt.Layers.Count - 1 do
begin
SL:=SL+'"'+TLayer(PNN.FAtt.Layers[K]).Name+'"';
if K<PNN.FAtt.Layers.Count - 1 then SL:=SL+', ';
end;
Atrs.Add(' var Att_'+S2+'={'+SZ+', lay:['+SL+']};');
if J<N1 then SS:=SS+S2+',' else SS:=SS+S2;
end;
S:=S+SS+',';
// формируем список входных параметров
N2:=PTS.GetNParam(PTS.RText);
SS:='';
for J := 1 to N2 do
begin
S2:=PTS.GetText(PTS.RText,J);
// отделение чисел var Ch1={C:{Re:0,Im:0}}
Val(S2,Value,Code);
if Code=0 then
begin
S2:='Chisl'+IntToStr(Chisl.Count+1);
S3:=' var '+S2+'={C:{Re:'+FloatToStr(Value)+',Im:0},OB:"C"};';
Chisl.Add(S3);
end;
if S2[1]='-' then Delete(S2,1,1);
if J<N2 then SS:=SS+S2+',' else SS:=SS+S2;
end;
S:=S+SS+',';
SS:='';
for J := 1 to N1 do
begin
S2:=PTS.GetText(PTS.LText,J);
SS:=SS+'Att_'+S2+',';
end;
for J := 1 to N2 do
begin
S2:=PTS.GetText(PTS.RText,J);
SZ:='1';
Val(S2,Value,Code);
if Code<>0 then if S2[1]='-' then SZ:='-1';
if J<N2 then SS:=SS+SZ+',' else SS:=SS+SZ;
end;
S:=S+SS+');';
Prog.Add(' '+S);
end;
Prog.Add('} while (N==true);');
for J := 0 to Objs.Count - 1 do Mass.Add(Objs[J]);
Mass.Add('');
for J := 0 to Atrs.Count - 1 do Mass.Add(Atrs[J]);
Mass.Add('');
for J := 0 to Chisl.Count - 1 do Mass.Add(Chisl[J]);
Mass.Add('');
for J := 0 to Prog.Count - 1 do Mass.Add(Prog[J]);
Mass.Add(' draw(arr);');
Mass.Add('');
Mass.Add('</SCRIPT>');
Mass.Add('</BODY>');
Mass.Add('</HTML>');
SVGOUT_Dlg.Memo1.Clear;
for I := 0 to Mass.Count - 1 do SVGOUT_Dlg.Memo1.Lines.Add(Mass[I]);
SVGOUT_Dlg.Show;
Atrs.Free;
Objs.Free;
Chisl.Free;
Prog.Free;
Mass.Free;
END;
end; // TAlgWin.SVG2
Транслятор формирует текст программы на языке HTML, которая может быть загружена и исполнена в любом браузере, поддерживающем SVG. Во время работы полученная программа обращается к библиотеке функций abc.js, которая должна размещаться в том же каталоге, что и основной файл HTML.
Представленная процедура встроена в систему конвертации алгоритмов системы Симплекса в HTML и JavaScript представления для публикации геометрической информации в сети Интернет. Такие представления позволяют не только проиллюстрировать результат выполнения геометрических построений, но и предоставить пользователю возможность активного взаимодействия с алгоритмом через его изображения с целью изучения его свойств. Функции интерактивного взаимодействия в настоящее время находятся в отладке.
Файл на языке HTML может быть сгенерирован автоматически при помощи системы Симплекс. Для генерации HTML файла необходимо вызвать команду Файл > Трансляция в > SVG (Alt+F1). Обращение к команде приведет к появлению на экране служебного окна, предназначенного для конвертации алгоритма в HTML файл.
При работе в режиме Программа в окне редактора автоматически формируется текст скрипта, который позволяет вывести в экране браузера изображение построения. выполняемого транслируемым алгоритмом, в формате SVG-графики. При нажатии на кнопку Save текст будет сохранен в файл с именем, соответствующим названию проекта, расширением html. Нажатие на кнопку Copy позволяет скопировать сгенерированный текст в буфер Clipboard. Из Clipboard этот текст можно поместить в текстовый редактор, например, Notepad, где его можно редактировать вручную и адаптировать программу под конкретные цели.
Опция Данные предназначена для преобразования значений полученных в результате алгоритмов объектов в формат SVG. Сгенерированный HTML файл будет содержать статичную геометрическую информацию о построении, предназначенную только для отображения чертежа в браузере. Взаимодействие объектов, как компонентов единой геометрической модели, в данном формате невозможно.