Easy drawer | |
guest2 | 11-Feb-2007/2:00:21+1:00 |
J'ai fait un ptit script pour faciliter l'écriture de blocs Draw. Avant de le poster sur rebol.org, faites moi part de vos remarques. Et aussi, si vous pouviez corriger mon anglais. REBOL [] num: charset "0123456789" pair: [opt "-" some num "x" opt "-" some num ] integer: [opt "-" some num ] error: none err?: func [blk /local arg1 arg2 arg3 message err][ error: none if not error? set/any 'err try blk [return :err] err: disarm err set [arg1 arg2 arg3][err/arg1 err/arg2 err/arg3] message: get in get in system/error err/type err/id if block? message[bind message 'arg1] message: reform reduce message error: reduce [ make get-style 'text [ text: message font: make font [color: red] color: yellow offset: as-pair 0 src/size/y - 20 size: offset + as-pair src/size/x 20 ] make face [ offset: either err/near [ any [ attempt [0x14 + caret-to-offset src find src/text find/tail err/near ") "] as-pair 0 src/size/y ] ][ as-pair 0 src/size/y ] size: as-pair src/size/x 1 effect: compose/deep [draw [pen red line 0x0 (as-pair src/size/x 0)]] ] ] [] ;necessary to return nothing ] board: [] view/new layout [ origin 0x0 space 5x0 across label "rate" rate: field 30 form 50 [f-board/rate: load rate/text] label "size" size: field 60 form 300x450 [ f-board/size: load size/text f-board/parent-face/size: 0x20 + load size/text show f-board/parent-face ] below f-board: box 300x450 white rate 50 effect [draw []] feel [ engage: func [face action event][ poke face/effect 2 err? [compose/deep board] show face ] ] ] box: make get-style 'box [ sv-scroll: 0x0 sv-event: none sv-data: none edge: make edge [color: yellow size: 1x1 effect: 'bevel] feel: make feel [ redraw: func [f a][if a = 'show [ f/offset: f/offset - f/sv-scroll + f/sv-scroll: f/parent-face/para/scroll ]] engage: func [f action event][ switch event/type [ down [sv-event: event sv-data: f/data] move [ f/data: sv-data + either pair? f/data [ event/offset - sv-event/offset ][ event/offset/y - sv-event/offset/y ] remove/part f/caret f/len insert f/caret form f/data f/len: length? form f/data board: err? [load src/text] refresh src ] up [ system/view/focal-face: src system/view/caret: offset-to-caret src f/offset + sv-event/offset show src ] ] ] ] ] cross: make get-style 'image [ reference: none feel: make feel [ engage: func [f a e][ f/reference/feel/engage f/reference a context [offset: e/offset + f/offset type: e/type] f/offset: f/reference/data show f ] ] ] refresh: func [f][ f/pane: clear [] f-board/pane: clear [] parse/all f/text [ any [ start: copy val [pair | integer] fin: ( val: load val append f/pane ref: make box [ offset: (caret-to-offset f start) - 1x1 size: (caret-to-offset f fin) - offset + 0x12 data: val caret: start len: offset? start fin paren-face: f sv-scroll: f/para/scroll ] if pair? val [ append f-board/pane make cross [ offset: val - 2x2 size: 4x4 effect: [cross red] reference: ref ] ] ) | skip ] ] if error [append f/pane error ] sav-text: cp f/text show src ] ask-refresh: make get-style 'btn [ text: "Refresh" do init size: size - 0x5 action: [ err? [draw load system/words/size/text compose/deep load src/text] refresh src unless error [board: load src/text] ] ] editor search: join ";Enter you draw code" newline ; hack editor: find the face where the text is pasted edit: system/view/screen-face/pane/2 repeat face edit/pane [if face/text = search [src: face break]] src/feel/engage: func [f a e] compose [(get in src/feel 'engage) f a e if f/text <> sav-text [ f-board/pane: clear [] f/pane: clear [] ask-refresh/offset: 20x-15 + caret-to-offset f system/view/caret append f/pane ask-refresh ] ] sav-text: cp src/text: mold/only [ ( unless value? 'font [ font: reduce [ make face/font [size: 11] make face/font [size: 33] ] ] unless value? 'iter [ iter: func [idx start end step /local stack][ stack: head [] while [tail? stack: at head stack idx] [insert tail stack none] if stack/1 = none [stack/1: end ] stack/1: stack/1 + step if stack/1 > end [stack/1: start] stack/1 ] ] [] ;return nothing ) pen (255.0.0 + (0.255.255 * sine iter 1 0 360 10)) font font/2 line-width 1 fill-pen radial 200x200 0 100 0 1 1 blue green red yellow text vectorial 18x-4 {Easy Drawer} pen blue font font/1 line-width 1 fill-pen none text 44x36 { - or a way thru the killer application} pen black text 20x56 { Easy drawer is an editor which furnish an easy way to test draw commands. First, you have the source editor based on the native rebol editor with some ehancements - When you modify the source, you have to refresh the Draw board. To allow that, push the flying button "Refresh". - All pair! and integer! values can be directly modified by draging them with the mouse. It's a speed manner to see the effects of any change. } pen blue text 97x217 "circle 70x70" text 166x218 (form siz: iter 5 1 25 1) circle 249x232 siz arrow 1x0 line (181x238 + pos: iter 6 1 10 0.3) (169x224 + pos) text (183x235 + pos) "drag" pen black arrow 0x0 text 21x251 { - When you write false syntax, you'll not have a crash but an indication of the error and the line in cause will be underlined (depending of the error). The Draw board shows you what you expect, at least... Sometimes, You'll see some small red cross allowing to move the different items associated. And the "awesome" feature is that you will see (in direct) the effect of those updates in the source. } pen red text 19x370 { I know, there is some explainations to give about how i perform these funny animations, but i let you inspect the source, it's easy to understand. } pen black image logo.gif 210x21 293x32 red text 211x9 "Powered by" pen blue rotate 25 text vectorial "D e m o" (93x-42 + (1x10 * sine iter 3 0 360 10)) ] show src board: err? [load src/text] refresh src do-events | |
neoreb | 11-Feb-2007/10:28:28+1:00 |
pour le code je peux rien te dire: Pour l'anglais, j'ai modifié un peu, mais je suis pas toujours sur du sens de tes phrases. editor search: join ";Enter youR draw code" newline Easy drawer is an editor which gives an easy way to test draw commands. The source editor is an enhanced version of the native rebol editor. - IF you modify the source then you need to refresh the Draw board by pushing the flying button "Refresh". - All pair! and integer! values can directly be modified by dragging them with the mouse. It is a quick way to see the effects of any modification. If you use a wrong syntax then it does not crash but the incorrect line is underlined (depending ON the error). The Draw board shows you what you expect to see, at least... sometimes, You can see some small red crosses allowing you to move the different items associated (associés à quoi ?). The "awesome" feature is that you can see in real time the effect of those updates on the source. I know, there are some explainations to give about how I perform these funny animations, but i let you inspect the source, it is easy to understand (ah bon) | |
neoreb | 11-Feb-2007/10:30:46+1:00 |
j'ai oublié: explanations et pas "explainations" | |
guest2 | 11-Feb-2007/14:11:53+1:00 |
Merci merci neoreb. Mais as-tu lancé le script au moins ? (Les petites croix rouges servent à bouger les éléments graphiques dans ce que j'appelle le Draw Board.) | |
neoreb | 11-Feb-2007/15:40:36+1:00 |
oui mais j'ai pas trop compris (bon j'ai pas cherché a comprendre vu que je suis plongé dans les abysses de view) J'ai vu un editeur, une fenetre avec des croix rouges qui si elles sont deplacees modifient le source et c'est tout (pas de flying bouton refresh) Je regarderai ça plus en details plus tard. | |
guest2 | 11-Feb-2007/16:01:53+1:00 |
ben en fait quand tu es dans le source, tu peux cliquer sur les valeurs (encadrées en jaune) et les faire glisser pour les modifier, ça a le même effet que de bouger les croix rouges sauf qu'il y a plus de choix. | |
neoreb | 11-Feb-2007/16:05:58+1:00 |
ok je pense que tu voulais dire You can see some small red crosses allowing you to move the different CORRESPONDING items | |
guest2 | 11-Feb-2007/17:10:25+1:00 |
hmmm... ok anyway, c'est posté sur rebol.org. | |
Didec | 12-Feb-2007/11:09:22+1:00 |
Très sympa Etant donnée la taille du code, c'est même impressionnant. Il serait pas mal de repérer les tuple! aussi dans le parseur. Car sinon on se retourve avec des valeurs négatives ou supérieur à 255 dans le tuple et c'est pas "normal". Félicitation pour ce travail. Ca me donne envie de me remettre à bosser sur mon draw-editor, mais, j'ai si peu de temps | |
guest2 | 12-Feb-2007/14:35:28+1:00 |
Merci Didec, Pour les tuples c'est pas si grâve, vue que l'erreur ne fait pas planter le bouzin. Et puis si je les reconnaissais en tant que tuple! j'aurais un problème pour savoir quelle partie faire varier quand on fait un drag. | |
Didec | 12-Feb-2007/17:08:20+1:00 |
On peut imaginer un 'box spécial pour les tupple!, à 3 cases et on fait varier la valeur de la case où a commencé le clic. | |
guest2 | 12-Feb-2007/20:02:28+1:00 |
Mouiii, mais en fait ça marche déjà comme ça, il fait 3 cases par tuple. sauf que ça n'interdit pas les valeurs négatives ou superieure à 255. Je vais y penser, mais je ne voudrais pas trop alourdir le script. Je continue de penser que ce n'est pas trop grave, vu que la gestion des erreurs détecte lee tuples invalides en temps réel et qu'il suffit de corriger sans lacher la souris. | |
guest2 | 12-Feb-2007/20:08:02+1:00 |
Je vais ptet poster sous peu une nouvelle version qui tient compte des 'translate et autres 'rotate pour mieux positionner les petites croix rouges dans le draw Board. C'est pas une évolution majeure mais bon... Si vous avez des suggestions d'évolutions, c'est le moment. | |
jocko | 12-Feb-2007/20:23:15+1:00 |
en tout cas, félicitations pour ce travail remarquable ! | |
guest2 | 12-Feb-2007/20:33:41+1:00 |
un truc qui serait sympa, c'est que RT mette en place un Reb service pour télécharger des librairies de codes draw. ça permettrait à des applications comme Esay draw de piocher des logos ou des dessins déjà faits par d'autres. Il suffirait de prévoir une interface dans rebol.org pour rentrer de nouvelles créations. il faudrait aussi prévoir un format standard: par exemple les dessin devra toujours être collé en haut à gauche aux coordonnées 0x0. De cette façon il sera facile de l'insérer dans une composition existante un insérant un 'translate devant. De la même façon, on pourrait aussi prévoir un standard pour les animations. | |
guest2 | 12-Feb-2007/20:34:36+1:00 |
Merci jocko, c'est pas grand chose. | |
guest2 | 12-Feb-2007/20:45:36+1:00 |
J'ai dit une connerie précédemment (une de plus). Les dessins de la librairie ne devrait pas être collés en haut à gauche , mais centrés aux coordonnées 0x0. Ca permettrait d'appliquer facilement des rotations avant le translate. | |
neoreb | 26-Feb-2007/16:02:23+1:00 |
Je viens de tester ton prog sous windows et je comprends pourquoi je n'avais rien compris la premiere fois. La premiere fois que j'ai testé ton prg easy draw, c'etait sous linux et là on ne voyait que les croix rouges et rien d'autre. As-tu testé ton prog sous linux ? | |
guest2 | 26-Feb-2007/17:56:27+1:00 |
nah, pas testé. Mais je sais que sous linux y'a des problèmes avec Draw. Surtout avec les fontes vectorielles, faut faire un truc en plus pour les voir, je modifierai mon script à l'occasion. | |
neoreb | 26-Feb-2007/18:09:28+1:00 |
j'ai constaté aussi que q-plot.r avaient quelques pbs sous linux. easy draw est impressionnant! | |
Login required to Post. |