Автоисправление пробелов в := с возможным добавлением ; по нажатию Enter
This commit is contained in:
parent
4b94205cb5
commit
b9c7d5deea
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=2196
|
||||
%MINOR%=5
|
||||
%REVISION%=2197
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.5.0.2196'
|
||||
!define VERSION '3.5.0.2197'
|
||||
|
|
|
|||
|
|
@ -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&<Object3D>(()->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&<Object3D>(()->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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in a new issue