PureBasic

Forums PureBasic
Nous sommes le Jeu 12/Déc/2019 12:26

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
 Sujet du message: TUTO draw in mm with grid and zoom
MessagePosté: Lun 18/Mar/2019 14:04 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1662
Localisation: Belgique
Bonjour à tous,
Je travaille actuellement sur un logiciel de plan (2d -> 3d) en Pb, je met à votre disposition ce petit bout de code pour la gestion d'un dessin en mm avec grille magnétique et zoom
  • CTRL + molette pour augmenté ou diminué le zoom


Image

Image

Code:
; ********************************************************************************************************
; AUTHOR          : MICRODEVWEB
; PROJECT         : TUTO DRAW
; DESIGNED WITH   : PB 5.70
; ********************************************************************************************************
EnableExplicit
Enumeration
  #MAIN_FORM
  #CANVAS
EndEnumeration
Structure pos
  x.l
  y.l
  w.l
  h.l
EndStructure
; constantes
#BACK_COLOR = $FFAAE8EE
#GRID_COLOR = $8213458B
#CURSOR_COLOR = $F70000FF
#GRID_SIZE = 50 ; mm
#GRID_SENSITIVE = 20.0
#BOX_WIDTH = 1000 ; mm
#BOX_HEIGHT = 100 ; mm
; Variables globales
Global gZoom.f = 0.2 ; facteur de zoom
Global gMX,gMY ; position de la souris

Procedure coordinatesTo_MM(x,y,*x,*y)
  PokeL(*x,ConvertCoordinateX(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
  PokeL(*Y,ConvertCoordinateY(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
EndProcedure
Procedure coordinatesTo_MM_bis(x,y,*x,*y)
  StartVectorDrawing(CanvasVectorOutput(#CANVAS,#PB_Unit_Millimeter))
  ScaleCoordinates(gZoom,gZoom) ; le facteur de zoom
  PokeL(*x,ConvertCoordinateX(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
  PokeL(*Y,ConvertCoordinateY(x,y,#PB_Coordinate_Device,#PB_Coordinate_User))
  StopVectorDrawing()
EndProcedure

Procedure drawGrid()
  ; dessin de la grille
  Protected r = #GRID_SIZE,c = #GRID_SIZE
  Protected w,h
  ; on transform la taille du canvas en mm
  coordinatesTo_MM(GadgetWidth(#CANVAS),GadgetHeight(#CANVAS),@w,@h)
  ; on efface
  VectorSourceColor(#BACK_COLOR)
  FillVectorOutput()
  ; dessin des colonnes
  While c < w
    MovePathCursor(c,0)
    AddPathLine(c,h)
    c + #GRID_SIZE
  Wend
  ; dessin des lignes
  While r < h
    MovePathCursor(0,r)
    AddPathLine(w,r)
    r + #GRID_SIZE
  Wend
  VectorSourceColor(#GRID_COLOR)
  StrokePath(0.2) ; Attention en mm
EndProcedure

Procedure drawCursor()
  Protected w,h
  ; on transform la taille du canvas en mm
  coordinatesTo_MM(GadgetWidth(#CANVAS),GadgetHeight(#CANVAS),@w,@h)
  ; horizontal
  MovePathCursor(0,gMY)
  AddPathLine(w,gMY)
  ; vertical
  MovePathCursor(gMX,0)
  AddPathLine(gMx,h)
  VectorSourceColor(#CURSOR_COLOR)
  StrokePath(0.3) ; Attention en mm
EndProcedure

Procedure manageMagnet()
  ; gestion de l'aimantation
  Protected x,y,lM.f = #GRID_SIZE  - #GRID_SENSITIVE,LP.f = #GRID_SENSITIVE
    If Mod(gMX,#GRID_SIZE) >= LM
      x =  Round(gMX/#GRID_SIZE,#PB_Round_Up) * #GRID_SIZE
      gMX = x
    ElseIf Mod(gMX,#GRID_SIZE) <= LP
      x =  Round(gMX/#GRID_SIZE,#PB_Round_Nearest) * #GRID_SIZE
      gMX = x
    EndIf
    If Mod(gMY,#GRID_SIZE) >= LM
      Y =  Round(gMY/#GRID_SIZE,#PB_Round_Up) * #GRID_SIZE
      gMY = y
    ElseIf Mod(gMY,#GRID_SIZE) <= LP
      Y =  Round(gMY/#GRID_SIZE,#PB_Round_Nearest) * #GRID_SIZE
      gMY = y
    EndIf
EndProcedure

Procedure draw()
  ; dessin du canvas en mm
  StartVectorDrawing(CanvasVectorOutput(#CANVAS,#PB_Unit_Millimeter))
  ScaleCoordinates(gZoom,gZoom) ; le facteur de zoom
  drawGrid()                    ; dessin de la grille
  drawCursor()                  ; dessin du curseur
  StopVectorDrawing()
EndProcedure

Procedure evExit()
  End
EndProcedure

Procedure evCanvas()
  Select EventType()
    Case #PB_EventType_MouseWheel
      ; gestion du zoom uniquement si touche controle appuyée
      If GetGadgetAttribute(#CANVAS,#PB_Canvas_Modifiers) = #PB_Canvas_Control
        If GetGadgetAttribute(#CANVAS,#PB_Canvas_WheelDelta) < 1
          If gZoom > 0.03
            gZoom -0.01
          EndIf
        Else
          If gZoom <100
            gZoom +0.01
          EndIf
        EndIf
      EndIf
      draw()
    Case #PB_EventType_MouseMove
      ; on mémorise la position de la souris
      coordinatesTo_MM_bis(GetGadgetAttribute(#CANVAS,#PB_Canvas_MouseX),
                           GetGadgetAttribute(#CANVAS,#PB_Canvas_MouseY),
                           @gMX,@gMY)
      manageMagnet()
      draw()
  EndSelect
EndProcedure

Procedure openForm()
  Protected flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu
  OpenWindow(#MAIN_FORM,0,0,800,600,"Tuto draw in mm",flags)
  CanvasGadget(#CANVAS,0,0,800,600,#PB_Canvas_Keyboard) ; important pour lire le delata wheel
  ; mise en place des callback
  BindEvent(#PB_Event_CloseWindow,@evExit(),#MAIN_FORM)
  BindGadgetEvent(#CANVAS,@evCanvas())
 
  draw()
EndProcedure

openForm()
; main loop
Repeat : WaitWindowEvent() : ForEver

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Dernière édition par microdevweb le Mar 19/Mar/2019 11:16, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Lun 18/Mar/2019 16:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2213
Localisation: 50200 Coutances
Bonjour microdevweb et merci beaucoup pour le partage.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mar 19/Mar/2019 19:53 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6661
Localisation: Isere
M'étonnera toujours ce PB du minimum de lignes pour un max d'effets 8O
Merci pour le partage 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mar 19/Mar/2019 21:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4071
Kwai chang caine a écrit:
M'étonnera toujours ce PB du minimum de lignes pour un max d'effets 8O
Merci pour le partage 8)

+1 8) 8O

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.70LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mer 20/Mar/2019 5:14 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3524
Et encore, la procédure magnet peut être encore considérablement diminuée.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mer 20/Mar/2019 8:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6661
Localisation: Isere
En tout cas pas par moi :oops: :wink:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mar 18/Juin/2019 15:58 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2009 13:28
Messages: 60
Impressionnant !

Là, je me dit qu'il y a des têtes sur ce forum !

Un grand merci pour le partage.

_________________
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TUTO draw in mm with grid and zoom
MessagePosté: Mar 18/Juin/2019 21:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8785
Très propre l'interface.
Bonne continuation. C'est du lourd.

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye