FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» PANORAMIC V 1
Boîte à outils de dessin Emptypar papydall Aujourd'hui à 2:21

» Gestion d'un système client-serveur.
Boîte à outils de dessin Emptypar Klaus Hier à 23:59

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Boîte à outils de dessin Emptypar Marc Hier à 12:14

» @Jack
Boîte à outils de dessin Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Boîte à outils de dessin Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Boîte à outils de dessin Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Boîte à outils de dessin Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Boîte à outils de dessin Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Boîte à outils de dessin Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Boîte à outils de dessin Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Dessine-moi une galaxie
Boîte à outils de dessin Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Boîte à outils de dessin Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Boîte à outils de dessin Emptypar papydall Dim 21 Avr 2024 - 23:30

» 2D_fill_color(résolu)
Boîte à outils de dessin Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
Boîte à outils de dessin Emptypar leclode Mer 17 Avr 2024 - 11:07

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -28%
Brandt LVE127J – Lave-vaisselle encastrable 12 ...
Voir le deal
279.99 €

 

 Boîte à outils de dessin

Aller en bas 
5 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 14 Fév 2016 - 14:28

J'ai amélioré (j'espère) une boîte à outils que j'ai déjà donné quelque part.
Sous forme de SUB, et sans faire appel à des ressources externes à Panoramic, donc pratique à intégrer n'importe où.
Les paramètres d'appel sont:
- les coordonnées d'affichage de la boîte
- le numéro d'objet Picture sur lequel sera effectué le dessin. Ce Picture peut être vierge ou déjà contenir une image quelconque.
Boîte à outils de dessin Dessin10
Avec un exemple d'appel très succinct:
Code:

Picture 1: Full_Space 1
Dessin(0,Height(0),1)
Terminate
' ==============================================================================
SUB Dessin(xa%,ya%,p%)
' Boîte à outils affichée en xa%,ya% pour dessiner sur le picture p%
' Variables définies dans le programme principal:
'      subact% (témoin d'activité)
'      rtmp$ (répertoire des fichiers temporaires)
'      forsub% (Form utilisée par la sub)
IF VARIABLE("subact%") = 0 THEN DIM subact%: ' indicateur une sub active
IF VARIABLE("rtmp$") = 0 THEN DIM rtmp$: rtmp$ = "C:\TEMP\"
IF VARIABLE("forsub%") = 0 THEN DIM forsub%
subact% = 1
DIM_LOCAL r,f%,t%,i%,j%,k%,x%,y%,a$,tr%,tg%,tb%,n2t%,npt%,fig%,trac%,term%,ret%,an,cpt
DIM_LOCAL x1%,y1%,x2%,y2%,x3%,y3%,sx1%,fpr$,btg%,cap$,rx%,ry%,pix,ima%,fcp$,op%,ck%
DIM_LOCAL wf%,hf%,di%,st%,ep%,me%,pa%,bp%,sh%,und%,fsg$,nsg%,ntsg%
nsg% = 0: ntsg% = 5: ' nb total de sauvegardes (en boucle)
fpr$ = rtmp$+"Savpre.bmp"
fcp$ = rtmp$+"Savcop.bmp"
fsg$ = rtmp$+"Svg"
FILE_SAVE p%,fpr$: FILEBIN_OPEN_READ 1,fpr$: ' sauvegarde image du picture
FILEBIN_POSITION 1,18: i% = FILEBIN_READ(1)+256*FILEBIN_READ(1): ' largeur
FILEBIN_POSITION 1,22: j% = FILEBIN_READ(1)+256*FILEBIN_READ(1): ' hauteur
FILEBIN_CLOSE 1: FILE_DELETE fpr$
r = WIDTH(p%)/i%: ' rapport proportion image dessinée/image réelle
IF LABEL("Desfin")=0 THEN LABEL Desfin
IF LABEL("Desopt")=0 THEN LABEL Desopt
IF LABEL("Desanu")=0 THEN LABEL Desanu
IF LABEL("Descou")=0 THEN LABEL Descou
IF LABEL("Destim")=0 THEN LABEL Destim
IF LABEL("Destra")=0 THEN LABEL Destra
IF LABEL("Deslib")=0 THEN LABEL Deslib
IF LABEL("Desrec")=0 THEN LABEL Desrec
IF LABEL("Desron")=0 THEN LABEL Desron
IF LABEL("Destyp")=0 THEN LABEL Destyp
IF LABEL("Desrem")=0 THEN LABEL Desrem
IF LABEL("Desatx")=0 THEN LABEL Desatx
IF LABEL("Destex")=0 THEN LABEL Destex
IF LABEL("Despol")=0 THEN LABEL Despol
IF LABEL("Despom")=0 THEN LABEL Despom
IF LABEL("Desdep")=0 THEN LABEL Desdep
IF LABEL("Dessvg")=0 THEN LABEL Dessvg
IF LABEL("Deserr")=0 THEN LABEL Deserr
DATA "Pal16": ' palette 16 couleurs
DATA "000000","000080","0000FF","008000","008080","00FF00","00FFFF","800000"
DATA "800080","808000","808080","C0C0C0","FF0000","FF00FF","FFFF00","FFFFFF"
n2t% = NUMBER_2D_TARGET: npt% = NUMBER_PRINT_TARGET
' ON_CLICK p%,Desrem
f% = forsub%: WHILE OBJECT_EXISTS(f%)=1: f%=f%+1: END_WHILE: forsub% = f%
        wf% = 145: hf% = 430
FORM f%: TOP f%,ya%: LEFT f%,xa%: HEIGHT f%,hf%: WIDTH f%,wf%: BORDER_SMALL f%
        COLOR f%,180,255,255: FONT_BOLD f%: FONT_NAME f%,"Arial": ON_CLOSE f%,Desfin
        CAPTION f%,"- OUTILS  DESSIN -"
i%=f%+1: ALPHA i%: PARENT i%,f%: TOP i%,3: CAPTION i%,"Trait:"
i%=f%+2: PICTURE i%: PARENT i%,f%: TOP i%,0: LEFT i%,32: WIDTH i%,35: HEIGHT i%,23
        COLOR i%,0,0,0
i%=f%+3: PICTURE i%: PARENT i%,f%: TOP i%,3: LEFT i%,35: WIDTH i%,WIDTH(i%-1)-5
        HEIGHT i%,18: COLOR i%,255,0,0
i%=f%+4: SPIN i%: PARENT i%,f%: LEFT i%,75: WIDTH i%,40: FONT_SIZE i%,10
        MIN i%,1: MAX i%,20: POSITION i%,1/r
i%=f%+5: PICTURE i%: PARENT i%,f%: TOP i%,25: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
        HEIGHT i%,63: 2D_TARGET_IS i%: ON_CLICK i%,Descou
        RESTORE: READ a$: WHILE a$<>"Pal16": READ a$: END_WHILE
        FOR j% = 1 TO 4
            FOR i% = 1 TO 4
                READ a$
                tr%=HEX(LEFT$(a$,2)): tg%=HEX(MID$(a$,3,2)): tb%=HEX(RIGHT$(a$,2))
                2D_FILL_COLOR tr%,tg%,tb%
                2D_RECTANGLE x%,y%,x%+31,y%+15: x%=x%+32
            NEXT i%
            y%=y%+16: x% = 0
        NEXT j%
        tr% = 0: tg% = 0: tb% = 0: COLOR f%+3,tr%,tg%,tb%
i%=f%+6: ALPHA i%: PARENT i%,f%: TOP i%,98: CAPTION i%,"Motif rempliss.:"
i%=f%+7: PICTURE i%: PARENT i%,f%: TOP i%,92: LEFT i%,89: WIDTH i%,38: HEIGHT i%,23
        COLOR i%,0,0,0
i%=f%+8: PICTURE i%: PARENT i%,f%: TOP i%,115: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
        HEIGHT i%,45: 2D_TARGET_IS i%: ON_CLICK i%,Destyp
        x% = 0: y% = 2
        2D_FILL_COLOR 0,0,0
        FOR j% = 1 TO 2
            FOR i% = 1 TO 4
                k% = (j%-1)*4+i%
                SELECT k%
                    CASE 1: 2D_FILL_OFF: 2D_FILL_COLOR 0,0,0: 2D_FILL_SOLID
                    CASE 2: 2D_FILL_CROSS
                    CASE 3: 2D_FILL_DIAGONAL_CROSS
                    CASE 4: 2D_FILL_DIAGONAL_DOWN
                    CASE 5: 2D_FILL_DIAGONAL_UP
                    CASE 6: 2D_FILL_HORIZONTAL
                    CASE 7: 2D_FILL_VERTICAL
                END_SELECT
                2D_RECTANGLE x%,y%,x%+31,y%+20: x%=x%+32
                IF j%=2 AND i%=3 THEN EXIT_FOR
            NEXT i%
            y%=y%+21: x% = 0
        NEXT j%
i%=f%+9: CONTAINER_OPTION i%: PARENT i%,f%: TOP i%,TOP(i%-1)+45: WIDTH i%,WIDTH(f%)-17
        LEFT i%,0: HEIGHT i%,180: COLOR i%,255,255,180: op% = i%
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,10: LEFT i%,3: CAPTION i%,"Trait"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,25: LEFT i%,3: CAPTION i%,"Libre"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,40: LEFT i%,3: CAPTION i%,"Rectangle vide"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,55: LEFT i%,3: CAPTION i%,"Rectangle plein"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,85: LEFT i%,3: CAPTION i%,"Cercle/Ellipse vide"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,100: LEFT i%,3: CAPTION i%,"Cercle/Ellipse plein"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,115: LEFT i%,3: CAPTION i%,"Remplir (motif)"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,130: LEFT i%,3: CAPTION i%,"Sélection/Copier"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,145: LEFT i%,3: CAPTION i%,"Coller"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,160: LEFT i%,3: CAPTION i%,"Texte"
        MARK_ON op%+1
        FOR j%=op%+1 TO i%: WIDTH j%,WIDTH(op%)-7: ON_CLICK j%,Desopt: NEXT j%
i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,TOP(op%)+69: LEFT i%,20: CAPTION i%,"coins arrondis"
        COLOR i%,255,255,180: ck%=i%
i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,20: TOP i%,TOP(op%)+HEIGHT(op%)+2: LEFT i%,0
        CAPTION i%,CHR$(231): sh%=i%
i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,20: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+20
        CAPTION i%,CHR$(232)
i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,20: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+20
        CAPTION i%,CHR$(233)
i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,20: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+20
        CAPTION i%,CHR$(234)
        FOR j%=sh% TO i%
            FONT_NAME j%,"Wingdings": FONT_SIZE j%,10: ON_CLICK j%,Desdep
        NEXT j%
i%=i%+1: SPIN i%: PARENT i%,f%: WIDTH i%,45: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+22
        FONT_SIZE i%,10: MIN i%,1: MAX i%,300: POSITION i%,5
i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,60: TOP i%,HEIGHT(f%)-60
        HEIGHT i%,20: CAPTION i%,"Annuler": ON_CLICK i%,Desanu
        ON_CLICK i%,Dessvg: und% = i%
i%=i%+1:BUTTON i%: PARENT i%,f%: WIDTH i%,55:TOP i%,TOP(i%-1): LEFT i%,70
        HEIGHT i%,20: CAPTION i%,"Quitter": ON_CLICK i%,Desfin
2D_TARGET_IS p%: 2D_PEN_DOT
FILE_SAVE p%,fpr$
t%=i%+1: TIMER t%: PARENT t%,f%: TIMER_INTERVAL t%,50: ON_TIMER t%,Destim
ima% = t%+1: IMAGE ima%
trac% = 0: term% = 0: btg% = 0
fig% = 1: ret% = 0: cap$ = CAPTION$(0)
CLIPBOARD_COPY p%
ON_ERROR_GOTO Deserr
' # # # # # # # # # #  BOUCLE  D' ATTENTE  # # # # # # # # # # # # # # # # # #
WHILE 1 > 0: WAIT 100: END_WHILE: GOTO Desfin
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desopt:
  ' Changement de figure
  x1% = -1
  IF CHECKED(op%+10) = 0 AND OBJECT_EXISTS(ima%+1)=1
      FOR i% = ima%+1 TO di%: DELETE i%: NEXT i%
      WIDTH f%,wf%
      FILE_SAVE p%,fpr$
  END_IF
  ' Type de figure
  fig% = 1: ' trait
  IF CHECKED(op%+2) = 1
    fig% = 2: ' tracé libre
    FILE_SAVE p%,fpr$: ' sauvegarde préalable
  ELSE
    IF CHECKED(op%+3) = 1 OR CHECKED(op%+4) = 1 OR CHECKED(op%+8) = 1
        fig% = 3: ' rectangle vide ou plein
    ELSE
        IF CHECKED(op%+5) = 1 OR CHECKED(op%+6) = 1
            fig% = 4: ' cercle vide ou plein
        ELSE
            IF CHECKED(op%+7) = 1
                fig% = 5: ' remplissage
            ELSE
                IF CHECKED(op%+9) = 1
                    fig% = 6: ' coller
                ELSE
                    IF CHECKED(op%+10) = 1
                        fig% = 7: ' texte
                        GOSUB Destex
                    END_IF
                END_IF
            END_IF
        END_IF
    END_IF
  END_IF
  CLIPBOARD_COPY p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destim:
  ' IF CHECKED(op%+7)=1 THEN RETURN: ' remplissage
  cpt = cpt+1: IF cpt>1000 THEN cpt = 2
  x% = MOUSE_X_POSITION(p%)/r: y% = MOUSE_Y_POSITION(p%)/r: ' position actuelle souris
  a$ =  "X= "+STR$(x%)+" pixels  Y= "+STR$(y%)+" pixels"
  CAPTION 0,a$
  2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
  IF MOUSE_LEFT_DOWN(p%) = 1: ' bouton gauche souris enfoncé
      CLIPBOARD_PASTE p%
      IF fig% = 5 THEN GOSUB Desrem: RETURN
      IF fig% = 6: ' coller
          IF FILE_EXISTS(fcp$) = 0 THEN timer_on t%: RETURN: ' pas de copie
          FILE_SAVE p%,fpr$
          FILE_LOAD ima%,fcp$: 2D_IMAGE_PASTE ima%,x%,y%
      ELSE
          x1% = x%: y1% = y%: ' origine
          IF fig% = 7: ' insertion texte au clic
              GOSUB Desatx
          ELSE
              trac% = 1
              IF fig% = 2 AND btg% = 0 THEN FILE_SAVE p%,fpr$: ' sauvegarde préalable
              btg% = 1
          END_IF
      END_IF
  END_IF
  IF fig%<6
    IF MOUSE_LEFT_UP(p%) = 1: ' relâche, tracé final
      btg% = 0
      IF x1% = -1 THEN RETURN
      TIMER_OFF t%
      term% = 1: 2D_PEN_SOLID
      SELECT fig%
          CASE 1: GOSUB Destra
          CASE 2: GOSUB Deslib
          CASE 3: GOSUB Desrec
          CASE 4: GOSUB Desron
          CASE 5: GOSUB Desrem
      END_SELECT
      GOSUB Dessvg: ' sauvegarde
      ' x1% = sx1%: x2% = sx2%: y1% = sy1%: y2% = sy2%
      CLIPBOARD_COPY p%: term% = 0
      trac% = 0: 2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
      TIMER_ON t%
    END_IF
    IF trac% = 1
      ' tracé provisoire, en continu
      2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
      if x1% = -1 then return
      x2% = x%: y2% = y%: ' position actuelle
      IF x2%=x3% AND y2%=y3% THEN RETURN: ' position inchangée
      2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
      SELECT fig%
          CASE 1: GOSUB Destra
          CASE 2: GOSUB Deslib
          CASE 3: GOSUB Desrec
          CASE 4: GOSUB Desron
      END_SELECT
      x3% = x%: y3% = y%
    END_IF
  END_IF
  TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destra:
  ' Tracé de droite
  IF cpt = 1 THEN RETURN: ' init
  CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fpr$: ' sauvegarde préalable
  2D_LINE x1%,y1%,x2%,y2%
  IF term% = 1 THEN x1% = -1: ' fin de tracé
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Deslib:
  ' Tracé libre
  2D_PEN_SOLID: 2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
  2D_LINE x1%,y1%,x2%,y2%: x1%=x2%: y1%=y2%
  IF term% = 1 THEN x1% = -1
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrec:
  ' Rectangle vide ou plein
  CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fpr$: ' sauvegarde préalable
  IF term% = 1 AND CHECKED(op%+8) = 1: ' Fin de Select/copie, sauvegarde zone
    2D_IMAGE_COPY ima%,x1%,y1%,x2%,y2%: FILE_SAVE ima%,fcp$
  ELSE
    IF term% = 1: ' tracé final
        IF CHECKED(ck%) = 1: ' rectangle à coins arrondis
            j% = x2%-x1%: k% = y2%-y1%: ' largeur, hauteur
            i% = 20/r: ' rayon de courbure arbitraire
            WHILE i%>j%/2 OR i%>k%/2: i%=i%-1: END_WHILE: ' diminuer le rayon
            cpt = PI/i%: ' pas (angle)
            x% = x1%+i%: y% = y1%+i%
            2D_LINE x2%-i%,y1%,x1%+i%,y1%
            FOR an = PI/2 TO PI STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            y% = y2%-i%
            2D_POLY_TO x1%,y2%-i%
            FOR an = PI TO 3*PI/2 STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            x% = x2%-i%
            FOR an = 3*PI/2 TO 2*PI STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            y% = y1%+i%
            FOR an = 0 TO PI/2+cpt STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            IF CHECKED(op%+4) = 1: ' rectangle plein
                x% = x1%+(x2%-x1%)/2: y% = y1%+(y2%-y1%)/2
                2D_FLOOD x%,y%,tr%,tg%,tb%
            END_IF
        ELSE
            IF CHECKED(op%+4) = 1: ' rectangle plein
                2D_FILL_COLOR tr%,tg%,tb%: 2D_RECTANGLE x1%,y1%,x2%,y2%
            ELSE
                2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
            END_IF
        END_IF
        sx1% = x1%: x1% = -1
    ELSE: ' tracé provisoire
        2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
    END_IF
  END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desron:
  ' Ellipse (ou cercle si Maj enfoncé)
  CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fpr$: ' sauvegarde préalable
  rx% = (x2%-x1%)/2: ry% = (y2%-y1%)/2: ' rayons H et V
  IF SCANCODE = 160 THEN ry% = rx%: SCANCODE = 0: ' cercle: touche 'Maj' enfoncée
  x3% = x1%+rx%: y3% = y1%+ry%: ' centre
  IF rx% = ry%
      2D_FILL_OFF: 2D_CIRCLE x3%,y3%,rx%: 2D_FILL_ON: ' cercle
  ELSE
      2D_POLY_FROM x3%+rx%,y3%
      FOR an = 0 TO 2*PI STEP PI/180
          2D_POLY_TO x3%+rx%*COS(an),y3%+ry%*SIN(an)
      NEXT an
  END_IF
  IF term% = 1: ' tracé final
      IF CHECKED(op%+6) = 1: ' cercle/ellipse plein
          IF rx% = ry%: ' cercle
              2D_FILL_COLOR tr%,tg%,tb%: 2D_CIRCLE x3%,y3%,rx%
          ELSE
              2D_FLOOD x3%,y3%,tr%,tg%,tb%
          END_IF
      END_IF
      sx1% = x1%: x1% = -1
  END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destyp:
  ' Type de remplissage: plein ou motif
  x%=MOUSE_X_LEFT_DOWN(f%+8): y%=MOUSE_Y_LEFT_DOWN(f%+8)
  i% = 1+INT(x%/31): j% = 1+INT(y%/20): k% = (j%-1)*4+i%: IF k% = 8 THEN RETURN
  2D_TARGET_IS f%+7: CLS: 2D_FILL_OFF: 2D_FILL_COLOR 0,0,0
  SELECT k%
    CASE 1: 2D_FILL_COLOR 0,0,0: 2D_FILL_SOLID
    CASE 2: 2D_FILL_CROSS
    CASE 3: 2D_FILL_DIAGONAL_CROSS
    CASE 4: 2D_FILL_DIAGONAL_DOWN
    CASE 5: 2D_FILL_DIAGONAL_UP
    CASE 6: 2D_FILL_HORIZONTAL
    CASE 7: 2D_FILL_VERTICAL
  END_SELECT
  2D_RECTANGLE 0,0,WIDTH(f%+7),HEIGHT(f%+7)
  2D_TARGET_IS p%: 2D_FILL_OFF
  SELECT k%
    CASE 1: 2D_FILL_SOLID
    CASE 2: 2D_FILL_CROSS
    CASE 3: 2D_FILL_DIAGONAL_CROSS
    CASE 4: 2D_FILL_DIAGONAL_DOWN
    CASE 5: 2D_FILL_DIAGONAL_UP
    CASE 6: 2D_FILL_HORIZONTAL
    CASE 7: 2D_FILL_VERTICAL
  END_SELECT
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrem:
  ' Remplissage au clic souris (uniquement la partie uniforme)
  IF CHECKED(op%+7)=0 THEN RETURN
  FILE_SAVE p%,fpr$: ' sauvegarde préalable
  x% = MOUSE_X_LEFT_DOWN(p%)/r: y% = MOUSE_Y_LEFT_DOWN(p%)/r
  2D_FLOOD x%,y%,tr%,tg%,tb%
  sx1% = x1%: x1% = -1
  CLIPBOARD_COPY p%
  TO_FOREGROUND f%
  GOSUB Dessvg
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desatx:
  ' Insertion texte au clic souris
  IF COUNT(me%)= 0 THEN RETURN
  TIMER_OFF t%
  CLIPBOARD_PASTE p%: FILE_SAVE p%,fpr$: ' sauvegarde préalable
  x% = x1%: y% = y1%: ' point d'insertion
  k% = TEXT_HEIGHT("Ay",p%): ' y3% = k%*COUNT(me%): ' hauteur totale
  IF CHECKED(st%+4)=1: ' Fond du texte transparent
      SHOW bp%
      HEIGHT pa%,k%
      FOR y3% = 1 TO COUNT(me%)
          a$ = ITEM_READ$(me%,y3%): WIDTH pa%,TEXT_WIDTH(a$,p%)
          2D_TARGET_IS pa%: COLOR pa%,254,254,254: CLS: 2D_FILL_COLOR 254,254,254
          PRINT_TARGET_IS pa%: PRINT a$: ' impression dans le picture auxiliaire
          PRINT_TARGET_IS p%: 2D_TARGET_IS p%: ' report dans le picture principal
          FOR j% = 0 TO HEIGHT(pa%)-1
              FOR i% = 0 TO WIDTH(pa%)-1
                  x3% = COLOR_PIXEL_RED(pa%,i%,j%)
                  IF x3%=tr%
                      2D_PEN_COLOR tr%,tg%,tb%
                      2D_POINT x%+i%,y%+j%
                  END_IF
              NEXT i%
              DISPLAY
          NEXT j%
          y% = y%+k%
      NEXT y3%
      HIDE bp%
  ELSE: ' fond du texte opaque
      FOR i% = 1 TO COUNT(me%)
          PRINT_LOCATE x%,y%: PRINT ITEM_READ$(me%,i%): y% = y%+k%
      NEXT i%
  END_IF
  sx1% = x1%
  GOSUB Dessvg: ' sauvegarde
  TIMER_ON t%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destex:
  ' Texte
  WIDTH f%,wf%+500
  i%=ima%+1: ALPHA i%: PARENT i%,f%: TOP i%,4: LEFT i%,wf%: CAPTION i%,"Police:"
  i%=i%+1: EDIT i%: PARENT i%,f%: TOP i%,1: LEFT i%,wf%+40: WIDTH i%,140
          FONT_NAME i%,"Arial": TEXT i%,"Arial": ON_CLICK i%,Despol: ep% = i%
  i%=i%+1: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+WIDTH(i%-1)+10
          WIDTH i%,40: MIN i%,4: MAX i%,255: POSITION i%,8: st% = i%
          ON_CHANGE st%,Despom
  i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,1: LEFT i%,LEFT(i%-1)+45: CAPTION i%,"G"
          FONT_BOLD i%: ON_CLICK i%,Despom
  i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,TOP(i%-1): WIDTH i%,30: LEFT i%,LEFT(i%-1)+30
          FONT_ITALIC i%: CAPTION i%,"I": ON_CLICK i%,Despom
  i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,TOP(i%-1): WIDTH i%,30: LEFT i%,LEFT(i%-1)+30
          FONT_UNDERLINE i%: CAPTION i%,"S": ON_CLICK i%,Despom
  i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,TOP(i%-1)+20: LEFT i%,LEFT(st%+1)
          WIDTH i%,120: CAPTION i%,"Fond transparent"
  i%=i%+1: ALPHA i%: PARENT i%,f%: TOP i%,44: LEFT i%,wf%+50: COLOR i%,255,255,0
          CAPTION i%,"Après saisie, cliquer le point d'insertion du texte dans le dessin "
  i%=i%+1: MEMO i%: PARENT i%,f%: TOP i%,64: LEFT i%,wf%-10: WIDTH i%,WIDTH(f%)-wf%-10
          HEIGHT i%,300: FONT_BOLD_OFF i%: FONT_ITALIC_OFF i%: FONT_UNDERLINE_OFF i%
          FONT_NAME i%,"Arial": FONT_SIZE i%,POSITION(st%): me%=i%
  i%=i%+1: LIST i%: PARENT i%,f%: TOP i%,TOP(ep%)+25: LEFT i%,wf%+40: WIDTH i%,180
          HEIGHT i%,340: HIDE i%: FONT_NAMES_LOAD i%: COLOR i%,255,255,180
          FOR k% = COUNT(i%) TO 1 STEP -1
              IF LEFT$(ITEM_READ$(i%,k%),1)="@" THEN ITEM_DELETE i%,k%
          NEXT k%: ON_CLICK i%,Despom
  i%=i%+1: PICTURE i%: LEFT i%,-2000: pa% = i%: HIDE i%
  i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(me%)+100: LEFT i%,LEFT(me%)+20: WIDTH i%,WIDTH(me%)-40
          HEIGHT i%,60: FONT_SIZE i%,24: CAPTION i%,"PATIENCE ...": HIDE i%: bp%=i%: font_color bp%,255,0,0
  di% = i%
  PRINT_TARGET_IS p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Despol:
  SHOW me%+1
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Despom:
  ' Police, taille et enrichissements du texte
  IF CLICKED(me%+1)=1 THEN TEXT ep%,ITEM_INDEX$(me%+1): HIDE me%+1: ' Police
  FONT_NAME me%,TEXT$(ep%): FONT_SIZE me%,POSITION(st%)
  FONT_NAME p%,TEXT$(ep%): FONT_SIZE p%,POSITION(st%)/r
  FONT_NAME pa%,TEXT$(ep%): FONT_SIZE pa%,POSITION(st%)/r
  FONT_BOLD_OFF me%: FONT_ITALIC_OFF me%: FONT_UNDERLINE_OFF me%
  FONT_BOLD_OFF p%: FONT_ITALIC_OFF p%: FONT_UNDERLINE_OFF p%
  FONT_BOLD_OFF pa%: FONT_ITALIC_OFF pa%: FONT_UNDERLINE_OFF pa%
  FONT_COLOR me%,tr%,tg%,tb%: FONT_COLOR p%,tr%,tg%,tb%: FONT_COLOR pa%,tr%,tg%,tb%
  IF CHECKED(st%+1)=1 THEN FONT_BOLD me%: FONT_BOLD p%: FONT_BOLD pa%
  IF CHECKED(st%+2)=1 THEN FONT_ITALIC me%: FONT_ITALIC p%: FONT_ITALIC pa%
  IF CHECKED(st%+3)=1 THEN FONT_UNDERLINE me%: FONT_UNDERLINE p%: FONT_UNDERLINE pa%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desdep:
  ' Déplacement de la dernière figure tracée (boutons flèches)
  IF fig% = 5 THEN RETURN
  TIMER_OFF t%
  i% = NUMBER_CLICK
  j% = POSITION(sh%+4): ' pas du déplacement, en pixels
  x1% = sx1%
  IF i% = sh%
      x1% = x1%-j%: x2% = x2%-j%
  ELSE
      IF i% = sh%+1
          x1% = x1%+j%: x2% = x2%+j%
      ELSE
          IF i% = sh%+2
              y1% = y1%-j%: y2% = y2%-j%
          ELSE
              y1% = y1%+j%: y2% = y2%+j%
          END_IF
      END_IF
  END_IF
  sx1% = x1%
  FILE_LOAD p%,fpr$: CLIPBOARD_COPY p%
  term% = 1: 2D_PEN_SOLID
  SELECT fig%
      CASE 1: GOSUB Destra
      CASE 2: GOSUB Deslib
      CASE 3: GOSUB Desrec
      CASE 4: GOSUB Desron
      CASE 7: GOSUB Desatx
  END_SELECT
  term% = 0: 2D_PEN_DOT
  TIMER_ON t%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desanu:
  ' Annule la dernière opération
  IF FILE_EXISTS(fpr$) = 1 THEN FILE_LOAD p%,fpr$: CLIPBOARD_COPY p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Descou:
  ' Choix de la couleur
  x%=MOUSE_X_LEFT_DOWN(f%+5): y%=MOUSE_Y_LEFT_DOWN(f%+5)
  tr%=COLOR_PIXEL_RED(f%+5,x%,y%): tg%=COLOR_PIXEL_GREEN(f%+5,x%,y%)
  tb%=COLOR_PIXEL_BLUE(f%+5,x%,y%): COLOR f%+3,tr%,tg%,tb%
  IF OBJECT_EXISTS(ima%+1)=1 THEN GOSUB Despom
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Dessvg:
  ' Sauvegarde/Restore
  IF NUMBER_CLICK = und%: ' Undo
      ' Restore
      i% = nsg%-1: IF i%<1 THEN i% = ntsg%: ' n° dernière sauvegarde
      a$ = fsg$+STR$(i%)+".bmp"
      IF FILE_EXISTS(a$) = 1 THEN FILE_LOAD p%,a$: CLIPBOARD_COPY p%
      nsg% = i%
  ELSE
      ' Sauvegarde
      nsg% = nsg%+1: IF nsg%>ntsg% THEN nsg% = 1
      FILE_SAVE p%,fsg$+STR$(nsg%)+".bmp"
  END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Deserr:
  FILE_SAVE p%,fpr$: ' Erreur, sauvegarde de l'existant
  a$ = "ERREUR N°:"+STR$(ERROR_NUMBER)+" "+ERROR_TYPE$+" Ligne:"+STR$(ERROR_LINE)
  a$=a$+CHR$(10)+"Sauvegarde dans: "+fpr$
  MESSAGE a$
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desfin:
  ret% = 1
  TIMER_OFF t%: DELETE t%: OFF_CLICK p%: 2D_TARGET_IS n2t%: PRINT_TARGET_IS npt%
  DELETE f%: DELETE ima%: CAPTION 0,cap$
  ' Suppression des sauvegardes
  FOR i% = 1 TO ntsg%
      a$ = fsg$+STR$(i%)+".bmp"
      IF FILE_EXISTS(a$) = 1 THEN FILE_DELETE a$
  NEXT i%
  WAIT 100
  subact% = 0: EXIT_SUB
RETURN
END_SUB
' ==============================================================================
On peut choisir:
- la couleur et l'épaisseur du tracé
- le motif de remplissage des figures fermées (mais de teinte uniforme)
- le type de figure à tracer (le principe est classique):
  tracé libre: cliquer, tracer, puis relâcher
  trait: cliquer, déplacer jusqu'à l'arrivée, relâcher
  rectangle vide ou plein: cliquer un coin, déplacer jusqu'au coin opposé, relâcher
  cercle/ellipse vide ou plein: cliquer l'enveloppe haut/gauche, déplacer jusqu'en bas/droite, relâcher. Maintenir la touche 'Maj' enfoncée pour obtenir un cercle.
  Remplir: cliquer la couleur et le motif de remplissage désiré (plein ou hachuré), puis cliquer un point à l'intérieur de la zone à remplir (qui doit être de couleur uniforme)
  Copier/Coller: il ne s'agit pas du presse-papier mais d'une zone sélectionnée dans le dessin lui-même:
  Sélectionner: encadrer la zone à copier (dessiner un rectangle) et relâcher: la zone est copiée dans un fichier.
  Coller: cliquer le coin supérieur gauche de l'insertion de la zone précédemment copiée.

Remarque:
Il y a plusieurs variables globales utilisées, qui peuvent être définies dans le programme principal:
- subact% qui indique que la sub est active ou non, pour éviter un conflit avec une autre sub, ou un double appel.
             (le Timer inclus n'aime pas que quelqu'un d'autre travaille en même temps...)
- forsub%: fournit le numéro souhaité du 1er objet de la sub(à défaut, le 1er numéro disponible)
- rtmp$: répertoire des fichiers de manoeuvre temporaires (implicite: C:\TEMP\).

J'ai prévu un paramètre 'r' à l'appel, qui est le rapport entre les dimensions physiques du Picture en pixels, et les dimensions réelles de l'image de fond chargée dans ce Picture (cas d'un Stretch_On), pour ajuster automatiquement les coordonnées des dessins.
Je ne l'ai pas utilisé, mais le cas échéant il faudrait en tenir compte, et ajuster également les largeurs de traits pour que les tracés redeviennent visibles si l'image est très compressée à l'affichage (les coordonnées données à Panoramic pour le pointage et le tracé tiennent compte du Stretch_On et sont ajustées en conséquence par Panoramic).

EDIT 16h00 déjà une modif !
Finalement je tiens compte du paramètre r qui permet, si une image est préalablement chargée dans le picture avec un Stretch_On (par exemple une photo) de tenir compte de sa taille et de rectifier les coordonnées en fonction du taux de compression à l'écran. Ainsi le dessin se fait bien à l'endroit cliqué et non n'importe où. J'ai aussi ajusté la largeur du tracé provisoire en conséquence, pour qu'il soit visible. Pour le tracé réel, si la largeur est trop petite, il peut être invisible à l'écran mais il sera présent dans l'image finale, c'est à voir.
Donc plus besoin de r dans les paramètres d'appel, il est calculé automatiquement dans la Sub.

EDIT 17/02 ajout des rectangles à coins arrondis

EDIT 18/02 ajout d'une fonction 'Texte' pour pouvoir insérer de petits textes dans l'image (avec choix de police, taille, enrichissements, de la couleur courante) à l'emplacement voulu. Possibilité de fond 'transparent', mais dans ce cas l'insertion est assez longue (pixel par pixel).

EDIT 20/02 ajout de la possibilité de déplacer la dernière figure (ou texte) dessinée dans les quatre directions, d'un nombre de pixels choisi.
Suite: Ajout de sauvegardes successives, en boucle. On peut donc faire des annulations successives des dernières figures dessinées. C'est la variable ntsg% (ici fixée à 5, mais modulable) qui fixe le nombre de sauvegardes accessibles.


Dernière édition par JL35 le Sam 20 Fév 2016 - 15:50, édité 10 fois
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 6998
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 14 Fév 2016 - 15:55

Bravo, JL35.
Toi, tu n’as pas chômé le jour de Valentin !  Boîte à outils de dessin Smiley11
O ! Pardon ! Valentin c’est plutôt la nuit et nous sommes le jour.  Boîte à outils de dessin Bonjou13
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/ En ligne
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 14 Fév 2016 - 16:16

Tu as raison mon ami, il faut croire que ça m'inspire
(mais ne le dis surtout pas à mon épouse, qui ne plaisante pas avec ces choses-là ! Boîte à outils de dessin Img10 )

Et je m'enfonce encore plus: j'ai fait une modif là-haut pour tenir compte du rapport entre les dimensions d'une image éventuellement contenue préalablement dans le picture et les dimensions du picture lui-même.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 6998
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 14 Fév 2016 - 16:40

Salut Jeune homme.

On n’a pas tous un volume Z :
Ligne 12
Code:

IF VARIABLE("rtmp$") = 0 THEN DIM rtmp$: rtmp$ = "Z:"

Garde ton Z à toi, moi je prends :
Code:

IF VARIABLE("rtmp$") = 0 THEN DIM rtmp$: rtmp$ = "C:\temp"

A part ça, bravo !
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/ En ligne
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 14 Fév 2016 - 17:51

Tu as dégainé plus vite que moi, je m'en étais aperçu et j'avais rectifié, mais trop tard !
Quelle idée aussi, de ne pas avoir de disque Z: ! Mad
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyMer 17 Fév 2016 - 21:52

Ajout des rectangles (vides ou pleins) à coins arrondis.
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5948
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 7:53

J'ai pris un peu de temps pour essayer cette boite à outils dessin(s).

c'est intéressant et tout prêt à l'emploi pour intégrer dans un code, bravo JL35. Very Happy

J'ai eu un peu de mal avec les motifs et couleurs, j'ai fini par comprendre qu'il faut faire par étapes et dans le bon ordre.
Dommage que le bouton annuler ne fonctionne que sur la dernière opération, mais je suppose que ça ne doit pas être simple de faire plus.

Bon aujourd'hui je suis charpentier-couvreur, et on m'attend.

A+
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 10:06

Merci Jean Claude d'avoir essayé et donné ton avis.
C'est une boîte à outils, à intégrer dans un programme principal quelconque. Il n'y a pas de mode d'emploi (ça prendrait trop de place), mais ce n'est pas bien compliqué. Simplement, il faut bien choisir les paramètres avant de dessiner une figure: couleur et épaisseur de trait, et motif de remplissage éventuellement.

J'aurais pu faire des annulations sur plusieurs niveaux, mais ça voudrait dire des enregistrements successifs sur des fichiers image à gérer, c'est faisable mais pas très simple, surtout dans une sub.
Je suis parti du principe qu'il faut être bien sûr de soi avant de valider la dernière opération (ou l'annuler).

Je n'ai pas de programme à te proposer pour la couverture, mais bon sang ! fais bien gaffe à toit (euh, à toi) ! ce n'est pas un temps à se balader sur les toits !
Boîte à outils de dessin Boulot10
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5948
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 13:30

T'inquiète pas JL35,
1) Il ne pleut pas chez moi, c'est gris, sans plus, et la température est de 11°
2) ce n'est pas moi qui monte sur le toit (pas folle la guêpe), je ne fais office que d’assistant (Arpète en langage courant du BTP). Et puis il n'y a que 3.60 X 2.10 m soit 7.56 m² à couvrir. Cool

Pour annuler des actions antérieurs, dans ton programme, c'est vrai que c'est pas adapté à une SUB, mais suivant le besoin on peut toujours se le coder soi-même.

A propos, j'ai parlé de toi, au couvreur, et lui, il m'a parlé de toit, donc je suppose qu'il te connais...  Razz  Razz  Razz

Bon je vais y retourner....
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 13:48

Le plus simple c'est de stocker les commandes dans une liste dans ce cas et de reconstruire le dessin jusqu'à l'opération n-1 en arrière plan puis d'afficher le résultat

Sinon, on peut avoir n copie des état d'images avec leur numéro stocké dans un tableau de manière a ne bouger que les références à chaque fois et de faire une copie du dessin actuel à la place de la plus vieille sauvegarde
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 15:23

C'est sûr qu'il y a des solutions relativement faciles à mettre en oeuvre, mais ça me paraît un peu lourd pour une simple sub, av ec des listes de fichiers (qui peuvent devenir très longues) à gérer, et à supprimer en fin de travail.
Et comme dit Jean Claude, le couvreur adjoint, chacun peut se les implémenter en fonction de ses besoins.

Je suis en train d'ajouter à la sub une fonction d'insertion de texte, ça rallonge un peu mais ça peut être utile.

Au fait Jean Claude, le couvreur qui m'a parlé de toi(t), tu l'as faite celle-là à ton couvreur, si ça se trouve il ne l'a jamais entendue ?  Very Happy
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12276
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 16:59

Je viens de mettre une nouvelle version de KGF.dll en ligne. Les modifications concernent l'objet ImageList. D'une part, on peut maintenant ajouter une image contenue dans le presse-papier, à un objet ImageList, sans passer par un fichier. Et on peut également extraire une image et la placer, soit dans un fichier, soit dans le presse-papier, avec suppression optionnelle de l'image extraite. Les deux fonctions retournent le nombre d'images restantes dans la librairie.

Ainsi, cela devient un jeu d'enfant de faire une fonction "Annuler" non limitée:
- avant chaque modification, on copie l'image dans le presse-papier, puis on l'ajoute à une ImageList, mémorisant le nombre résultant.
- pour chaque annulation, on extrait la dernière image mémorisée (l'indice est le nombre mémorisé - 1) dans le presse-papier, tout en la supprimant et en mémorisant le nouveau nombre résultant. Puis, on copie le presse-papier dans l'image.
- si le nombre mémorisé est 0, on est arrivé à l'état d'origine.

Je sais que tu voulais faire quelque chose en 100 % Panoramic. Mais tu peux imaginer une technique similaire avec une sauvegarde réelle dans un fichier, à chaque étape, et tu mémorises le nom du fichier dans une DLIST.

Voilà, tu as le choix...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 18:25

Merci Klaus pour ces infos, c'est vrai que c'est une possibilité séduisante (et simple à mettre en oeuvre).
Mais ce n'est qu'une petite sub, et ça m'ennuie un peu d'y attacher KGF.dll, ce qui la rend moins universelle.
Et d'un autre côté, gérer une liste de fichiers de sauvegarde, pour la même raison, même si c'est faisable facilement, ça me paraît un peu lourd pour une sub.

KGF.dll je m'en sers facilement dans mes programmes (j'aime bien notamment les fonctions d'impression qui font cruellement défaut dans Panoramic).

C'est à voir, j'y réfléchis...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12276
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 19:35

Juste pour le plaisir, j'ai intégré KGF.dll et les fonctions de ImageList pour l'annulation multi-niveau. Cela se fait sans fichier de sauvegarde, uniquement en mémoire. Voici le code:
Code:
' JL35_dessin.bas

Picture 1: Full_Space 1
Dessin(0,Height(0),1)
Terminate
' ==============================================================================
SUB Dessin(xa%,ya%,p%)
' Boîte à outils affichée en xa%,ya% pour dessiner sur le picture p%
' Variables définies dans le programme principal:
'      subact% (témoin d'activité)
'      rtmp$ (répertoire des fichiers temporaires)
'      forsub% (Form utilisée par la sub)
IF VARIABLE("subact%") = 0 THEN DIM subact%: ' indicateur une sub active
IF VARIABLE("rtmp$") = 0 THEN DIM rtmp$: rtmp$ = "C:\TEMP\"
IF VARIABLE("forsub%") = 0 THEN DIM forsub%
IF VARIABLE("KGF_DLL_FILE$")=0
  DIM KGF_DLL_FILE$ : KGF_DLL_FILE$ = "KGF.dll"
  DIM IL%, IL_count%
  DLL_ON KGF_DLL_FILE$
  IL% = DLL_CALL2("CreateImageList",width(p%),height(p%))
  IL_count% = 0
END_IF
subact% = 1
DIM_LOCAL r,f%,t%,i%,j%,k%,x%,y%,a$,tr%,tg%,tb%,n2t%,fig%,trac%,term%,ret%,an,cpt
DIM_LOCAL x1%,y1%,x2%,y2%,x3%,y3%,fpr$,btg%,cap$,rx%,ry%,pix,ima%,fcp$,op%,ck%
fpr$ = rtmp$+"Savpre.bmp"
fcp$ = rtmp$+"Savcop.bmp"
FILE_SAVE p%,fpr$: FILEBIN_OPEN_READ 1,fpr$: ' sauvegarde image du picture
FILEBIN_POSITION 1,18: i% = FILEBIN_READ(1)+256*FILEBIN_READ(1): ' largeur
FILEBIN_POSITION 1,22: j% = FILEBIN_READ(1)+256*FILEBIN_READ(1): ' hauteur
FILEBIN_CLOSE 1: FILE_DELETE fpr$
r = WIDTH(p%)/i%: ' rapport proportion image dessinée/image réelle
IF LABEL("Desfin")=0 THEN LABEL Desfin
IF LABEL("Desopt")=0 THEN LABEL Desopt
IF LABEL("Desanu")=0 THEN LABEL Desanu
IF LABEL("Descou")=0 THEN LABEL Descou
IF LABEL("Destim")=0 THEN LABEL Destim
IF LABEL("Destra")=0 THEN LABEL Destra
IF LABEL("Deslib")=0 THEN LABEL Deslib
IF LABEL("Desrec")=0 THEN LABEL Desrec
IF LABEL("Desron")=0 THEN LABEL Desron
IF LABEL("Destyp")=0 THEN LABEL Destyp
IF LABEL("Desrem")=0 THEN LABEL Desrem
DATA "Pal16": ' palette 16 couleurs
DATA "000000","000080","0000FF","008000","008080","00FF00","00FFFF","800000"
DATA "800080","808000","808080","C0C0C0","FF0000","FF00FF","FFFF00","FFFFFF"
n2t% = NUMBER_2D_TARGET
ON_CLICK p%,Desrem
f% = forsub%: WHILE OBJECT_EXISTS(f%)=1: f%=f%+1: END_WHILE: forsub% = f%
FORM f%: TOP f%,ya%: LEFT f%,xa%: HEIGHT f%,390: WIDTH f%,145: BORDER_SMALL f%
        COLOR f%,180,255,255: FONT_BOLD f%: FONT_NAME f%,"Arial": ON_CLOSE f%,Desfin
        CAPTION f%,"- OUTILS  DESSIN -"
i%=f%+1: ALPHA i%: PARENT i%,f%: TOP i%,3: CAPTION i%,"Trait:"
i%=f%+2: PICTURE i%: PARENT i%,f%: TOP i%,0: LEFT i%,32: WIDTH i%,35: HEIGHT i%,23
        COLOR i%,0,0,0
i%=f%+3: PICTURE i%: PARENT i%,f%: TOP i%,3: LEFT i%,35: WIDTH i%,WIDTH(i%-1)-5
        HEIGHT i%,18: COLOR i%,255,0,0
i%=f%+4: SPIN i%: PARENT i%,f%: LEFT i%,75: WIDTH i%,40: font_size i%,9
        MIN i%,1: MAX i%,20: POSITION i%,1/r
i%=f%+5: PICTURE i%: PARENT i%,f%: TOP i%,25: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
        HEIGHT i%,63: 2D_TARGET_IS i%: ON_CLICK i%,Descou
        RESTORE: READ a$: WHILE a$<>"Pal16": READ a$: END_WHILE
        FOR j% = 1 TO 4
            FOR i% = 1 TO 4
                READ a$
                tr%=HEX(LEFT$(a$,2)): tg%=HEX(MID$(a$,3,2)): tb%=HEX(RIGHT$(a$,2))
                2D_FILL_COLOR tr%,tg%,tb%
                2D_RECTANGLE x%,y%,x%+31,y%+15: x%=x%+32
            NEXT i%
            y%=y%+16: x% = 0
        NEXT j%
        tr% = 0: tg% = 0: tb% = 0: COLOR f%+3,tr%,tg%,tb%
i%=f%+6: ALPHA i%: PARENT i%,f%: TOP i%,98: CAPTION i%,"Motif rempliss.:"
i%=f%+7: PICTURE i%: PARENT i%,f%: TOP i%,92: LEFT i%,89: WIDTH i%,38: HEIGHT i%,23
        COLOR i%,0,0,0
i%=f%+8: PICTURE i%: PARENT i%,f%: TOP i%,115: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
        HEIGHT i%,45: 2D_TARGET_IS i%: ON_CLICK i%,Destyp
        x% = 0: y% = 2
        2D_FILL_COLOR 0,0,0
        FOR j% = 1 TO 2
            FOR i% = 1 TO 4
                k% = (j%-1)*4+i%
                SELECT k%
                    CASE 1: 2D_FILL_OFF: 2D_FILL_COLOR 0,0,0: 2D_FILL_SOLID
                    CASE 2: 2D_FILL_CROSS
                    CASE 3: 2D_FILL_DIAGONAL_CROSS
                    CASE 4: 2D_FILL_DIAGONAL_DOWN
                    CASE 5: 2D_FILL_DIAGONAL_UP
                    CASE 6: 2D_FILL_HORIZONTAL
                    CASE 7: 2D_FILL_VERTICAL
                END_SELECT
                2D_RECTANGLE x%,y%,x%+31,y%+20: x%=x%+32
                IF j%=2 AND i%=3 THEN EXIT_FOR
            NEXT i%
            y%=y%+21: x% = 0
        NEXT j%
i%=f%+9: CONTAINER_OPTION i%: PARENT i%,f%: TOP i%,TOP(i%-1)+45: WIDTH i%,WIDTH(f%)-17
        LEFT i%,0: HEIGHT i%,170: COLOR i%,255,255,180: op% = i%
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,10: LEFT i%,3: CAPTION i%,"Trait"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,25: LEFT i%,3: CAPTION i%,"Libre"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,40: LEFT i%,3: CAPTION i%,"Rectangle vide"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,55: LEFT i%,3: CAPTION i%,"Rectangle plein"

i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,85: LEFT i%,3: CAPTION i%,"Cercle/Ellipse vide"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,100: LEFT i%,3: CAPTION i%,"Cercle/Ellipse plein"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,115: LEFT i%,3: CAPTION i%,"Remplir (motif)"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,130: LEFT i%,3: CAPTION i%,"Sélection/Copier"
i%=i%+1: OPTION i%: PARENT i%,op%: TOP i%,145: LEFT i%,3: CAPTION i%,"Coller"
        MARK_ON op%+1
        FOR j%=op%+1 TO i%: WIDTH j%,WIDTH(op%)-7: ON_CLICK j%,Desopt: NEXT j%
i%=i%+1: CHECK i%: PARENT i%,f%: TOP i%,TOP(op%)+69: LEFT i%,20: CAPTION i%,"coins arrondis"
        COLOR i%,255,255,180: ck%=i%

i%=i%+1: BUTTON i%: PARENT i%,f%: WIDTH i%,60: TOP i%,TOP(op%)+HEIGHT(op%)
          HEIGHT i%,20: CAPTION i%,"Annuler": ON_CLICK i%,Desanu
i%=i%+1:BUTTON i%: PARENT i%,f%: WIDTH i%,55:TOP i%,TOP(i%-1): LEFT i%,70
        HEIGHT i%,20: CAPTION i%,"Quitter": ON_CLICK i%,Desfin
2D_TARGET_IS p%: 2D_PEN_DOT

t%=i%+1: TIMER t%: PARENT t%,f%: TIMER_INTERVAL t%,40: ON_TIMER t%,Destim
ima% = t%+1: IMAGE ima%
trac% = 0: term% = 0: btg% = 0
fig% = 1: ret% = 0: cap$ = CAPTION$(0)
CLIPBOARD_COPY p%
WHILE 1 > 0: WAIT 100: END_WHILE: GOTO Desfin
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desopt:
' Type de figure
fig% = 1: ' trait
IF CHECKED(op%+2) = 1
    fig% = 2: ' tracé libre
'    FILE_SAVE p%,fpr$: ' sauvegarde préalable
    CLIPBOARD_COPY p%
    IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
ELSE
    IF CHECKED(op%+3) = 1 OR CHECKED(op%+4) = 1 OR CHECKED(op%+8) = 1
        fig% = 3: ' rectangle vide ou plein
    ELSE
        IF CHECKED(op%+5) = 1 OR CHECKED(op%+6) = 1
            fig% = 4: ' cercle vide ou plein
        ELSE
            IF CHECKED(op%+7) = 1
                fig% = 5: ' remplissage
            ELSE
                IF CHECKED(op%+9) = 1
                    fig% = 6: ' coller
                END_IF
            END_IF
        END_IF
    END_IF
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destim:
IF CHECKED(op%+7)=1 THEN RETURN: ' remplissage
cpt = cpt+1: IF cpt>1000 THEN cpt = 2
x% = MOUSE_X_POSITION(p%)/r: y% = MOUSE_Y_POSITION(p%)/r: ' position actuelle souris
a$ =  "X= "+STR$(x%)+" pixels  Y= "+STR$(y%)+" pixels"
CAPTION 0,a$
2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
IF MOUSE_LEFT_DOWN(p%) = 1: ' bouton gauche souris enfoncé
    IF fig% = 6: ' coller
        IF FILE_EXISTS(fcp$) = 0 THEN RETURN: ' pas de copie
'        FILE_SAVE p%,fpr$
        CLIPBOARD_COPY p%
        IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
        FILE_LOAD ima%,fcp$: 2D_IMAGE_PASTE ima%,x%,y%
    ELSE
        x1% = x%: y1% = y%: ' origine
        trac% = 1
        IF fig% = 2 AND btg% = 0
'          FILE_SAVE p%,fpr$: ' sauvegarde préalable
          CLIPBOARD_COPY p%
          IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
        END_IF
        btg% = 1
    END_IF
END_IF
IF MOUSE_LEFT_UP(p%) = 1: ' relâche, tracé final
    btg% = 0
    IF x1% = -1 THEN RETURN
    TIMER_OFF t%
    ' clipboard_paste p%:
    term% = 1: 2D_PEN_SOLID
    SELECT fig%
        CASE 1: GOSUB Destra
        CASE 2: GOSUB Deslib
        CASE 3: GOSUB Desrec
        CASE 4: GOSUB Desron
        CASE 5: GOSUB Desrem
    END_SELECT
    ' x1% = sx1%: x2% = sx2%: y1% = sy1%: y2% = sy2%
    CLIPBOARD_COPY p%: term% = 0
    trac% = 0: 2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
    TIMER_ON t%
END_IF
IF trac% = 1
    ' tracé provisoire, en continu
    2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
    if x1% = -1 then return
    x2% = x%: y2% = y%: ' position actuelle
    IF x2%=x3% AND y2%=y3% THEN RETURN: ' position inchangée
    2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1/r
    SELECT fig%
        CASE 1: GOSUB Destra
        CASE 2: GOSUB Deslib
        CASE 3: GOSUB Desrec
        CASE 4: GOSUB Desron
    END_SELECT
    x3% = x%: y3% = y%
END_IF
TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destra:
' Tracé de droite
IF cpt = 1 THEN RETURN: ' init
CLIPBOARD_PASTE p%: IF term% = 1
'  FILE_SAVE p%,fpr$: ' sauvegarde préalable
  CLIPBOARD_COPY p%
  IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
END_IF
2D_LINE x1%,y1%,x2%,y2%
IF term% = 1 THEN x1% = -1: ' fin de tracé
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Deslib:
' Tracé libre
2D_PEN_SOLID: 2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
2D_LINE x1%,y1%,x2%,y2%: x1%=x2%: y1%=y2%
IF term% = 1 THEN x1% = -1
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrec:
' Rectangle vide ou plein
CLIPBOARD_PASTE p%: IF term% = 1
'  FILE_SAVE p%,fpr$: ' sauvegarde préalable
  CLIPBOARD_COPY p%
  IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
END_IF
IF term% = 1 AND CHECKED(op%+8) = 1: ' Fin de Select/copie, sauvegarde zone
    2D_IMAGE_COPY ima%,x1%,y1%,x2%,y2%: FILE_SAVE ima%,fcp$
ELSE
    IF term% = 1: ' tracé final
        CLIPBOARD_PASTE p%
        IF CHECKED(ck%) = 1: ' rectangle à coins arrondis
            j% = x2%-x1%: k% = y2%-y1%: ' largeur, hauteur
            i% = 20/r: ' rayon de courbure arbitraire
            WHILE i%>j%/2 OR i%>k%/2: i%=i%-1: END_WHILE: ' diminuer le rayon
            cpt = PI/i%: ' pas (angle)
            x% = x1%+i%: y% = y1%+i%
            2D_LINE x2%-i%,y1%,x1%+i%,y1%
            FOR an = PI/2 TO PI STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            y% = y2%-i%
            2D_POLY_TO x1%,y2%-i%
            FOR an = PI TO 3*PI/2 STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            x% = x2%-i%
            FOR an = 3*PI/2 TO 2*PI STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            y% = y1%+i%
            FOR an = 0 TO PI/2+cpt STEP cpt
                2D_POLY_TO x%+i%*COS(an),y%-i%*SIN(an)
            NEXT an
            IF CHECKED(op%+4) = 1: ' rectangle plein
                x% = x1%+(x2%-x1%)/2: y% = y1%+(y2%-y1%)/2
                2D_FLOOD x%,y%,tr%,tg%,tb%
            END_IF
        ELSE
            IF CHECKED(op%+4) = 1: ' rectangle plein
                2D_FILL_OFF: 2D_FILL_COLOR tr%,tg%,tb%: 2D_RECTANGLE x1%,y1%,x2%,y2%
            ELSE
                2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
            END_IF
        END_IF
        x1% = -1
    ELSE: ' tracé provisoire
        2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
    END_IF
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desron:
' Ellipse (ou cercle si Maj enfoncé)
CLIPBOARD_PASTE p%: IF term% = 1
  CLIPBOARD_COPY p%
  IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
'  FILE_SAVE p%,fpr$: ' sauvegarde préalable
END_IF
rx% = (x2%-x1%)/2: ry% = (y2%-y1%)/2: ' rayons H et V
IF SCANCODE = 160 THEN ry% = rx%: SCANCODE = 0: ' cercle: touche 'Maj' enfoncée
x3% = x1%+rx%: y3% = y1%+ry%: ' centre
pix = 4*ATN(1)
2D_POLY_FROM x3%+rx%,y3%
FOR an = 0 TO 2*pix STEP pix/180
    2D_POLY_TO x3%+rx%*COS(an),y3%+ry%*SIN(an)
NEXT an
IF term% = 1: ' tracé final
    IF CHECKED(op%+6) = 1: ' cercle/ellipse plein
        2D_FLOOD x3%,y3%,tr%,tg%,tb%
    END_IF
    x1% = -1
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destyp:
' Type de remplissage: plein ou motif
x%=MOUSE_X_LEFT_DOWN(f%+8): y%=MOUSE_Y_LEFT_DOWN(f%+8)
i% = 1+INT(x%/31): j% = 1+INT(y%/20): k% = (j%-1)*4+i%: IF k% = 8 THEN RETURN
2D_TARGET_IS f%+7: CLS: 2D_FILL_COLOR 0,0,0
SELECT k%
    CASE 1: 2D_FILL_OFF: 2D_FILL_COLOR 0,0,0: 2D_FILL_SOLID
    CASE 2: 2D_FILL_CROSS
    CASE 3: 2D_FILL_DIAGONAL_CROSS
    CASE 4: 2D_FILL_DIAGONAL_DOWN
    CASE 5: 2D_FILL_DIAGONAL_UP
    CASE 6: 2D_FILL_HORIZONTAL
    CASE 7: 2D_FILL_VERTICAL
END_SELECT
2D_RECTANGLE 0,0,WIDTH(f%+7),HEIGHT(f%+7)
2D_TARGET_IS p%
SELECT k%
    CASE 1: 2D_FILL_OFF: 2D_FILL_SOLID
    CASE 2: 2D_FILL_CROSS
    CASE 3: 2D_FILL_DIAGONAL_CROSS
    CASE 4: 2D_FILL_DIAGONAL_DOWN
    CASE 5: 2D_FILL_DIAGONAL_UP
    CASE 6: 2D_FILL_HORIZONTAL
    CASE 7: 2D_FILL_VERTICAL
END_SELECT
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrem:
' Remplissage au clic souris (uniquement la partie uniforme)
IF CHECKED(op%+7)=0 THEN RETURN
' FILE_SAVE p%,fpr$: ' sauvegarde préalable
CLIPBOARD_COPY p%
IL_count% = DLL_CALL4("AddImageToImageList",IL%,0,0,0)
x% = MOUSE_X_LEFT_DOWN(p%)/r: y% = MOUSE_Y_LEFT_DOWN(p%)/r
2D_FLOOD x%,y%,tr%,tg%,tb%
x1% = -1
CLIPBOARD_COPY p%
TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desanu:
' Annule la dernière opération
' IF FILE_EXISTS(fpr$) = 1 THEN FILE_LOAD p%,fpr$: CLIPBOARD_COPY p%
IF IL_count%>0
  IL_count% = DLL_CALL5("ExtractImageFromImageList",IL%,IL_count%-1,1,1,0)
  CLIPBOARD_PASTE p%
  pause 100
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Descou:
' Choix de la couleur
x%=MOUSE_X_LEFT_DOWN(f%+5): y%=MOUSE_Y_LEFT_DOWN(f%+5)
tr%=COLOR_PIXEL_RED(f%+5,x%,y%): tg%=COLOR_PIXEL_GREEN(f%+5,x%,y%)
tb%=COLOR_PIXEL_BLUE(f%+5,x%,y%): COLOR f%+3,tr%,tg%,tb%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desfin:
ret% = 1
TIMER_OFF t%: DELETE t%: OFF_CLICK p%: 2D_TARGET_IS n2t%
DELETE f%: DELETE ima%: CAPTION 0,cap$
WAIT 100
subact% = 0: EXIT_SUB
RETURN
END_SUB
' ==============================================================================

Fais plusieurs dessins, puis "Annuler" en série - c'est magique !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 20:40

Je viens de charger et lancer ta version, et là bizarrement le bouton Annuler n'annule plus rien du tout, même pas la dernière action, il est complètement inactif ?
Je n'ai pas analysé le code, juste mis à jour mon chemin de KGF.dll...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12276
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 20:47

As-tu récupéré la dernière version de KGF.dll, la V6.01 du 18/02/2016 ? Il faut celle-là pour la fonction d'extraction d'images...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 20:59

EXACT Klaus ! j'en étais encore à la version du 12/2 autrement dit une éternité en retard, ça va tellement vite !
Là du coup ça marche très bien, c'est même bien séduisant et tentant toutes ces annulations possibles en série...

PS j'ai ajouté une option 'Texte' pour insertion de petits textes dans l'image.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12276
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyJeu 18 Fév 2016 - 23:48

Super !

Bon, maintenant, su tu veux faire la même chose sans KGF.dll, tu procèdes comme suit:
1.définir une variable globale desNumeroSauvegarde%
2. initialement, mettre cette variable à zéro, au moment de la définition
3. choisir un nom de fichier temporaire, tel que desSauvegarde$="C:\...\tmp\desSauvegarde"
4. à chaque sauvegarde:
4.1. incrémenter desNumeroSauvegarde%
4.2. sauvegarder l'objet p% dans desSauvegarde$+str$(desNumeroSauvegarde%)+".bmp"
5. à chaque restauration:
5.1. si desNumeroSauvegarde%=0, alors ne rien faire - on est au niveau initial
5.2. sinon, recharger le fichier desSauvegarde$+str$(desNumeroSauvegarde%)+".bmp" dans l'objet p%
5.3. et décrémenter desNumeroSauvegarde%

Voilà. Fonctionnellement, c'est identique. Plus lent et utilisation de fichiers, mais tout aussi efficace.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyVen 19 Fév 2016 - 10:16

Merci Klaus, je garde tout ça sous le coude.
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptySam 20 Fév 2016 - 14:29

J'ai ajouté la possibilité de déplacer la dernière figure dessinée (ou le texte) dans les quatre directions, d'un nombre de pixels choisi.

Allez Jean Claude, pour te faire plaisir, j'ai ajouté la possibilité de plusieurs retours arrière par appuis successifs sur 'Annuler'.
(une sauvegarde est effectuée après le dessin de chaque figure).

C'est la variable ntsg% qui détermine le nombre de retours arrière possibles, je l'ai fixée à 5, mais c'est modulable à sa guise.

Les sauvegardes sont faites dans le répertoire de manoeuvre (ici C:\TEMP\), au format bmp. A noter qu'elles sont effacées à la sortie de la sub, pour faire place nette.
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5948
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptySam 20 Fév 2016 - 20:46

Ah! merci JL35, j'aime que tu me fasses plaisir,

Je vais essayer ça, c'est un plus pour ta procédure de pouvoir annuler plusieurs actions précédentes.

Je vais également tester le déplacement de la dernière figure dessinée, mais à ce propos pourquoi ne pourrais-t'on pas déplacer toutes les figures crée depuis le début.... STOP, j'arrête là, j'abuse, je sors.  confused   Embarassed   Razz

A+


Dernière édition par Jean Claude le Dim 21 Fév 2016 - 8:54, édité 1 fois
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 21 Fév 2016 - 0:36

Ah non Jean Claude, faut pas pousser mémé dans les orties !
Ça c'est NIET, d'abord parce que je n'en vois pas trop l'intérêt, et ensuite parce que ce serait trop compliqué à coder dans une sub.

J'espère que ça ne t'empêchera pas de dormir, moi en attendant Sleep
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12276
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 21 Fév 2016 - 1:22

Citation :
ce serait trop compliqué à coder dans une sub.
si jamais tu envisages de faire cela, en fait, c'est très simple ! Il suffit de faire ceci:
1. mémoriser l'image actuelle pour le retour arrière, éventuellement
2. utiliser 2D_IMAGE_COPY pour copier la partie du picture qui restera visible APRES le décalage
3. effacer le picture
4. utiliser 2D_IMAGE_PASTE pour mettre la partie copiée dans sa nouvelle position

Nul besoin de tenir compte des positions des dessins successifs - ce serait impossible. Mais comme on raisonne sur l'image dans sa totalité, cela devient simple.

Un exemple:
un décalage de 10 pixels vers la droite va faire disparaître une bande verticale de 10 pixels.
Donc, tu fais un 2D_IMAGE_COPY N,0,0,w%-10,h% : ' w% représente la largeur du picture, N est le numéro d'objet d'un IMAGE Panoramic.
Ensuite, tu effaces le picture (par la commande COLOR, par exemple).
Pour finir, tu récupères l'image copiée par 2D_IMAGE_COPY 10,0 et le tour est joué.

Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jean Claude

Jean Claude


Nombre de messages : 5948
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 21 Fév 2016 - 8:52

Ben, alors, tu vois JL35 que c'est possible ! Razz Very Happy Laughing

Ne fais pas le ronchon, la démonstration de Klaus est valide.

Bon ! j'arrête de t’embêter: si tu veux pas, tu veux pas.

lol!
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin EmptyDim 21 Fév 2016 - 10:52

Puisque c'est comme ça, je vais rester sur mon premier argument "je n'en vois pas trop l'intérêt", (disons que dans toutes les expériences que j'ai fait je n'en ai jamais éprouvé le besoin), et donc je ne suis pas motivé pour le faire.

Maintenant, puisque c'est facile à implémenter, chacun peut modifier le code à sa guise, c'est grand ouvert ! Very Happy

Et bon dimanche à tous, là j'ai du monde qui va arriver.

Et Jean Claude, prends bien soin de toit.
Revenir en haut Aller en bas
Contenu sponsorisé





Boîte à outils de dessin Empty
MessageSujet: Re: Boîte à outils de dessin   Boîte à outils de dessin Empty

Revenir en haut Aller en bas
 
Boîte à outils de dessin
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Boîte à outils de dessin dans un picture
» boite de sélection et boite de texte
» Des outils à enrichir …
» Outils couleurs
» Outils Windows

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: