home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 874 / Plotter.sis / plotter(noclip).opl (.txt) < prev    next >
Encoding:
EPOC OPL Source  |  2000-09-27  |  9.8 KB  |  636 lines

  1.  
  2.  
  3. REM Plotter translated file
  4. REM This is not the original source code. This was automaticaly generated by OPL+.
  5. REM ┬⌐ 1999-2000 Glenn Strong <Glenn.Strong@cs.tcd.ie>
  6. REM Issued under the GNU General Public license, version 2
  7.  
  8.  
  9.  
  10.  
  11. DECLARE EXTERNAL
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. INCLUDE "const.oph"
  22. INCLUDE "System.oxh"
  23. INCLUDE "Toolbar.oph"
  24.  
  25. PROC Main:
  26. LOADM "Z:\System\Opl\Toolbar.opo"
  27. TBarLink:("MainLoop")
  28. ENDP
  29.  
  30. EXTERNAL buf$:(b&)
  31. EXTERNAL mainDialog%:
  32. EXTERNAL SetupMenu:
  33. EXTERNAL GetFunction$:(f$)
  34. EXTERNAL GetRange:
  35. EXTERNAL GetMesh:
  36. EXTERNAL GetZoom:
  37. EXTERNAL GetCenter:
  38. EXTERNAL LoadModule:
  39. EXTERNAL UnloadModule:
  40.  
  41. CONST BW%=10
  42. CONST KMax=1.0
  43. CONST MaxZoom%=10
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. EXTERNAL PlotFunction:(f$)
  74.  
  75. EXTERNAL Axis:
  76.  
  77. EXTERNAL Caption:
  78.  
  79. PROC MainLoop:
  80. EXTERNAL TbWidth%, TVisible%, TbMenuSym%
  81.  
  82. GLOBAL WinH%, WinW%, Zoom, Mesh&, Offscreen%, Overprint%
  83. GLOBAL XCent%, YCent%, DrawAxes%, QuitFlag%, UseLines%, overPrintCount%
  84. GLOBAL LoadedModules$(8,255)
  85.  
  86. GLOBAL RMin, RMax, f$(255), drawWindow%
  87. LOCAL k%, mod%, ev&(16), blank%, file$(KDFileNameLen%)
  88.  
  89. k%=1
  90. DO
  91. LoadedModules$(k%)=""
  92. k%=k%+1
  93. UNTIL k%>8
  94.  
  95. drawWindow%=gIDENTITY
  96. blank%=gCREATEBIT(1,1)
  97. gUSE drawWindow%
  98. overPrintCount%=0
  99.  
  100. TBarInit:("Plotter",gWIDTH,gHEIGHT)
  101. TBarButt:("p",1,"Plot",0,blank%,0,0)
  102. TBarButt:("f",2,"Func",0,blank%,0,0)
  103. TBarButt:("r",3,"Range",0,blank%,0,0)
  104. TBarButt:("e",4,"Exit",0,blank%,0,0)
  105. TBarShow:
  106.  
  107. gUPDATE ON
  108.  
  109. WinH% = gHEIGHT - BW%
  110. WinW% = gWIDTH - BW% - TBWidth%
  111. XCent% = WinW%/2
  112. YCent% = WinH%/2
  113.  
  114. Offscreen%=KFalse% : Zoom=1.0 : Mesh&=WinW%/10
  115. f$="SIN(x)" : RMin=-6.0 : RMax=6.0
  116. DrawAxes%=KTrue% : OverPrint%=KFalse% : UseLines%=KTrue%
  117.  
  118. QuitFlag%=KFalse%
  119.  
  120. DO
  121. GETEVENT32 ev&()
  122.  
  123. IF ev&(KEvAType%)=KEvPtr&
  124. IF TBarOffer%:(ev&(KEvAPtrOplWindowId%),ev&(KEvAPtrType%),ev&(KEvAPtrPositionX%),ev&(KEvAPtrPositionY%))
  125. CONTINUE
  126. ENDIF
  127. ELSEIF ((ev&(KEvAType%) AND &400)=0) OR (ev&(KEvAType%)=KKeySidebarMenu32%)
  128. k%=ev&(KEvAType%)
  129. mod%=ev&(KEvAKMod%)
  130. IF (k%=KKeyMenu32%) OR (k%=KKeySidebarMenu32%)
  131. SetupMenu:
  132. k%=MENU
  133. mod%=0
  134. ELSEIF mod% AND KKmodControl%
  135. k%=k%+$60
  136. IF mod% AND KKmodShift%
  137. k%=k%-32
  138. ENDIF
  139. ELSE
  140. CONTINUE
  141. ENDIF
  142.  
  143. IF k%=%c
  144.  
  145. gIPRINT "Not implemented (sorry)"
  146.  
  147.  
  148.  
  149.  
  150.  
  151. ELSEIF k%=%C
  152. gCLS
  153. overPrintCount%=0
  154. ELSEIF k%=%f
  155. f$=GetFunction$:(f$)
  156. ELSEIF k%=%r
  157. GetRange:
  158. ELSEIF k%=%M
  159. LoadModule:
  160. ELSEIF k%=%U
  161. UnloadModule:
  162. ELSEIF k%=%p
  163. IF NOT OverPrint%
  164. gCLS
  165. overPrintCount%=0
  166. ELSE
  167. overPrintCount%=overPrintCount%+1
  168. ENDIF
  169. IF DrawAxes%
  170. Axis:
  171. ENDIF
  172. Caption:
  173. PlotFunction:(f$)
  174. ELSEIF k%=%m
  175. GetMesh:
  176. ELSEIF k%=%z
  177. GetZoom:
  178. ELSEIF k%=%o
  179. GetCenter:
  180. ELSEIF k%=%O
  181. XCent% = WinW%/2
  182. YCent% = WinH%/2
  183. gIPRINT "Origin reset"
  184. ELSEIF k%=%G
  185. Offscreen% = NOT Offscreen%
  186. IF Offscreen%
  187. gIPRINT "Offscreen set"
  188. ELSE
  189. gIPRINT "Offscreen unset"
  190. ENDIF
  191. ELSEIF k%=%v
  192. Overprint% = NOT Overprint%
  193. ELSEIF k%=%x
  194. DrawAxes% = NOT DrawAxes%
  195. IF DrawAxes%
  196. gIPRINT "Axes On"
  197. ELSE
  198. gIPRINT "Axes off"
  199. ENDIF
  200. ELSEIF k%=%q
  201. Uselines% = NOT UseLines%
  202. IF Uselines%
  203. gIPRINT "Lines on"
  204. ELSE
  205. gIPRINT "Lines off"
  206. ENDIF
  207. ELSEIF k%=%t
  208. IF TbMenuSym%<>KMenuCheckBox%
  209. TbarHide:
  210. WinW% = gWIDTH - BW%
  211. XCent% = WinW%/2
  212. ELSE
  213. TbarShow:
  214. WinW% = gWIDTH - BW% - TBWidth%
  215. XCent% = WinW%/2
  216. ENDIF
  217. ELSEIF k%=%s
  218. dINIT "Export MBM file"
  219. dFILE file$, "File,Folder,Disk", KDFileEditBox%+KDFileEditorQueryExisting%
  220. dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
  221. IF DIALOG<>0
  222. gIPRINT "Saving..."
  223. gSAVEBIT file$
  224. ELSE
  225. gIPRINT "Cancelled..."
  226. ENDIF
  227. ELSEIF k%=%e
  228. QuitFlag%=KTrue%
  229. ELSEIF k%=%a
  230. dINIT "About this program"
  231. dTEXT "Plotter ","version 1.0", KDTextRight%
  232. dTEXT "", "┬⌐ 1999-2000 Glenn Strong", KDTextCentre%
  233. dTEXT "", "Free software under the GPL", KDTextCentre%
  234. dTEXT "","", KDTextSeparator%
  235. dTEXT "", "Glenn.Strong@cs.tcd.ie", KDTextCentre%
  236. dTEXT "","http://www.cs.tcd.ie/Glenn.Strong/epoc/", KDTextCentre%
  237. dBUTTONS "OK", KDButtonEnter% OR KDButtonNoLabel%
  238. DIALOG
  239. ENDIF
  240. ENDIF
  241. UNTIL QuitFlag%
  242. ENDP
  243.  
  244.  
  245.  
  246. PROC buf$:(b&)
  247. LOCAL l%, w&, s$(255)
  248. w& = PEEKL(b&)
  249. l% = MIN(255,w&)
  250. POKEB (b&+3),l%
  251. s$=PEEK$(b&+3)
  252. POKEL b&, w&
  253. RETURN s$
  254. ENDP
  255.  
  256.  
  257.  
  258. PROC SetupMenu:
  259. EXTERNAL Offscreen%, DrawAxes%, OverPrint%, TbMenuSym%
  260. EXTERNAL Uselines%
  261. LOCAL OSOption%, AXOption%, OPOption%, LIOption%
  262.  
  263. OSOption% = KMenuCheckBox%
  264. IF Offscreen% : OSOption% = OSOption% OR KMenuSymbolOn% : ENDIF
  265.  
  266. AXOption% = KMenuCheckBox%
  267. IF DrawAxes% : AXOption% = AXOption% OR KMenuSymbolOn% : ENDIF
  268.  
  269. OPOption% = KMenuCheckBox%
  270. IF OverPrint% : OPOption% = OPOption% OR KMenuSymbolOn% : ENDIF
  271.  
  272. LIOption% = KMenuCheckBox%
  273. IF UseLines%
  274. LIOption% = LIOption% OR KMenuSymbolOn%
  275. ENDIF
  276.  
  277. mINIT
  278. mCARD "File","Export plot...",%s,"Close",%e
  279. mCARD "Edit","Copy",%c,"Erase",%C
  280.  
  281. mCARD "Function","Set...",%f,"Range...",%r, "Load module...", %M, "Unload module...", %U
  282.  
  283. mCARD "Graph", "Plot",%p, "Mesh...",%m, "Zoom",%z, "Set origin",%o, "Reset origin", %O
  284.  
  285.  
  286.  
  287.  
  288. 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%)
  289. mCARD "Help", "About...", %a
  290. ENDP
  291.  
  292.  
  293.  
  294. PROC GetFunction$:(f$)
  295. LOCAL b&(64), t$(255), k%, i%, p&
  296.  
  297. POKE$ ADDR(b&())+3,f$
  298. POKEL ADDR(b&()), LEN(f$)
  299. dINIT "Function"
  300. dEDITMULTI ADDR(b&()), "f(x)=",15,3,255
  301. dBUTTONS "OK",%o,"Cancel",KKeyEsc%
  302. k%=DIALOG
  303. IF k%=%o
  304. t$=buf$:(ADDR(b&()))
  305.  
  306. i%=1
  307. p&=ADDR(t$)
  308. WHILE i%<=LEN(t$)
  309. IF PEEKB(p&+i%) < 32
  310. POKEB p&+i%,32
  311. ENDIF
  312. i%=i%+1
  313. ENDWH
  314. RETURN t$
  315. ELSE
  316. RETURN f$
  317. ENDIF
  318. ENDP
  319.  
  320.  
  321. PROC GetRange:
  322. EXTERNAL RMin, RMax
  323. dINIT "Select Range of x"
  324. dFLOAT RMin, " From ", -100, 100
  325. dFLOAT RMax, " To ", -100, 100
  326. dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  327. DIALOG
  328. ENDP
  329.  
  330.  
  331. PROC GetMesh:
  332. EXTERNAL Mesh&, WinW%
  333. dINIT "Mesh granularity"
  334. dLONG Mesh&,"Mesh:",1,WinW%
  335. dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  336. DIALOG
  337. ENDP
  338.  
  339.  
  340. PROC GetZoom:
  341. EXTERNAL Zoom, WinW%
  342. LOCAL z&
  343. z&=Zoom
  344. dINIT "Zoomlevel"
  345. dLONG z&, "Zoom:", -MaxZoom%, MaxZoom%
  346. dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  347. IF DIALOG
  348. IF z&=0
  349. z&=1
  350. ENDIF
  351. Zoom=z&
  352. ENDIF
  353. ENDP
  354.  
  355.  
  356. PROC GetCenter:
  357. EXTERNAL XCent%, YCent%
  358. LOCAL ev&(16), done%
  359. BUSY "Tap new origin"
  360. done%=KFalse%
  361. DO
  362. GETEVENT32 ev&()
  363. IF ev&(KEvAType%)=KEvPtr&
  364. XCent%=ev&(KEvAPtrPositionX%)
  365. YCent%=ev&(KEvAPtrPositionY%)
  366. Done%=KTrue%
  367. ELSEIF ev&(KEvAType%)=KEvKeyDown&
  368. Done% = ev&(3)=4
  369. ENDIF
  370. UNTIL Done%
  371. BUSY OFF
  372. ENDP
  373.  
  374. PROC LoadModule:
  375. EXTERNAL LoadedModules$()
  376. LOCAL file$(255), free%
  377. free%=1
  378. WHILE (free%<9) AND (LoadedModules$(free%)<>"")
  379. free%=free%+1
  380. ENDWH
  381. IF free%=9
  382. ALERT("Can't load any more modules!")
  383. RETURN
  384. ENDIF
  385. dINIT "Load a module"
  386. dFILE file$, "File,Folder,Disk", 0, 0, KUidOPO&, 0
  387. dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
  388. IF DIALOG<>0
  389. LOADM(file$)
  390. gIPRINT "Loaded "+file$
  391. LoadedModules$(free%)=file$
  392. ENDIF
  393. ENDP
  394.  
  395. PROC UnloadModule:
  396. EXTERNAL LoadedModules$()
  397. LOCAL release%
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405. 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)
  406. IF (release%<>0) AND (LoadedModules$(release%)<>"")
  407. UNLOADM(LoadedModules$(release%))
  408. gIPRINT "Unloaded "+LoadedModules$(release%)
  409. LoadedModules$(release%)=""
  410. ENDIF
  411. ENDP
  412.  
  413.  
  414.  
  415.  
  416. PROC CmdP%:
  417. EXTERNAL OverPrint%, DrawAxes%, f$, overprintcount%
  418. IF NOT OverPrint%
  419. gCLS
  420. overPrintCount%=0
  421. ENDIF
  422. IF DrawAxes%
  423. Axis:
  424. ENDIF
  425. Caption:
  426. PlotFunction:(f$)
  427. RETURN 0
  428. ENDP
  429.  
  430.  
  431. PROC CmdF%:
  432. EXTERNAL f$
  433. f$=GetFunction$:(f$)
  434. RETURN 0
  435. ENDP
  436.  
  437.  
  438. PROC CmdR%:
  439. GetRange:
  440. RETURN 0
  441. ENDP
  442.  
  443.  
  444. PROC CmdE%:
  445. EXTERNAL QuitFlag%
  446. QuitFlag%=KTrue%
  447. Return 0
  448. ENDP
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456. EXTERNAL Graph_Pass:(f$)
  457.  
  458.  
  459.  
  460.  
  461. EXTERNAL PlotPerms:(p%,max%)
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469. PROC PlotFunction:(orig$)
  470. GLOBAL f$(255), items%(255)
  471. LOCAL i%, j%, c%
  472. f$=orig$
  473. i%=1
  474. j%=1
  475.  
  476. DO
  477. c%=PEEKB(ADDR(f$)+i%)
  478. IF c% = %┬▒
  479. items%(j%)=i%
  480. j%=j%+1
  481. ENDIF
  482. i%=i%+1
  483. UNTIL i%=LEN(orig$)
  484.  
  485.  
  486.  
  487.  
  488. IF j%=1
  489. GRAPH_PASS:(f$)
  490. ELSE
  491. PlotPerms:(1,j%)
  492. ENDIF
  493. ENDP
  494.  
  495.  
  496.  
  497. PROC PlotPerms:(p%,max%)
  498. EXTERNAL f$, items%()
  499.  
  500.  
  501. IF p%=max% : RETURN : ENDIF
  502.  
  503.  
  504. IF p%=1 OR (p%>1 AND (PEEKB(ADDR(f$)+p%)=%( ))
  505. POKEB ADDR(f$)+items%(p%),32
  506. ELSE
  507. POKEB ADDR(f$)+items%(p%),%+
  508. ENDIF
  509. PlotPerms:(p%+1,max%)
  510. GRAPH_PASS:(f$)
  511.  
  512.  
  513. POKEB ADDR(f$)+items%(p%),%-
  514. PlotPerms:(p%+1,max%)
  515. GRAPH_PASS:(f$)
  516. ENDP
  517.  
  518.  
  519.  
  520.  
  521. PROC Graph_Pass:(f$)
  522. EXTERNAL WinH%, WinW%, RMin, RMax, Mesh&, DrawWindow%
  523. EXTERNAL Zoom, XCent%, YCent%, Offscreen%, Uselines%
  524. GLOBAL x
  525. LOCAL y, max%, isMove%, Step, Scale
  526.  
  527. Step = RMax/Mesh&
  528. IF Zoom > 0
  529. Scale = (WinW%/(RMax-RMin)) * Zoom
  530. ELSE
  531. Scale = (WinW%/(RMax-RMin)) / (-Zoom)
  532. ENDIF
  533.  
  534. isMove%=KTrue%
  535. x=RMin
  536. BUSY "Plotting..."
  537. ONERR ErrHandler
  538. gUSE DrawWindow%
  539.  
  540.  
  541.  
  542. WHILE x <= RMax
  543. y=(EVAL(f$))*Scale
  544. IF (yCent%-y > (WinH%*2)) AND (NOT Offscreen%)
  545. isMove%=KTrue%
  546. ENDIF
  547. IF isMove%
  548. gAT (x*Scale)+xCent%, yCent%-y
  549. isMove%=KFalse%
  550. ELSEIF UseLines%
  551. GLINETO (x*Scale)+xCent%, yCent%-y
  552. ELSE
  553. gAT (x*Scale)+xCent%, yCent%-y
  554. gLINEBY 0, 0
  555. ENDIF
  556. x=x+Step
  557. CONTINUE
  558.  
  559. ErrHandler::
  560.  
  561.  
  562. IF ERR = KErrDivideByZero%
  563. isMove% = KTrue%
  564. ELSEIF (ERR = KErrUnderflow%) OR (ERR = KErrOverflow%) OR (ERR = KErrInvalidArgs%)
  565. isMove% = KTrue%
  566. ELSE
  567.  
  568. ALERT(ERR$(ERR),"("+GEN$(ERR,3)+")")
  569. BUSY OFF : ONERR OFF : RETURN
  570. ENDIF
  571. x=x+Step
  572. ENDWH
  573. BUSY OFF
  574. ONERR OFF
  575. ENDP
  576.  
  577.  
  578. PROC Axis:
  579. EXTERNAL WinH%, WinW%, RMin, RMax
  580. EXTERNAL Zoom, yCent%, xCent%, DrawWindow%
  581. LOCAL x, y, i%, max%, Scale
  582.  
  583. IF Zoom > 0
  584. Scale = (WinW%/(RMax-RMin)) * Zoom
  585. ELSE
  586. Scale = (WinW%/(RMax-RMin)) / (-Zoom)
  587. ENDIF
  588.  
  589. gUSE DrawWindow%
  590.  
  591. gAT (RMin*Scale)+XCent%, yCent%
  592. gLINETO (RMax*Scale)+XCent%, yCent%
  593.  
  594.  
  595. gAT xCent%, 0
  596. gLINETO xCent%, WinH%
  597.  
  598. max% = Mod&:(WinW%,Scale)
  599. i%=RMin
  600. gFONT KFontArialNormal8&
  601. DO
  602. gAT i%*Scale+XCent%, yCent%
  603. gLineBy 0,5
  604. IF i% <> 0
  605. gAT i%*Scale+XCent%-5, yCent%+12
  606. gPRINT i%
  607. ENDIF
  608. gAT XCent%,yCent%-(Scale*i%)
  609. gLineBy 5,0
  610. IF i% <> 0
  611. gAT XCent%+5,yCent%-(Scale*i%)
  612. gPRINT i%
  613. ENDIF
  614. i%=i%+1
  615. UNTIL i% > RMax
  616. ENDP
  617.  
  618.  
  619.  
  620. PROC Caption:
  621. EXTERNAL WinH%, f$, RMin, RMax, overPrintCount%
  622. LOCAL ypos%
  623. gFONT KFontArialNormal11&
  624. ypos% = WinH% - 6 - (overPrintCount%*11)
  625.  
  626. gAT 5,ypos%
  627. gPRINT f$+"    "+GEN$(RMin,3)+" <"
  628. gMOVE -gTWIDTH("<"),0
  629. gPRINT "_ x <"
  630. gMOVE -gTWIDTH("<"),0
  631. gPRINT "_ "+GEN$(RMax,3)
  632. ENDP
  633.  
  634.  
  635.  
  636.