Traçage de triangles dans la PictureBox
Résolu
Lenouveauapprenti
Messages postés
306
Date d'inscription
Statut
Membre
Dernière intervention
-
Lenouveauapprenti Messages postés 306 Date d'inscription Statut Membre Dernière intervention -
Lenouveauapprenti Messages postés 306 Date d'inscription Statut Membre Dernière intervention -
Bonjour :
Franchement je me suis trouvé dans l'impasse. J'ai besoin de votre aide.
Je m'explique :
J'ai :
6 pièces de 75 cm x 60 cm
5 pièces de 70 cm x 40 cm
1 plaque de 30 cm x 300 cm
je tente une fois je clique sur le bouton "Afficher"
- la PictureBox (Picture1) apparaît avec dedans
- Premiere rangée 4 triangles de 75 x 60 ( capacité de la longueur : 300 \ 75 )
- Deuxième rangée 2 triangles de 75 x 60 (Reste de triangles )
- Troisième rangée 4 triangles de 70 x 40 (Capacité de la longueur)
- Quatrième rangée 1 triangle de 70 x 40 (Reste)
avec bien sûr une condition de vérification de la capacité de la largeur (Hauteur ) si jamais elle atteint sa capacité passe à une deuxième plaque, ainsi de suite
je vous expose mes codes ( Veuillez excuser mon écriture, je fais de mon mieux, toute correction est la bienvenue avec toute ma reconnaissance)
Mon problème est que les tracées s'imbriquent.
Merci d'avance pour toute aide ou correction
Franchement je me suis trouvé dans l'impasse. J'ai besoin de votre aide.
Je m'explique :
J'ai :
6 pièces de 75 cm x 60 cm
5 pièces de 70 cm x 40 cm
1 plaque de 30 cm x 300 cm
je tente une fois je clique sur le bouton "Afficher"
- la PictureBox (Picture1) apparaît avec dedans
- Premiere rangée 4 triangles de 75 x 60 ( capacité de la longueur : 300 \ 75 )
- Deuxième rangée 2 triangles de 75 x 60 (Reste de triangles )
- Troisième rangée 4 triangles de 70 x 40 (Capacité de la longueur)
- Quatrième rangée 1 triangle de 70 x 40 (Reste)
avec bien sûr une condition de vérification de la capacité de la largeur (Hauteur ) si jamais elle atteint sa capacité passe à une deuxième plaque, ainsi de suite
je vous expose mes codes ( Veuillez excuser mon écriture, je fais de mon mieux, toute correction est la bienvenue avec toute ma reconnaissance)
Dim A, B As Double
Dim Decoupe, DecoupeR As String
Decoupe = "Decoupe"
Dim I, PI, DI, NbrePieces, NFois, ResteP As Integer
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveFirst
PI = RS![NOrdre]
End If
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveLast
DI = RS![NOrdre]
End If
'Boucle
Dim PLigne, PColonne As Integer
Dim PL, AL, PLigne1, NOrdrePiece, NOrdrePrime As Integer
Dim PosL As Integer
PosL = 0
For I = PI To DI Step 1
'Références de Pieces
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (NOrdre=" & CInt(I) & "))"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] = I Then
DecoupeR = RS![Operation]
If DecoupeR <> Decoupe Then
GoTo Ignore:
Exit Sub
End If
NbrePieces = RS![NbrePiece]
A = RS![Longueur]
B = RS![Largeur]
End If
RS.Close
'Nombre de pièces par ligne (Longueur)
PLigne = CDbl(LblLongueur) \ A
'Nombre de pièces par hauteur (Largeur)
PColonne = CDbl(LblLargeur) \ B
If PLigne <> 0 Then
GoTo Ok1:
Exit Sub
Else
GoTo Pas1:
Exit Sub
End If
Ok1:
If PColonne <> 0 Then
GoTo Ok2:
Exit Sub
Else
GoTo Pas2:
Exit Sub
End If
Ok2:
'Placer les objets
For PL = 1 To PLigne Step 1
Picture1.Line (0 + ((PL - 1) * A), 0 + PosL)-Step(A, B), vbRed, B
'Définir Nombre de pièce restées à tracer sur la ragngée suivante
ResteP = CInt(NbrePieces) - CInt(PLigne)
If PL = PLigne Then
If ResteP = 0 Then
GoTo Ok4:
Exit Sub
Else
GoTo Ok5:
Exit Sub
End If
Ok5:
GoTo AutreLigne:
Exit Sub
ElseIf PL = NbrePieces Then
GoTo Ok3:
Exit Sub
End If
AutreLigne:
If ResteP > PLigne Then
PLigne1 = PLigne
GoTo Li:
Exit Sub
ElseIf ResteP <= PLigne Then
PLigne1 = ResteP
GoTo Li1:
Exit Sub
End If
Li:
Li1:
'La rangée suivante
For AL = 1 To PLigne1 Step 1
Picture1.Line (0 + ((AL - 1) * A), 0 + B)-Step(A, B), vbRed, B
Next AL
Next PL
Ok4:
Ok3:
Pas1:
Pas2:
Ignore:
'Définir le n fois de rangées
NFois = NFois + 1
'Définir la position de la rangée
PosL = CDbl(PosL) + (CDbl(B) * NFois)
Next I
Mon problème est que les tracées s'imbriquent.
Merci d'avance pour toute aide ou correction
A voir également:
- Traçage de triangles dans la PictureBox
- Tracage ip - Guide
- Livre de traçage chaudronnerie pdf à télécharger gratuitement - Forum Windows
- Tracage colis - Guide
- Comment activer tracage mobile samsung - Guide
- Logiciel de traçage chaudronnerie gratuit - Forum Logiciels
2 réponses
Bonjour
Suite à ma première demande d'aide pour mes boucles à tracer des rectangles à l'intérieur de PictureBox, et pour laquelle je n'ai aucune réaction, j'ai pu après plusieurs essais à les bien placer avec la mention de leurs dimensions au centre de chacun d'eux.
Seulement je me suis rendu compte que lorsque le nombre de pièces dépasse un nombre bien précis ( en relation avec la capacité de la longueur) la boucle ignore l'instruction de tracer le reste à la troisième rangée ( La question de la capacité de la largeur est restée pou après )
Voilà les données une autre fois:
- Plaque ( représentée par PictureBox "Picture1") de 300 cm x 300 cm
- Pièces (représentées par Triangles )
-7 pièces de 75 cm x 60 cm
-8 pièces de 70 cm x 40 cm
Avec ces boucles tout marche bien, et les triangles se tracent convenablement.
Mais, et vu que je n'ai que deux boucles, le problème est là, lorsque
-Pièces de 75 cm x 60 cm est supérieur à 8 unités
-Pièce de 70 cm x 40 cm est supérieur à 8 unités
C'est vrai que pour résoudre ce problème je devrai ajouter une autre boucle ce qui chargera trop mes codes
C'est dans ce sens que je m'adresse à vous LES AVERTIS de la programmation ( VB6) de bien vouloir me donner une formule qui peut me donner la bonne solution peu importe le nombre de pièces.
Merci d'avance
Suite à ma première demande d'aide pour mes boucles à tracer des rectangles à l'intérieur de PictureBox, et pour laquelle je n'ai aucune réaction, j'ai pu après plusieurs essais à les bien placer avec la mention de leurs dimensions au centre de chacun d'eux.
Seulement je me suis rendu compte que lorsque le nombre de pièces dépasse un nombre bien précis ( en relation avec la capacité de la longueur) la boucle ignore l'instruction de tracer le reste à la troisième rangée ( La question de la capacité de la largeur est restée pou après )
Voilà les données une autre fois:
- Plaque ( représentée par PictureBox "Picture1") de 300 cm x 300 cm
- Pièces (représentées par Triangles )
-7 pièces de 75 cm x 60 cm
-8 pièces de 70 cm x 40 cm
Private Sub CmdAfficher_Click()
With Picture1
.Visible = True
.Cls
.AutoRedraw = True
.ScaleMode = vbPixels
.Appearance = 0
.BorderStyle = 0
.Left = 4300
.Top = 1000
.Width = CDbl(LblLongueur) * Screen.TwipsPerPixelX
.Height = CDbl(LblLargeur) * Screen.TwipsPerPixelY
End With
'__________________________________
Dim A, B As Double
Dim Decoupe, DecoupeR As String
Decoupe = "Decoupe"
Dim I, PI, DI, NbrePieces, NFois, ResteP As Integer
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveFirst
PI = RS![NOrdre]
End If
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveLast
DI = RS![NOrdre]
End If
'Boucle
Dim PLigne, PColonne As Integer
Dim PL, AL, AL1, PLigne1, PLi As Integer
Dim PosL, Larg, Larg1 As Double
PosL = 0
PLi = 0
For I = PI To DI Step 1
'Références de Pieces
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (NOrdre=" & CInt(I) & "))"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] = I Then
DecoupeR = RS![Operation]
If DecoupeR <> Decoupe Then
GoTo Ignore:
Exit Sub
End If
NbrePieces = RS![NbrePiece]
A = RS![Longueur]
B = RS![Largeur]
End If
RS.Close
'Nombre de pièces par ligne (Longueur)
PLigne = CDbl(LblLongueur) \ A
'Nombre de pièces par hauteur (Largeur)
PColonne = CDbl(LblLargeur) \ B
If PLigne <> 0 Then
GoTo Ok1:
Exit Sub
Else
GoTo Pas1:
Exit Sub
End If
Ok1:
If PColonne <> 0 Then
GoTo Ok2:
Exit Sub
Else
GoTo Pas2:
Exit Sub
End If
Ok2:
'Largeur
'Placer les objets
For PL = 1 To PLigne Step 1
Larg = CDbl(B)
Picture1.Line (0 + ((PL - 1) * A), 0 + PosL)-Step(A, B), vbRed, B
Picture1.CurrentX = ((0 + (CDbl(A) / 4)) + (PL - 1) * A)
Picture1.CurrentY = ((0 + (CDbl(B) / 4)) + PosL)
Picture1.Print "" & A & "x" & B
'Définir Nombre de pièce restées à tracer sur la ragngée suivante
ResteP = CInt(NbrePieces) - CInt(PLigne)
If PL = PLigne Then
If ResteP = 0 Then
GoTo Ok4:
Exit Sub
Else
GoTo Ok5:
Exit Sub
End If
Ok5:
GoTo AutreLigne:
Exit Sub
ElseIf PL = NbrePieces Then
GoTo Ok3:
Exit Sub
End If
AutreLigne:
If ResteP > PLigne Then
PLigne1 = PLigne
GoTo Li:
Exit Sub
ElseIf ResteP <= PLigne Then
PLigne1 = ResteP
GoTo Li1:
Exit Sub
End If
Li:
Li1:
'La rangée suivante
For AL = 1 To PLigne1 Step 1
Larg1 = CDbl(B)
Picture1.Line (0 + ((AL - 1) * A), 0 + (Larg1 + PosL))-Step(A, B), vbRed, B
Picture1.CurrentX = ((0 + CDbl(A / 4)) + (AL - 1) * A)
'Picture1.CurrentY = ((0 + (CDbl(B) / 4)) + B)
Picture1.CurrentY = ((0 + (CDbl(B) / 4)) + (Larg1 + PosL))
Picture1.Print "" & A & "x" & B
Next AL
Next PL
Ok4:
Ok3:
Pas1:
Pas2:
Ignore:
'Définir la position de la rangée
PosL = CDbl(PosL) + CDbl(Larg) + CDbl(Larg1)
Next I
End Sub
Avec ces boucles tout marche bien, et les triangles se tracent convenablement.
Mais, et vu que je n'ai que deux boucles, le problème est là, lorsque
-Pièces de 75 cm x 60 cm est supérieur à 8 unités
-Pièce de 70 cm x 40 cm est supérieur à 8 unités
C'est vrai que pour résoudre ce problème je devrai ajouter une autre boucle ce qui chargera trop mes codes
C'est dans ce sens que je m'adresse à vous LES AVERTIS de la programmation ( VB6) de bien vouloir me donner une formule qui peut me donner la bonne solution peu importe le nombre de pièces.
Merci d'avance
Bonjour
Enfin, après maintes reflexions et essais, j'ai trouvé l'astuce de placer les formes juridiques en nombres déclarés et sans imbrications.
Je vous remets le code :
Merci quand même
Enfin, après maintes reflexions et essais, j'ai trouvé l'astuce de placer les formes juridiques en nombres déclarés et sans imbrications.
Je vous remets le code :
With Picture1
.Visible = True
.Cls
.AutoRedraw = True
.ScaleMode = vbPixels
.Appearance = 0
.BorderStyle = 0
.Left = 4300
.Top = 1000
.Width = CDbl(LblLongueur) * Screen.TwipsPerPixelX
.Height = CDbl(LblLargeur) * Screen.TwipsPerPixelY
End With
'________________________________________________________________
Dim A, B As Double
Dim Decoupe, DecoupeR As String
Decoupe = "Decoupe"
Dim I, PI, DI, NbrePieces, NFois, ResteP As Integer
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveFirst
PI = RS![NOrdre]
End If
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (Operation='" & CStr(Decoupe) & "')" _
& "and (Facture=" & CInt(FDecoupe.TAffaire) & "))" & "order by NOrdre asc"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] <> 0 Then
RS.MoveLast
DI = RS![NOrdre]
End If
'Boucle
Dim Pligne, PColonne, PL, CumulPLigne As Integer
Dim NbreRangees, NbreRangeesSansDecimal, Deci, R, LargRangee As Double
LargRangee = 0
CumulPLigne = 0
For I = PI To DI Step 1
'Références de Pieces
SQLs = "select * from TableOperations where ((Dossier='" & CStr(VarDossier) & "') and (NOrdre=" & CInt(I) & "))"
If RS.State = adStateOpen Then RS.Close
RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
If RS![NOrdre] = I Then
DecoupeR = RS![Operation]
If DecoupeR <> Decoupe Then
GoTo Ignore:
Exit Sub
End If
NbrePieces = RS![NbrePiece]
A = RS![Longueur]
B = RS![Largeur]
End If
RS.Close
'Nombre de pièces par ligne (Longueur)
Pligne = CDbl(LblLongueur) \ A
'Nombre de pièces par hauteur (Largeur)
PColonne = CDbl(LblLargeur) \ B
'Nombre de rangees
NbreRangees = NbrePieces / Pligne
NbreRangeesSansDecimal = Format(NbreRangees, "#,0")
Deci = CDbl(NbreRangees) - CDbl(NbreRangeesSansDecimal)
NbreRangees = CDbl(NbreRangees) + (1 - CDbl(Deci))
'Placer les objets
For R = 1 To NbreRangees Step 1
For PL = 1 To Pligne Step 1
Picture1.Line (0 + ((PL - 1) * A), 0 + LargRangee)-Step(A, B), vbRed, B
Picture1.CurrentX = ((0 + (CDbl(A) / 4)) + (PL - 1) * A)
Picture1.CurrentY = ((0 + (CDbl(B) / 4)) + LargRangee)
Picture1.Print "" & A & "x" & B
CumulPLigne = CInt(CumulPLigne) + 1
If CumulPLigne = NbrePieces Then
GoTo AutreDimensions:
Exit Sub
End If
Next PL
LargRangee = CDbl(LargRangee) + CDbl(B)
Next R
Ignore:
AutreDimensions:
LargRangee = CDbl(LargRangee) + CDbl(B)
CumulPLigne = 0
Next I
Merci quand même