| 1 |
unit draw; |
| 2 |
{$IFDEF FPC} |
| 3 |
{$MODE DELPHI}{$H+} |
| 4 |
{$ENDIF} |
| 5 |
(***************************************) |
| 6 |
(* Copyright (C) 2009, SHIRAISHI Kazuo *) |
| 7 |
(***************************************) |
| 8 |
|
| 9 |
{$X+} |
| 10 |
|
| 11 |
interface |
| 12 |
uses affine,objlist,variabl,express; |
| 13 |
|
| 14 |
type |
| 15 |
TTransformTerm=class |
| 16 |
//procedure exec(p:Taffine);virtual;abstract; |
| 17 |
function Code:Ansistring;virtual;abstract; |
| 18 |
end; |
| 19 |
|
| 20 |
type |
| 21 |
TTransFormList=class(TObjectList) |
| 22 |
//procedure make(a:Taffine); |
| 23 |
function Code1:ansistring; |
| 24 |
function Code2:ansistring; |
| 25 |
function Code0(m:TMatrix):AnsiString; // for TransForm-mat statement |
| 26 |
end; |
| 27 |
|
| 28 |
|
| 29 |
function transformation:TTransformList; |
| 30 |
|
| 31 |
|
| 32 |
implementation |
| 33 |
|
| 34 |
uses Types, SysUtils,Graphics, |
| 35 |
arithmet, base,base0,float,mathc, texthand, |
| 36 |
graphic,struct,confopt,helpctex,plottext,sconsts,graphsys,gridaxes; |
| 37 |
|
| 38 |
(* |
| 39 |
procedure TTransFormList.make(a:TAffine); |
| 40 |
var |
| 41 |
i:integer; |
| 42 |
p:TTransformTerm; |
| 43 |
begin |
| 44 |
i:=0; |
| 45 |
while (i<count) do |
| 46 |
begin |
| 47 |
TObject(p):=items[i]; |
| 48 |
p.exec(a); |
| 49 |
inc(i) |
| 50 |
end; |
| 51 |
end; |
| 52 |
*) |
| 53 |
|
| 54 |
type |
| 55 |
TTransformMatrix=class(TTransformTerm) |
| 56 |
mat:TMatrix; |
| 57 |
constructor create; |
| 58 |
//procedure exec(p:Taffine);override; |
| 59 |
destructor destroy;override; |
| 60 |
function Code:ansistring;override; |
| 61 |
end; |
| 62 |
|
| 63 |
TTransformFunction=class(TTransformTerm) |
| 64 |
exp1,exp2:TPrincipal; |
| 65 |
destructor destroy;override; |
| 66 |
function Code:ansistring;override; |
| 67 |
end; |
| 68 |
|
| 69 |
TSHIFT=class(TTransformFunction) |
| 70 |
constructor create; |
| 71 |
//procedure exec(p:Taffine);override; |
| 72 |
function Code:ansistring;override; |
| 73 |
end; |
| 74 |
|
| 75 |
TSCALE=class(TTransformFunction) |
| 76 |
constructor create(e1:TPrincipal); |
| 77 |
//function Code:ansistring;override; |
| 78 |
end; |
| 79 |
|
| 80 |
TSCALE1=class(TSCALE) |
| 81 |
//procedure exec(p:Taffine);override; |
| 82 |
function Code:ansistring;override; |
| 83 |
end; |
| 84 |
|
| 85 |
TSCALEC=class(TSCALE) |
| 86 |
//procedure exec(p:Taffine);override; |
| 87 |
function Code:ansistring;override; |
| 88 |
end; |
| 89 |
|
| 90 |
TSCALE2=class(TSCALE) |
| 91 |
constructor create(e1:TPrincipal); |
| 92 |
//procedure exec(p:Taffine);override; |
| 93 |
function Code:ansistring;override; |
| 94 |
end; |
| 95 |
|
| 96 |
TROTATE=class(TTransformFunction) |
| 97 |
rad:extended; |
| 98 |
cost,sint:extended; |
| 99 |
constructor create; |
| 100 |
//procedure exec(p:Taffine);override; |
| 101 |
function Code:ansistring;override; |
| 102 |
end; |
| 103 |
|
| 104 |
TSHEAR=class(TTransformFunction) |
| 105 |
rad:extended; |
| 106 |
constructor create; |
| 107 |
//procedure exec(p:Taffine);override; |
| 108 |
function Code:ansistring;override; |
| 109 |
end; |
| 110 |
|
| 111 |
|
| 112 |
TcurrentTransform=class(TTransformFunction) |
| 113 |
//procedure exec(p:Taffine);override; |
| 114 |
function Code:ansistring;override; |
| 115 |
end; |
| 116 |
|
| 117 |
|
| 118 |
type |
| 119 |
ESyntaxError=class(Exception); |
| 120 |
|
| 121 |
constructor TTransformMatrix.create; |
| 122 |
begin |
| 123 |
inherited create; |
| 124 |
mat:=NMatrix; |
| 125 |
if mat=nil then raise ESyntaxError.create(''); |
| 126 |
if mat.idr.dim<>2 then begin seterrdimension(IDH_PICTURE);raise ESyntaxError.create('') end |
| 127 |
end; |
| 128 |
|
| 129 |
|
| 130 |
constructor TSHIFT.create; |
| 131 |
begin |
| 132 |
inherited create; |
| 133 |
gettoken; { keyword } |
| 134 |
gettoken; { '(' } |
| 135 |
exp1:=NExpression; |
| 136 |
if (ProgramUnit.arithmetic=PrecisionComplex) and (token<>',') then exit; |
| 137 |
check(',',IDH_PICTURE); |
| 138 |
exp2:=NExpression; |
| 139 |
end; |
| 140 |
|
| 141 |
constructor TSCALE.create(e1:TPrincipal); |
| 142 |
begin |
| 143 |
inherited create; |
| 144 |
exp1:=e1; |
| 145 |
end; |
| 146 |
|
| 147 |
constructor TSCALE2.create(e1:TPrincipal); |
| 148 |
begin |
| 149 |
inherited create(e1); |
| 150 |
gettoken; |
| 151 |
exp2:=NExpression; |
| 152 |
end; |
| 153 |
|
| 154 |
|
| 155 |
function scale:TSCALE; |
| 156 |
var |
| 157 |
exp1:TPrincipal; |
| 158 |
begin |
| 159 |
gettoken; { keyword } |
| 160 |
gettoken; { '(' } |
| 161 |
exp1:=NExpression; |
| 162 |
if token=',' then |
| 163 |
result:=TSCALE2.create(exp1) |
| 164 |
else if ProgramUnit.arithmetic=PrecisionComplex then |
| 165 |
result:=TSCALEC.create(exp1) |
| 166 |
else |
| 167 |
result:=TSCALE1.create(exp1) |
| 168 |
end; |
| 169 |
|
| 170 |
constructor TROTATE.create; |
| 171 |
var |
| 172 |
x:extended; |
| 173 |
begin |
| 174 |
inherited create; |
| 175 |
gettoken; { keyword } |
| 176 |
gettoken; { '(' } |
| 177 |
exp1:=NExpression; |
| 178 |
if confirmedDegrees then |
| 179 |
rad:=pi/180 |
| 180 |
else |
| 181 |
rad:=1; |
| 182 |
if (exp1=nil) then begin raise ESyntaxError.create('') end; |
| 183 |
if (exp1.isConstant) then |
| 184 |
begin |
| 185 |
x:=exp1.evalX; |
| 186 |
cost:=cos(x*rad); |
| 187 |
sint:=sin(x*rad); |
| 188 |
exp1.free; |
| 189 |
exp1:=nil; |
| 190 |
end; |
| 191 |
end; |
| 192 |
|
| 193 |
constructor TShear.create; |
| 194 |
begin |
| 195 |
inherited create; |
| 196 |
gettoken; { keyword } |
| 197 |
gettoken; { '(' } |
| 198 |
exp1:=NExpression; |
| 199 |
if confirmedDegrees then |
| 200 |
rad:=pi/180 |
| 201 |
else |
| 202 |
rad:=1; |
| 203 |
if (exp1=nil) then |
| 204 |
begin raise ESyntaxError.create('') end; |
| 205 |
end; |
| 206 |
|
| 207 |
destructor TTransformmatrix.destroy; |
| 208 |
begin |
| 209 |
mat.free; |
| 210 |
inherited destroy; |
| 211 |
end; |
| 212 |
|
| 213 |
destructor TTransformFunction.destroy; |
| 214 |
begin |
| 215 |
exp1.free; |
| 216 |
exp2.free; |
| 217 |
inherited destroy; |
| 218 |
end; |
| 219 |
(* |
| 220 |
procedure TSHIFT.exec(p:Taffine); |
| 221 |
var |
| 222 |
c:complex; |
| 223 |
begin |
| 224 |
if (exp2=nil) then |
| 225 |
begin |
| 226 |
exp1.evalC(c); |
| 227 |
p.shift(c.x, c.y) |
| 228 |
end |
| 229 |
else |
| 230 |
p.shift(exp1.evalX,exp2.evalX) ; |
| 231 |
end; |
| 232 |
|
| 233 |
procedure TSCALE1.exec(p:TAffine); |
| 234 |
begin |
| 235 |
p.scale1(exp1.evalX) ; |
| 236 |
end; |
| 237 |
|
| 238 |
procedure TSCALE2.exec(p:TAffine); |
| 239 |
begin |
| 240 |
p.scale(exp1.evalX,exp2.evalX) |
| 241 |
end; |
| 242 |
|
| 243 |
procedure TSCALEC.exec(p:TAffine); |
| 244 |
var |
| 245 |
c:complex; |
| 246 |
begin |
| 247 |
exp1.evalC(c); |
| 248 |
p.cmlt(c) |
| 249 |
end; |
| 250 |
|
| 251 |
|
| 252 |
procedure TROTATE.exec(p:TAffine); |
| 253 |
begin |
| 254 |
if exp1=nil then |
| 255 |
p.rotate2(cost,sint) |
| 256 |
else |
| 257 |
p.rotate(exp1.evalX*rad) |
| 258 |
end; |
| 259 |
|
| 260 |
procedure TSHEAR.exec(p:TAffine); |
| 261 |
begin |
| 262 |
p.shear(exp1.evalX * rad) |
| 263 |
end; |
| 264 |
|
| 265 |
|
| 266 |
procedure TTRansformMatrix.exec(p:Taffine); |
| 267 |
var |
| 268 |
NArray:TArray; |
| 269 |
m:TAffine; |
| 270 |
begin |
| 271 |
NArray:=TArray(mat.point); |
| 272 |
if (NArray<>nil) and (NArray.dim=2) |
| 273 |
and (NArray.size[1]=4) and (NArray.size[2]=4) then |
| 274 |
begin |
| 275 |
m:=TAffine.create; |
| 276 |
try |
| 277 |
with NArray do |
| 278 |
try |
| 279 |
ItemGetF(0, m.xx); |
| 280 |
ItemGetF(1*size[2], m.xy); |
| 281 |
ItemGetF(2*size[2], m.xz); |
| 282 |
ItemGetF(3*size[2], m.xo); |
| 283 |
ItemGetF( 1,m.yx); |
| 284 |
ItemGetF(1*size[2]+1,m.yy); |
| 285 |
ItemGetF(2*size[2]+1,m.yz); |
| 286 |
ItemGetF(3*size[2]+1,m.yo); |
| 287 |
ItemGetF( 2,m.zx); |
| 288 |
ItemGetF(1*size[2]+2,m.zy); |
| 289 |
ItemGetF(2*size[2]+2,m.zz); |
| 290 |
ItemGetF(3*size[2]+2,m.zo); |
| 291 |
ItemGetF( 3,m.ox); |
| 292 |
ItemGetF(1*size[2]+3,m.oy); |
| 293 |
ItemGetF(2*size[2]+3,m.oz); |
| 294 |
ItemGetF(3*size[2]+3,m.oo); |
| 295 |
except |
| 296 |
setexception(-3009) |
| 297 |
end; |
| 298 |
p.mlt(m); |
| 299 |
finally |
| 300 |
m.free; |
| 301 |
end; |
| 302 |
end |
| 303 |
else |
| 304 |
setexception(6201); |
| 305 |
end; |
| 306 |
|
| 307 |
|
| 308 |
procedure TCurrentTransform.exec(p:Taffine); |
| 309 |
begin |
| 310 |
if CurrentTransform<>nil then p.mlt(currenttransform); |
| 311 |
end; |
| 312 |
*) |
| 313 |
|
| 314 |
|
| 315 |
type |
| 316 |
TDRAW=class(TCALL) |
| 317 |
transform:TTransformList; {collection of PTransformterm } |
| 318 |
substitution: function(x,y:extended):boolean; {AXES,GRID} |
| 319 |
exp1,exp2:TPrincipal; |
| 320 |
NoBeamOff:boolean; |
| 321 |
constructor create(prev,eld:TStatement); |
| 322 |
destructor destroy;override; |
| 323 |
// procedure exec;override; |
| 324 |
function OverflowErCode:integer;override; |
| 325 |
function InvalidErCode:integer;override; |
| 326 |
function OpName:string;override; |
| 327 |
{for Code Gen.} |
| 328 |
function Code:AnsiString;override; |
| 329 |
|
| 330 |
|
| 331 |
end; |
| 332 |
|
| 333 |
function DRAWst(prev,eld:TStatement):TStatement;far; |
| 334 |
begin |
| 335 |
DRAWst:=TDRAW.create(prev,eld{,idr}); |
| 336 |
graphmode:=true; |
| 337 |
end; |
| 338 |
|
| 339 |
function transformation:TTransformList; |
| 340 |
var |
| 341 |
p:TTransformTerm; |
| 342 |
s:boolean; |
| 343 |
begin |
| 344 |
result:=TTransformList.create(4); |
| 345 |
try |
| 346 |
s:=true; |
| 347 |
repeat |
| 348 |
p:=nil; |
| 349 |
if nexttoken='(' then |
| 350 |
begin |
| 351 |
if token='SHIFT' then |
| 352 |
p:=TSHIFT.create |
| 353 |
else if token='SCALE' then |
| 354 |
p:=scale |
| 355 |
else if token='ROTATE' then |
| 356 |
p:=TROTATE.create |
| 357 |
else if token='SHEAR' then |
| 358 |
p:=TSHEAR.create |
| 359 |
else |
| 360 |
seterrillegal(token,IDH_PICTURE); |
| 361 |
check(')',IDH_PICTURE); |
| 362 |
end |
| 363 |
else if token='TRANSFORM' then |
| 364 |
begin |
| 365 |
gettoken; |
| 366 |
p:=TCurrentTransform.create |
| 367 |
end |
| 368 |
else |
| 369 |
p:=TTransformMatrix.create; |
| 370 |
if p<>nil then result.add(p); |
| 371 |
if token='*' then |
| 372 |
gettoken |
| 373 |
else |
| 374 |
s:=false; |
| 375 |
until s=false; |
| 376 |
except |
| 377 |
on syntaxError do |
| 378 |
begin |
| 379 |
result.free; |
| 380 |
result:=nil; |
| 381 |
end; |
| 382 |
end; |
| 383 |
end; |
| 384 |
|
| 385 |
constructor TDRAW.create(prev,eld:TStatement); |
| 386 |
begin |
| 387 |
transform:=nil; |
| 388 |
|
| 389 |
try |
| 390 |
inherited create(prev,eld,'P') |
| 391 |
except |
| 392 |
on SyntaxError do |
| 393 |
begin |
| 394 |
inherited TStatementCreate(prev,eld); |
| 395 |
{reseterr; } |
| 396 |
if token='AXES0' then |
| 397 |
substitution:=drawaxes0 |
| 398 |
else if token='GRID0' then |
| 399 |
substitution:=drawgrid0 |
| 400 |
else if token='AXES' then |
| 401 |
substitution:=drawaxes2 |
| 402 |
else if token='GRID' then |
| 403 |
substitution:=drawgrid2 |
| 404 |
else if token='CIRCLE' then |
| 405 |
substitution:=drawcircle |
| 406 |
else if token='DISK' then |
| 407 |
begin |
| 408 |
substitution:=drawdisk; |
| 409 |
NoBeamOff:=true; |
| 410 |
end |
| 411 |
else |
| 412 |
raise; |
| 413 |
|
| 414 |
gettoken; |
| 415 |
if token='(' then |
| 416 |
begin |
| 417 |
check('(',IDH_DRAW_axes); |
| 418 |
exp1:=NExpression; |
| 419 |
check(',',IDH_DRAW_axes); |
| 420 |
exp2:=NExpression; |
| 421 |
check(')',IDH_DRAW_axes); |
| 422 |
end; |
| 423 |
statusmes.clear; |
| 424 |
HelpContext:=0; |
| 425 |
end; |
| 426 |
end; |
| 427 |
|
| 428 |
if token='WITH' then |
| 429 |
begin |
| 430 |
gettoken; |
| 431 |
transform:=Transformation; |
| 432 |
if transform=nil then seterr('',IDH_PICTURE); |
| 433 |
end; |
| 434 |
end; |
| 435 |
|
| 436 |
destructor TDRAW.destroy; |
| 437 |
begin |
| 438 |
transform.free; |
| 439 |
inherited destroy; |
| 440 |
end; |
| 441 |
(* |
| 442 |
procedure TDRAW.exec; |
| 443 |
var |
| 444 |
a:TAffine; |
| 445 |
begin |
| 446 |
try |
| 447 |
if transform<>nil then |
| 448 |
begin |
| 449 |
a:=Taffine.create; |
| 450 |
a.push; // a���currenttransform��������� |
| 451 |
currentoperation:=self; |
| 452 |
transform.make(a); |
| 453 |
if a.next<>nil then |
| 454 |
a.mlt(a.next); |
| 455 |
currentoperation:=nil; |
| 456 |
end; |
| 457 |
|
| 458 |
MyGraphSys.beam:=MyGraphSys.beam |
| 459 |
and ( (MyGraphSys.BeamMode=bmImmortal) |
| 460 |
or (Routine<>nil) and Routine.NoBeamOff |
| 461 |
or (Routine=nil) and NobeamOff ); |
| 462 |
|
| 463 |
if @substitution=nil then |
| 464 |
inherited exec |
| 465 |
else if exp1=nil then |
| 466 |
substitution(1,1) |
| 467 |
else |
| 468 |
substitution(abs(exp1.evalX),abs(exp2.evalX)); |
| 469 |
|
| 470 |
MyGraphSys.beam:=MyGraphSys.beam |
| 471 |
and ( (MyGraphSys.BeamMode=bmImmortal) |
| 472 |
or (Routine<>nil) and Routine.NoBeamOff |
| 473 |
or (Routine=nil) and NobeamOff ); |
| 474 |
|
| 475 |
finally |
| 476 |
if transform<>nil then |
| 477 |
pop; |
| 478 |
end; |
| 479 |
end; |
| 480 |
*) |
| 481 |
function TDRAW.OverflowErCode:integer; |
| 482 |
begin |
| 483 |
result:=-1005 |
| 484 |
end; |
| 485 |
|
| 486 |
function TDRAW.InvalidErCode:integer; |
| 487 |
begin |
| 488 |
result:=-3009 |
| 489 |
end; |
| 490 |
|
| 491 |
function TDRAW.OpName:string; |
| 492 |
begin |
| 493 |
result:=s_TDrawOpName; |
| 494 |
end; |
| 495 |
|
| 496 |
|
| 497 |
function TTransformMatrix.code:ansistring; |
| 498 |
begin |
| 499 |
result:=' mlt('+mat.code+');' |
| 500 |
end; |
| 501 |
|
| 502 |
function TTransformFunction.Code:ansistring; |
| 503 |
begin |
| 504 |
result:='('+exp1.Code+','+exp2.Code+');' |
| 505 |
end; |
| 506 |
|
| 507 |
function TSHIFT.Code:Ansistring; |
| 508 |
begin |
| 509 |
if exp2<>nil then |
| 510 |
result:=' shift'+inherited code |
| 511 |
else |
| 512 |
result:=' shift('+exp1.Code+');' |
| 513 |
end; |
| 514 |
|
| 515 |
|
| 516 |
function TSCALE1.code:ansistring; |
| 517 |
begin |
| 518 |
result:=' scale1('+exp1.Code+');' |
| 519 |
end; |
| 520 |
|
| 521 |
function TSCALEC.code:ansistring; |
| 522 |
begin |
| 523 |
result:=' cmlt('+exp1.Code+');' |
| 524 |
end; |
| 525 |
|
| 526 |
function TSCALE2.Code:ansistring; |
| 527 |
begin |
| 528 |
result:=' scale'+inherited code; |
| 529 |
end; |
| 530 |
|
| 531 |
function TROTATE.Code:ansistring; |
| 532 |
begin |
| 533 |
if exp1=nil then |
| 534 |
result:=' rotate2('+Format20(cost)+','+Format20(sint)+');' |
| 535 |
else if rad=1 then |
| 536 |
result:=' rotate('+exp1.code+');' |
| 537 |
else |
| 538 |
result:=' rotate(('+exp1.code+')*PI/180);' |
| 539 |
end; |
| 540 |
|
| 541 |
function TSHEAR.Code:ansistring; |
| 542 |
begin |
| 543 |
if rad=1 then |
| 544 |
result:=' shear('+exp1.code+');' |
| 545 |
else |
| 546 |
result:=' shear(('+exp1.code+')*PI/180);' |
| 547 |
end; |
| 548 |
|
| 549 |
|
| 550 |
function TcurrentTransform.Code:ansistring; |
| 551 |
begin |
| 552 |
result:=' mlt(CurrentTransform);' |
| 553 |
end; |
| 554 |
|
| 555 |
function TTransformList.Code1:ansistring; |
| 556 |
var |
| 557 |
i:integer; |
| 558 |
begin |
| 559 |
result:='With Taffine.create do'+EOL |
| 560 |
+'begin'+EOL |
| 561 |
+' push;'+EOL; |
| 562 |
for i:=0 to Count-1 do |
| 563 |
result := result+(items[i] as TTransformTerm).code; |
| 564 |
result:=result +' if next<>nil then mlt(next);'+EOL //next���currenttransform������������ |
| 565 |
+'end;'+EOL |
| 566 |
end; |
| 567 |
|
| 568 |
function TTransFormList.Code2:ansistring; |
| 569 |
begin |
| 570 |
result:='pop;'+EOL |
| 571 |
end; |
| 572 |
|
| 573 |
function TTransformList.Code0(m:TMatrix):ansistring; |
| 574 |
var |
| 575 |
i:integer; |
| 576 |
begin |
| 577 |
result:='With Taffine.create do'+EOL |
| 578 |
+'begin'+EOL; |
| 579 |
for i:=0 to Count-1 do |
| 580 |
result:=result+(items[i] as TTransformTerm).code; |
| 581 |
result:=result +' store(' + m.Code +');'+EOL |
| 582 |
+' free;'+EOL |
| 583 |
+'end;'+EOL |
| 584 |
end; |
| 585 |
|
| 586 |
|
| 587 |
function TDraw.Code:ansistring; |
| 588 |
var |
| 589 |
i:integer; |
| 590 |
begin |
| 591 |
result:=''; |
| 592 |
if Transform<>nil then |
| 593 |
result:=result+Transform.Code1+EOL; |
| 594 |
|
| 595 |
if not( NoBeamoff or (Routine<>nil) and (Routine.NoBeamOff)) then |
| 596 |
result:=result |
| 597 |
+'MyGraphSys.beam:=MyGraphSys.beam and (MyGraphSys.BeamMode=bmImmortal);'+EOL; |
| 598 |
|
| 599 |
|
| 600 |
if @substitution=nil then |
| 601 |
result:=result+inherited code |
| 602 |
else |
| 603 |
begin |
| 604 |
if @substitution=@drawaxes0 then |
| 605 |
result:=result+'drawaxes0(' |
| 606 |
else if @substitution=@drawgrid0 then |
| 607 |
result:=result+'drawgrid0(' |
| 608 |
else if @substitution=@drawaxes2 then |
| 609 |
result:=result+'drawaxes2(' |
| 610 |
else if @substitution=@drawgrid2 then |
| 611 |
result:=result+'drawgrid2(' |
| 612 |
else if @substitution=@drawcircle then |
| 613 |
result:=result+'drawcircle(' |
| 614 |
else if @substitution=@drawdisk then |
| 615 |
result:=result+'drawdisk('; |
| 616 |
if exp1<>nil then |
| 617 |
result:=result+exp1.code+',' |
| 618 |
else |
| 619 |
result:=result+'1,'; |
| 620 |
|
| 621 |
if exp2<>nil then |
| 622 |
result:=result+exp2.code+');' |
| 623 |
else |
| 624 |
result:=result+'1);'; |
| 625 |
end; |
| 626 |
|
| 627 |
if Transform<>nil then |
| 628 |
result:=result+Transform.Code2+EOL; |
| 629 |
|
| 630 |
if not( NoBeamoff or (Routine<>nil) and (Routine.NoBeamOff)) then |
| 631 |
result:=result |
| 632 |
+'MyGraphSys.beam:=MyGraphSys.beam and (MyGraphSys.BeamMode=bmImmortal);'+EOL; |
| 633 |
end; |
| 634 |
|
| 635 |
|
| 636 |
|
| 637 |
{ |
| 638 |
function transformInv(var x,y:extended):boolean;far; |
| 639 |
begin |
| 640 |
result:=currenttransform.invtransform(x,y); |
| 641 |
end; |
| 642 |
} |
| 643 |
|
| 644 |
procedure statementTableinit;far; |
| 645 |
begin |
| 646 |
StatementTableInitImperative('DRAW',DRAWst); |
| 647 |
end; |
| 648 |
|
| 649 |
begin |
| 650 |
tableInitProcs.accept(statementTableinit) ; |
| 651 |
//graphic.transform:=transform; |
| 652 |
//graphic.inversetransform:=transforminv; |
| 653 |
|
| 654 |
end. |
| 655 |
|
| 656 |
|
| 657 |
|
| 658 |
|