home *** CD-ROM | disk | FTP | other *** search
Wrap
EPOC OPL Source | 2000-09-27 | 9.8 KB | 636 lines
REM Plotter translated file REM This is not the original source code. This was automaticaly generated by OPL+. REM © 1999-2000 Glenn Strong <Glenn.Strong@cs.tcd.ie> REM Issued under the GNU General Public license, version 2 DECLARE EXTERNAL INCLUDE "const.oph" INCLUDE "System.oxh" INCLUDE "Toolbar.oph" PROC Main: LOADM "Z:\System\Opl\Toolbar.opo" TBarLink:("MainLoop") ENDP EXTERNAL buf$:(b&) EXTERNAL mainDialog%: EXTERNAL SetupMenu: EXTERNAL GetFunction$:(f$) EXTERNAL GetRange: EXTERNAL GetMesh: EXTERNAL GetZoom: EXTERNAL GetCenter: EXTERNAL LoadModule: EXTERNAL UnloadModule: CONST BW%=10 CONST KMax=1.0 CONST MaxZoom%=10 EXTERNAL PlotFunction:(f$) EXTERNAL Axis: EXTERNAL Caption: PROC MainLoop: EXTERNAL TbWidth%, TVisible%, TbMenuSym% GLOBAL WinH%, WinW%, Zoom, Mesh&, Offscreen%, Overprint% GLOBAL XCent%, YCent%, DrawAxes%, QuitFlag%, UseLines%, overPrintCount% GLOBAL LoadedModules$(8,255) GLOBAL RMin, RMax, f$(255), drawWindow% LOCAL k%, mod%, ev&(16), blank%, file$(KDFileNameLen%) k%=1 DO LoadedModules$(k%)="" k%=k%+1 UNTIL k%>8 drawWindow%=gIDENTITY blank%=gCREATEBIT(1,1) gUSE drawWindow% overPrintCount%=0 TBarInit:("Plotter",gWIDTH,gHEIGHT) TBarButt:("p",1,"Plot",0,blank%,0,0) TBarButt:("f",2,"Func",0,blank%,0,0) TBarButt:("r",3,"Range",0,blank%,0,0) TBarButt:("e",4,"Exit",0,blank%,0,0) TBarShow: gUPDATE ON WinH% = gHEIGHT - BW% WinW% = gWIDTH - BW% - TBWidth% XCent% = WinW%/2 YCent% = WinH%/2 Offscreen%=KFalse% : Zoom=1.0 : Mesh&=WinW%/10 f$="SIN(x)" : RMin=-6.0 : RMax=6.0 DrawAxes%=KTrue% : OverPrint%=KFalse% : UseLines%=KTrue% QuitFlag%=KFalse% DO GETEVENT32 ev&() IF ev&(KEvAType%)=KEvPtr& IF TBarOffer%:(ev&(KEvAPtrOplWindowId%),ev&(KEvAPtrType%),ev&(KEvAPtrPositionX%),ev&(KEvAPtrPositionY%)) CONTINUE ENDIF ELSEIF ((ev&(KEvAType%) AND &400)=0) OR (ev&(KEvAType%)=KKeySidebarMenu32%) k%=ev&(KEvAType%) mod%=ev&(KEvAKMod%) IF (k%=KKeyMenu32%) OR (k%=KKeySidebarMenu32%) SetupMenu: k%=MENU mod%=0 ELSEIF mod% AND KKmodControl% k%=k%+$60 IF mod% AND KKmodShift% k%=k%-32 ENDIF ELSE CONTINUE ENDIF IF k%=%c gIPRINT "Not implemented (sorry)" ELSEIF k%=%C gCLS overPrintCount%=0 ELSEIF k%=%f f$=GetFunction$:(f$) ELSEIF k%=%r GetRange: ELSEIF k%=%M LoadModule: ELSEIF k%=%U UnloadModule: ELSEIF k%=%p IF NOT OverPrint% gCLS overPrintCount%=0 ELSE overPrintCount%=overPrintCount%+1 ENDIF IF DrawAxes% Axis: ENDIF Caption: PlotFunction:(f$) ELSEIF k%=%m GetMesh: ELSEIF k%=%z GetZoom: ELSEIF k%=%o GetCenter: ELSEIF k%=%O XCent% = WinW%/2 YCent% = WinH%/2 gIPRINT "Origin reset" ELSEIF k%=%G Offscreen% = NOT Offscreen% IF Offscreen% gIPRINT "Offscreen set" ELSE gIPRINT "Offscreen unset" ENDIF ELSEIF k%=%v Overprint% = NOT Overprint% ELSEIF k%=%x DrawAxes% = NOT DrawAxes% IF DrawAxes% gIPRINT "Axes On" ELSE gIPRINT "Axes off" ENDIF ELSEIF k%=%q Uselines% = NOT UseLines% IF Uselines% gIPRINT "Lines on" ELSE gIPRINT "Lines off" ENDIF ELSEIF k%=%t IF TbMenuSym%<>KMenuCheckBox% TbarHide: WinW% = gWIDTH - BW% XCent% = WinW%/2 ELSE TbarShow: WinW% = gWIDTH - BW% - TBWidth% XCent% = WinW%/2 ENDIF ELSEIF k%=%s dINIT "Export MBM file" dFILE file$, "File,Folder,Disk", KDFileEditBox%+KDFileEditorQueryExisting% dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter% IF DIALOG<>0 gIPRINT "Saving..." gSAVEBIT file$ ELSE gIPRINT "Cancelled..." ENDIF ELSEIF k%=%e QuitFlag%=KTrue% ELSEIF k%=%a dINIT "About this program" dTEXT "Plotter ","version 1.0", KDTextRight% dTEXT "", "© 1999-2000 Glenn Strong", KDTextCentre% dTEXT "", "Free software under the GPL", KDTextCentre% dTEXT "","", KDTextSeparator% dTEXT "", "Glenn.Strong@cs.tcd.ie", KDTextCentre% dTEXT "","http://www.cs.tcd.ie/Glenn.Strong/epoc/", KDTextCentre% dBUTTONS "OK", KDButtonEnter% OR KDButtonNoLabel% DIALOG ENDIF ENDIF UNTIL QuitFlag% ENDP PROC buf$:(b&) LOCAL l%, w&, s$(255) w& = PEEKL(b&) l% = MIN(255,w&) POKEB (b&+3),l% s$=PEEK$(b&+3) POKEL b&, w& RETURN s$ ENDP PROC SetupMenu: EXTERNAL Offscreen%, DrawAxes%, OverPrint%, TbMenuSym% EXTERNAL Uselines% LOCAL OSOption%, AXOption%, OPOption%, LIOption% OSOption% = KMenuCheckBox% IF Offscreen% : OSOption% = OSOption% OR KMenuSymbolOn% : ENDIF AXOption% = KMenuCheckBox% IF DrawAxes% : AXOption% = AXOption% OR KMenuSymbolOn% : ENDIF OPOption% = KMenuCheckBox% IF OverPrint% : OPOption% = OPOption% OR KMenuSymbolOn% : ENDIF LIOption% = KMenuCheckBox% IF UseLines% LIOption% = LIOption% OR KMenuSymbolOn% ENDIF mINIT mCARD "File","Export plot...",%s,"Close",%e mCARD "Edit","Copy",%c,"Erase",%C mCARD "Function","Set...",%f,"Range...",%r, "Load module...", %M, "Unload module...", %U mCARD "Graph", "Plot",%p, "Mesh...",%m, "Zoom",%z, "Set origin",%o, "Reset origin", %O mCARD "Options", "Offscreen",(%G OR OSOption%), "Draw Axes",(%x OR AXOption%), "Overprint",(%v OR OPOption%), "Show toolbar",(%t or TbMenuSym%), "Use lines", (%q or LIOption%) mCARD "Help", "About...", %a ENDP PROC GetFunction$:(f$) LOCAL b&(64), t$(255), k%, i%, p& POKE$ ADDR(b&())+3,f$ POKEL ADDR(b&()), LEN(f$) dINIT "Function" dEDITMULTI ADDR(b&()), "f(x)=",15,3,255 dBUTTONS "OK",%o,"Cancel",KKeyEsc% k%=DIALOG IF k%=%o t$=buf$:(ADDR(b&())) i%=1 p&=ADDR(t$) WHILE i%<=LEN(t$) IF PEEKB(p&+i%) < 32 POKEB p&+i%,32 ENDIF i%=i%+1 ENDWH RETURN t$ ELSE RETURN f$ ENDIF ENDP PROC GetRange: EXTERNAL RMin, RMax dINIT "Select Range of x" dFLOAT RMin, " From ", -100, 100 dFLOAT RMax, " To ", -100, 100 dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc% DIALOG ENDP PROC GetMesh: EXTERNAL Mesh&, WinW% dINIT "Mesh granularity" dLONG Mesh&,"Mesh:",1,WinW% dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc% DIALOG ENDP PROC GetZoom: EXTERNAL Zoom, WinW% LOCAL z& z&=Zoom dINIT "Zoomlevel" dLONG z&, "Zoom:", -MaxZoom%, MaxZoom% dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc% IF DIALOG IF z&=0 z&=1 ENDIF Zoom=z& ENDIF ENDP PROC GetCenter: EXTERNAL XCent%, YCent% LOCAL ev&(16), done% BUSY "Tap new origin" done%=KFalse% DO GETEVENT32 ev&() IF ev&(KEvAType%)=KEvPtr& XCent%=ev&(KEvAPtrPositionX%) YCent%=ev&(KEvAPtrPositionY%) Done%=KTrue% ELSEIF ev&(KEvAType%)=KEvKeyDown& Done% = ev&(3)=4 ENDIF UNTIL Done% BUSY OFF ENDP PROC LoadModule: EXTERNAL LoadedModules$() LOCAL file$(255), free% free%=1 WHILE (free%<9) AND (LoadedModules$(free%)<>"") free%=free%+1 ENDWH IF free%=9 ALERT("Can't load any more modules!") RETURN ENDIF dINIT "Load a module" dFILE file$, "File,Folder,Disk", 0, 0, KUidOPO&, 0 dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter% IF DIALOG<>0 LOADM(file$) gIPRINT "Loaded "+file$ LoadedModules$(free%)=file$ ENDIF ENDP PROC UnloadModule: EXTERNAL LoadedModules$() LOCAL release% release% = mPOPUP(0,0,0,LoadedModules$(1),1, LoadedModules$(2),2, LoadedModules$(3),3, LoadedModules$(4),4, LoadedModules$(5),5, LoadedModules$(6),6, LoadedModules$(7),7, LoadedModules$(8),8) IF (release%<>0) AND (LoadedModules$(release%)<>"") UNLOADM(LoadedModules$(release%)) gIPRINT "Unloaded "+LoadedModules$(release%) LoadedModules$(release%)="" ENDIF ENDP PROC CmdP%: EXTERNAL OverPrint%, DrawAxes%, f$, overprintcount% IF NOT OverPrint% gCLS overPrintCount%=0 ENDIF IF DrawAxes% Axis: ENDIF Caption: PlotFunction:(f$) RETURN 0 ENDP PROC CmdF%: EXTERNAL f$ f$=GetFunction$:(f$) RETURN 0 ENDP PROC CmdR%: GetRange: RETURN 0 ENDP PROC CmdE%: EXTERNAL QuitFlag% QuitFlag%=KTrue% Return 0 ENDP EXTERNAL Graph_Pass:(f$) EXTERNAL PlotPerms:(p%,max%) PROC PlotFunction:(orig$) GLOBAL f$(255), items%(255) LOCAL i%, j%, c% f$=orig$ i%=1 j%=1 DO c%=PEEKB(ADDR(f$)+i%) IF c% = %± items%(j%)=i% j%=j%+1 ENDIF i%=i%+1 UNTIL i%=LEN(orig$) IF j%=1 GRAPH_PASS:(f$) ELSE PlotPerms:(1,j%) ENDIF ENDP PROC PlotPerms:(p%,max%) EXTERNAL f$, items%() IF p%=max% : RETURN : ENDIF IF p%=1 OR (p%>1 AND (PEEKB(ADDR(f$)+p%)=%( )) POKEB ADDR(f$)+items%(p%),32 ELSE POKEB ADDR(f$)+items%(p%),%+ ENDIF PlotPerms:(p%+1,max%) GRAPH_PASS:(f$) POKEB ADDR(f$)+items%(p%),%- PlotPerms:(p%+1,max%) GRAPH_PASS:(f$) ENDP PROC Graph_Pass:(f$) EXTERNAL WinH%, WinW%, RMin, RMax, Mesh&, DrawWindow% EXTERNAL Zoom, XCent%, YCent%, Offscreen%, Uselines% GLOBAL x LOCAL y, max%, isMove%, Step, Scale Step = RMax/Mesh& IF Zoom > 0 Scale = (WinW%/(RMax-RMin)) * Zoom ELSE Scale = (WinW%/(RMax-RMin)) / (-Zoom) ENDIF isMove%=KTrue% x=RMin BUSY "Plotting..." ONERR ErrHandler gUSE DrawWindow% WHILE x <= RMax y=(EVAL(f$))*Scale IF (yCent%-y > (WinH%*2)) AND (NOT Offscreen%) isMove%=KTrue% ENDIF IF isMove% gAT (x*Scale)+xCent%, yCent%-y isMove%=KFalse% ELSEIF UseLines% GLINETO (x*Scale)+xCent%, yCent%-y ELSE gAT (x*Scale)+xCent%, yCent%-y gLINEBY 0, 0 ENDIF x=x+Step CONTINUE ErrHandler:: IF ERR = KErrDivideByZero% isMove% = KTrue% ELSEIF (ERR = KErrUnderflow%) OR (ERR = KErrOverflow%) OR (ERR = KErrInvalidArgs%) isMove% = KTrue% ELSE ALERT(ERR$(ERR),"("+GEN$(ERR,3)+")") BUSY OFF : ONERR OFF : RETURN ENDIF x=x+Step ENDWH BUSY OFF ONERR OFF ENDP PROC Axis: EXTERNAL WinH%, WinW%, RMin, RMax EXTERNAL Zoom, yCent%, xCent%, DrawWindow% LOCAL x, y, i%, max%, Scale IF Zoom > 0 Scale = (WinW%/(RMax-RMin)) * Zoom ELSE Scale = (WinW%/(RMax-RMin)) / (-Zoom) ENDIF gUSE DrawWindow% gAT (RMin*Scale)+XCent%, yCent% gLINETO (RMax*Scale)+XCent%, yCent% gAT xCent%, 0 gLINETO xCent%, WinH% max% = Mod&:(WinW%,Scale) i%=RMin gFONT KFontArialNormal8& DO gAT i%*Scale+XCent%, yCent% gLineBy 0,5 IF i% <> 0 gAT i%*Scale+XCent%-5, yCent%+12 gPRINT i% ENDIF gAT XCent%,yCent%-(Scale*i%) gLineBy 5,0 IF i% <> 0 gAT XCent%+5,yCent%-(Scale*i%) gPRINT i% ENDIF i%=i%+1 UNTIL i% > RMax ENDP PROC Caption: EXTERNAL WinH%, f$, RMin, RMax, overPrintCount% LOCAL ypos% gFONT KFontArialNormal11& ypos% = WinH% - 6 - (overPrintCount%*11) gAT 5,ypos% gPRINT f$+" "+GEN$(RMin,3)+" <" gMOVE -gTWIDTH("<"),0 gPRINT "_ x <" gMOVE -gTWIDTH("<"),0 gPRINT "_ "+GEN$(RMax,3) ENDP