diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 11a37b195..8654919e8 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "5"; public const string Build = "0"; - public const string Revision = "2196"; + public const string Revision = "2197"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index b350b868c..3d9f9c8b5 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=2196 %MINOR%=5 +%REVISION%=2197 +%COREVERSION%=0 %MAJOR%=3 diff --git a/InstallerSamples/Graph3D/Кубик Рубика/Rubic3D.pas b/InstallerSamples/Graph3D/Кубик Рубика/Rubic3D.pas index 8c60602d9..cde4f372f 100644 --- a/InstallerSamples/Graph3D/Кубик Рубика/Rubic3D.pas +++ b/InstallerSamples/Graph3D/Кубик Рубика/Rubic3D.pas @@ -1,28 +1,30 @@ uses Graph3D; +var InnerColor := RGB(70,70,70); +var sec := 0.5; + var g := new Object3D[3,3,3]; procedure CreateCube; begin - var b := Box(0,0,-0.5,1,1,0.01,Colors.White); - var b3 := Box(0,0,0.5,1,1,0.01,Colors.Yellow); - - var b1 := Box(0.5,0,0,0.01,1,1,Colors.Red); - var b4 := Box(-0.5,0,0,0.01,1,1,Colors.Orange); - - var b2 := Box(0,0.5,0,1,0.01,1,Colors.Green); - var b5 := Box(0,-0.5,0,1,0.01,1,Colors.Blue); - - var g000 := Group(b,b1,b2,b3,b4,b5); - g[1,1,1] := g000; - - var a := 1.02; + var a := 1.03; for var x := 0 to 2 do for var y := 0 to 2 do for var z := 0 to 2 do if (x,y,z) <> (1,1,1) then - g[x,y,z] := g000.Clone.MoveOn(a*x-a,a*y-a,a*z-a); + begin + var b := Box(0+x*a-a,0+y*a-a,-0.5+z*a-a,1,1,0.01,z=0 ? Colors.White : InnerColor); + var b3 := Box(0+x*a-a,0+y*a-a,0.5+z*a-a,1,1,0.01,z=2 ? Colors.Yellow : InnerColor); + + var b1 := Box(0.5+x*a-a,0+y*a-a,0+z*a-a,0.01,1,1,x=2 ? Colors.Red : InnerColor); + var b4 := Box(-0.5+x*a-a,0+y*a-a,0+z*a-a,0.01,1,1,x=0 ? Colors.Orange : InnerColor); + + var b2 := Box(0+x*a-a,0.5+y*a-a,0+z*a-a,1,0.01,1,y=2 ? Colors.Green : InnerColor); + var b5 := Box(0+x*a-a,-0.5+y*a-a,0+z*a-a,1,0.01,1,y=0 ? Colors.Blue : InnerColor); + + g[x,y,z] := Group(b,b1,b2,b3,b4,b5); + end; end; var IsAnimated := False; @@ -63,7 +65,7 @@ begin if n = 0 then exit; for var x := 0 to 2 do for var z := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtY,-90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtY,-90*n,Origin,sec*Abs(n),EndAnim).Begin; if n>0 then loop Abs(n) do @@ -86,7 +88,7 @@ begin if n = 0 then exit; for var x := 0 to 2 do for var z := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtY,90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtY,90*n,Origin,sec*Abs(n),EndAnim).Begin; if n<0 then loop Abs(n) do @@ -109,7 +111,7 @@ begin if n = 0 then exit; for var x := 0 to 2 do for var y := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtZ,-90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtZ,-90*n,Origin,sec*Abs(n),EndAnim).Begin; if n<0 then loop Abs(n) do @@ -132,7 +134,7 @@ begin if n = 0 then exit; for var x := 0 to 2 do for var y := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtZ,90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtZ,90*n,Origin,sec*Abs(n),EndAnim).Begin; if n>0 then loop Abs(n) do @@ -155,7 +157,7 @@ begin if n = 0 then exit; for var y := 0 to 2 do for var z := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtX,-90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtX,-90*n,Origin,sec*Abs(n),EndAnim).Begin; if n<0 then loop Abs(n) do @@ -178,7 +180,7 @@ begin if n = 0 then exit; for var y := 0 to 2 do for var z := 0 to 2 do - g[x,y,z].AnimRotateAtAbsolute(OrtX,90*n,Origin,1*Abs(n),EndAnim).Begin; + g[x,y,z].AnimRotateAtAbsolute(OrtX,90*n,Origin,sec*Abs(n),EndAnim).Begin; if n>0 then loop Abs(n) do @@ -211,6 +213,24 @@ begin Lights.AddDirectionalLight(Colors.Gray,V3D(0,2,0)); end; +procedure Mix; +begin + sec := 0.5; + loop 20 do + begin + case Random(6) of + 0: RightRotate; + 1: LeftRotate; + 2: UpRotate; + 3: DownRotate; + 4: FrontRotate; + 5: BackRotate; + end; + //Sleep(Round((sec+0.03)*1000)); + end; + sec := 0.5; +end; + begin InitScene; CreateCube; @@ -224,6 +244,7 @@ begin Key.D: DownRotate; Key.F: FrontRotate; Key.B: BackRotate; + Key.M: Mix; end; end; end. \ No newline at end of file diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 61dd987fd..a848ec305 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.5.0.2196' +!define VERSION '3.5.0.2197' diff --git a/TestSuite/CompilationSamples/graph3d.pas b/TestSuite/CompilationSamples/graph3d.pas index 226d02948..efb942a1e 100644 --- a/TestSuite/CompilationSamples/graph3d.pas +++ b/TestSuite/CompilationSamples/graph3d.pas @@ -357,6 +357,7 @@ type rotatetransform := new MatrixTransform3D; scaletransform := new ScaleTransform3D; transltransform: TranslateTransform3D; + rotatetransform_absolute := new MatrixTransform3D; procedure AddToObject3DList; procedure DeleteFromObject3DList; @@ -370,6 +371,7 @@ type transfgroup.Children.Add(rotatetransform); transfgroup.Children.Add(scaletransform); transfgroup.Children.Add(transltransform); + transfgroup.Children.Add(rotatetransform_absolute); model.Transform := transfgroup; hvp.Children.Add(model); @@ -491,7 +493,7 @@ type transfgroup.Children[ind] := rotatetransform; Result := Self; end); - /// Поворачивает объект на угол angle вокруг оси axis относительно точки center + /// Поворачивает объект на угол angle вокруг оси axis относительно точки center (её координаты задаются относительно центра объекта) function RotateAt(axis: Vector3D; angle: real; center: Point3D): Object3D := Invoke&(()->begin var m := Matrix3D.Identity; @@ -501,6 +503,16 @@ type transfgroup.Children[ind] := rotatetransform; Result := Self; end); + /// Поворачивает объект на угол angle вокруг оси axis относительно точки center (в абсолютных координатах) + function RotateAtAbsolute(axis: Vector3D; angle: real; center: Point3D): Object3D := + Invoke&(()->begin + var m := Matrix3D.Identity; + m.RotateAt(new Quaternion(axis, angle), center); + var ind := transfgroup.Children.IndexOf(rotatetransform_absolute); + rotatetransform_absolute := new MatrixTransform3D(rotatetransform_absolute.Value * m); + transfgroup.Children[ind] := rotatetransform_absolute; + Result := Self; + end); /// Возвращает анимацию перемещения объекта к точке (x, y, z) за seconds секунд. В конце анимации выполняется процедура Completed function AnimMoveTo(x, y, z: real; seconds: real; Completed: procedure): AnimationBase; /// Возвращает анимацию перемещения объекта к точке (x, y, z) за seconds секунд @@ -573,13 +585,13 @@ type /// Возвращает анимацию поворота объекта вокруг вектора v, направленного из центра объекта, на величину angle за seconds секунд function AnimRotate(v: Vector3D; angle: real; seconds: real := 1) := AnimRotate(v.x, v.y, v.z, angle, seconds, nil); - /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center, на величину angle за seconds секунд. В конце анимации выполняется процедура Completed + /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center (её координаты задаются относительно центра объекта), на величину angle за seconds секунд. В конце анимации выполняется процедура Completed function AnimRotateAt(axis: Vector3D; angle: real; center: Point3D; seconds: real; Completed: procedure): AnimationBase; - /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center, на величину angle за seconds секунд + /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center (её координаты задаются относительно центра объекта), на величину angle за seconds секунд function AnimRotateAt(axis: Vector3D; angle: real; center: Point3D; seconds: real := 1): AnimationBase := AnimRotateAt(axis,angle,center,seconds,nil); - /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center, на величину angle за seconds секунд. В конце анимации выполняется процедура Completed + /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center (в абсолютных координатах), на величину angle за seconds секунд. В конце анимации выполняется процедура Completed function AnimRotateAtAbsolute(axis: Vector3D; angle: real; center: Point3D; seconds: real; Completed: procedure): AnimationBase; - /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center, на величину angle за seconds секунд + /// Возвращает анимацию поворота объекта вокруг вектора axis, направленного из точки center (в абсолютных координатах), на величину angle за seconds секунд function AnimRotateAtAbsolute(axis: Vector3D; angle: real; center: Point3D; seconds: real := 1): AnimationBase := AnimRotateAtAbsolute(axis,angle,center,seconds,nil); /// Клонирует 3D-объект @@ -1286,7 +1298,12 @@ type begin var rot := el.Rotation as AxisAngleRotation3D; if not da.AutoReverse then - Element.RotateAt(rot.Axis, angle, center); + begin + if Absolute then + Element.RotateAtAbsolute(rot.Axis, angle, center) + else + Element.RotateAt(rot.Axis, angle, center); + end; Element.transfgroup.Children.Remove(el); if Completed <> nil then Completed(); diff --git a/VisualPascalABCNET/AutoInsertCode/AutoInsertCode.cs b/VisualPascalABCNET/AutoInsertCode/AutoInsertCode.cs index 3cea57d47..d06bb8d12 100644 --- a/VisualPascalABCNET/AutoInsertCode/AutoInsertCode.cs +++ b/VisualPascalABCNET/AutoInsertCode/AutoInsertCode.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using ICSharpCode.TextEditor.Document; using ICSharpCode.TextEditor; - +using System.Text.RegularExpressions; namespace VisualPascalABC { @@ -47,6 +47,13 @@ namespace VisualPascalABC return Array.FindIndex(s.ToCharArray(), c => c != ' '); } + int CurrentOffset() + { + var editor = VisualPascalABCProgram.MainForm.CurrentCodeFileDocument.TextEditor; + var ta = editor.ActiveTextAreaControl.TextArea; + var tl_beg = new TextLocation(ta.Caret.Column, ta.Caret.Line); + return editor.ActiveTextAreaControl.TextArea.Document.PositionToOffset(tl_beg); + } private bool TextArea_KeyEventHandler(char ch) { if (!tsAutoInsertCode.Checked) @@ -56,6 +63,20 @@ namespace VisualPascalABC var editor = VisualPascalABCProgram.MainForm.CurrentCodeFileDocument.TextEditor; var ta = editor.ActiveTextAreaControl.TextArea; var doc = ta.Document; + + if (ch == ' ') + { + var caret1 = editor.ActiveTextAreaControl.Caret; + int start1 = TextUtilities.FindPrevWordStart(editor.Document, caret1.Offset); + var Text1 = editor.Document.GetText(start1, caret1.Offset - start1).TrimEnd(); + + if (Text1.ToLower().StartsWith("for")) + { + doc.Insert(CurrentOffset(), " var"); + ta.Caret.Column = ta.Caret.Column + 5; + } + return false; + } /*if (ch == '(') { var tl_beg = new TextLocation(ta.Caret.Column, ta.Caret.Line); @@ -80,7 +101,6 @@ namespace VisualPascalABC if (ch != '\n') return false; var caret = editor.ActiveTextAreaControl.Caret; - int start = TextUtilities.FindPrevWordStart(editor.Document, caret.Offset); var Text = editor.Document.GetText(start, caret.Offset - start).TrimEnd(); @@ -95,7 +115,7 @@ namespace VisualPascalABC // Проанализируем предыдущий оператор по первому слову var pst = prev?.TrimStart().ToLower(); if (pst != null) - if (pst.StartsWith("if") || pst.StartsWith("for") || pst.StartsWith("loop") || pst.StartsWith("with") || pst.StartsWith("on")) // потом улучшу - для нескольких выборов + if (pst.StartsWith("if") || pst.StartsWith("for") || pst.StartsWith("loop") || pst.StartsWith("with") || pst.StartsWith("on") || pst.StartsWith("while") || pst.StartsWith("else")) // потом улучшу - для нескольких выборов { // Надо удалить в текущей строке пробелы чтобы выровнять begin по if var iprev = Indent(prev); @@ -105,6 +125,7 @@ namespace VisualPascalABC icur -= 2; } } + ta.InsertString("\n" + Spaces(icur + 2)); if (next == null || Indent(next) < icur || Indent(next) == icur && !next.TrimStart().ToLower().StartsWith("end")) { @@ -118,7 +139,8 @@ namespace VisualPascalABC } return true; } - if (Text.ToLower() == "repeat") + + else if (Text.ToLower() == "repeat") { string cur, next, prev; GetCurNextLines(out cur, out next, out prev); @@ -133,27 +155,43 @@ namespace VisualPascalABC } return true; } - if (Text.ToLower() == "then" || Text.ToLower() == "else" || Text.ToLower() == "do") + + else if (Text.ToLower() == "of") { string cur, next, prev; GetCurNextLines(out cur, out next, out prev); var icur = Indent(cur); ta.InsertString("\n" + Spaces(icur + 2)); + if (cur.TrimStart().ToLower().StartsWith("case") && next == null || Indent(next) < icur || Indent(next) == icur && !next.TrimStart().ToLower().StartsWith("end")) + { + var tl_beg = new TextLocation(ta.Caret.Column, ta.Caret.Line); + int offset = doc.PositionToOffset(tl_beg); + var send = "\n" + Spaces(icur) + "end;"; + doc.Insert(offset, send); + } return true; } - /*if (Text.ToLower() == "do") + + else if (Text.ToLower() == "then" || Text.ToLower() == "else" || Text.ToLower() == "do") { - var pos = doc.OffsetToPosition(start); - var ls = doc.GetLineSegment(pos.Line); - //var beglineoffset = ls.Offset; - var tttt = doc.GetText(ls); - var n = Array.FindIndex(tttt.ToCharArray(), c => c != ' '); - ta.InsertString("\n" + Spaces(n) + "begin\n" + Spaces(n + 2)); - var tl_beg = new TextLocation(ta.Caret.Column, ta.Caret.Line); - int offset = doc.PositionToOffset(tl_beg); - doc.Insert(offset, "\n" + Spaces(n) + "end;"); + var cur = GetLine(ta.Caret.Line); + var icur = Indent(cur); + ta.InsertString("\n" + Spaces(icur + 2)); return true; - }*/ + } + + else + { + var seg = doc.GetLineSegment(ta.Caret.Line); + var curline = doc.GetText(seg); + if (curline.Contains(":=")) + { + var curlinenew = Regex.Replace(curline, @"(\s*)(\S+)(\s*):=(\s*)(.+)(;?)(\s*)", @"$1$2 := $5;"); + doc.Replace(seg.Offset, curline.Length, curlinenew); + ta.Caret.Column = curlinenew.Length; + return false; + } + } return false; } diff --git a/_Presentations/2019/PABC.NET 2015-2019.pdf b/_Presentations/2019/PABC.NET 2015-2019.pdf deleted file mode 100644 index d0edda4e7..000000000 Binary files a/_Presentations/2019/PABC.NET 2015-2019.pdf and /dev/null differ