jdsv Posté(e) le 17 août 2007 Posté(e) le 17 août 2007 bonsoir,voici mon problèmeJe tracer des lignes grâce au code suivant : Sub ligne(x1, y1, X2, y2) Dim P1(0 To 2) As Double Dim P2(0 To 2) As Double P1(0) = Log10(x1) * Correction_axe_x P1(1) = Log10(y1) P1(2) = 0 P2(0) = Log10(X2) * Correction_axe_x P2(1) = Log10(y2) P2(2) = 0 Set lineObj = ThisDrawing.ModelSpace.AddLine(P1, P2) End Sub Et je voudrais que les ségments tracer soit :- si il sont dans les limites tracer- si ils sont a cheval sur les limites ajuster- si sont hors des limites ne pas les tracerles limites sont définies par X_maxi, Y_maxi, X_min, Y_maxi qui sonts des variable pubic j''ai commencé à tavailler sur le code mais je m'égard dans les tests qui s'imbrique merci de votre aide [Edité le 17/8/2007 par jdsv]
sechanbask Posté(e) le 18 août 2007 Posté(e) le 18 août 2007 J'ai un peu de mal à comprendre ce que tu veux faire. Soit clair et parle français s'il te plait. ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
punky0147 Posté(e) le 19 août 2007 Posté(e) le 19 août 2007 je pense répondre à tes attentes avec le code suivant, certains trouveront peut-être ca un peu bourrin, c'est certainement optimisable, je l'ai fait vite fait : Sub ligne(x1, y1, X2, y2)Dim sel As AcadSelectionSetDim P1(0 To 2) As DoubleDim P2(0 To 2) As DoubleDim listpoint(0 To 9) As DoubleDim interpoints As VariantDim intcodes(0) As IntegerDim varvaleurs(0) As VariantDim ob As Object Correction_axe_x = 1 P1(0) = Log(x1) * Correction_axe_xP1(1) = Log(y1)P1(2) = 0P2(0) = Log(X2) * Correction_axe_xP2(1) = Log(y2)P2(2) = 0listpoint(0) = X_minlistpoint(1) = Y_minlistpoint(2) = X_minlistpoint(3) = Y_maxilistpoint(4) = X_maxilistpoint(5) = Y_maxilistpoint(6) = X_maxilistpoint(7) = Y_minlistpoint(8) = X_minlistpoint(9) = Y_min Set zone = ThisDrawing.ModelSpace.AddLightWeightPolyline(listpoint)Set point1 = ThisDrawing.ModelSpace.AddPoint(P1)Set point2 = ThisDrawing.ModelSpace.AddPoint(P2)point1.Updatepoint2.Updatezone.Update deja = 0For Each sel In ThisDrawing.SelectionSetsIf sel.Name = "test" Thendeja = 1End IfNext sel If deja = 0 ThenSet sel = ThisDrawing.SelectionSets.Add("test")End IfSet sel = ThisDrawing.SelectionSets("test")sel.Clear intcodes(0) = 0varvaleurs(0) = "POINT"P1(0) = X_minP1(1) = Y_maxiP1(2) = -1000P2(0) = X_maxiP2(1) = Y_minP2(2) = 1000 sel.Select acSelectionSetWindow, P1, P2, intcodes, varvaleursp1ok = 0p2ok = 0 For Each ob In selIf point1.Handle = ob.Handle Thenp1ok = 1End IfIf point2.Handle = ob.Handle Thenp2ok = 1End IfNext ob Set lineobj = ThisDrawing.ModelSpace.AddLine(point1.Coordinates, point2.Coordinates)interpoints = zone.IntersectWith(lineobj, acExtendNone) If UBound(interpoints) <> -1 ThenIf p1ok + p2ok = 0 Thenlineobj.DeleteP1(0) = interpoints(0)P1(1) = interpoints(1)P1(2) = interpoints(2)P2(0) = interpoints(3)P2(1) = interpoints(4)P2(2) = interpoints(5)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, P2)End IfIf p1ok = 0 And p2ok = 1 Thenlineobj.DeleteP1(0) = interpoints(0)P1(1) = interpoints(1)P1(2) = interpoints(2)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, point2.Coordinates)End IfIf p1ok = 1 And p2ok = 0 Thenlineobj.DeleteP1(0) = interpoints(0)P1(1) = interpoints(1)P1(2) = interpoints(2)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, point1.Coordinates)End Ifzone.Deletepoint1.Deletepoint2.Deletelineobj.UpdateElseIf p1ok + p2ok = 0 Thenzone.Deletepoint1.Deletepoint2.Deletelineobj.DeleteUpdateElsezone.Deletepoint1.Deletepoint2.Deletelineobj.UpdateEnd IfEnd If End Sub dis moi si ca marche et si c'est bien ca que tu voulais
jdsv Posté(e) le 20 août 2007 Auteur Posté(e) le 20 août 2007 bonjour, merci punky0147, j'ai testé ton programme, mais celui-ci plante à la ligne Set point1 = ThisDrawing.ModelSpace.AddPoint(P1) erreur de compilation : impossible d'affecter à un tableau pour sechanbaskVoici mon problème, je génère des lignes à l’aide du programme dont le tracer de lignes se fait par le listing présenter avant.Je voudrais que les segments tracer soit à l’intérieur d’une zone délimité par les bornes X_min, Y_mini, X_maxi et Y_maxi.Donc 3 cas se présentent :- le segment est à l’extérieur de la zone, on ne fait rien (on passe, au segment suivant)- le segment est dans la zone, on trace la totalité du segment- le segment est à cheval sur la limite de la zone, on ajuste le segment jusqu'à la limite de la zone. J’espère avoir été plus clairmerci de votre aide
punky0147 Posté(e) le 20 août 2007 Posté(e) le 20 août 2007 chez moi pas de plantage. tu aurais pas une variable globale de déclarée qui s'appellerait point1 ? (un tableau...) je dis peut-être une bétise, mais je vois pas d'ou ca peut venir ce message d'erreur sinon.... j'sais pas trop, essaye de voir de ton coté, au pire, essaye en rennomant ma variable point1 par un autre nom... tiens moi au courant
jdsv Posté(e) le 20 août 2007 Auteur Posté(e) le 20 août 2007 bonjour punky0147j'ai lancé le programme dans un autre fichier et cela ne plante pas.je pense que je ne suis plus trés loin de la solution car les lignes sont bien testées, mais elle ne sont pas tracées.Peut tu commenter le listing que tu m'as envoyé SVP Merci
punky0147 Posté(e) le 20 août 2007 Posté(e) le 20 août 2007 je comprends pas trop pourquoi ca ne marche pas chez toi, moi pour le peux que j'ai testé (4 cas possibles), j'ai pas une erreur, et les lignes sont tracées quand il le faut, ajustées quand il le faut. Je commente un peu le code alors : Sub ligne(x1, y1, X2, y2)Dim sel As AcadSelectionSetDim P1(0 To 2) As DoubleDim P2(0 To 2) As DoubleDim listpoint(0 To 9) As DoubleDim interpoints As VariantDim intcodes(0) As IntegerDim varvaleurs(0) As VariantDim ob As Object Correction_axe_x = 1 'la je met juste la valeur à un, c'était pour moi, pour le tester P1(0) = Log(x1) * Correction_axe_xP1(1) = Log(y1)P1(2) = 0P2(0) = Log(X2) * Correction_axe_xP2(1) = Log(y2)P2(2) = 0 'Toutes les coordonnées vont servir à tracer une polyligne dénissant les limites du tracélistpoint(0) = X_minlistpoint(1) = Y_minlistpoint(2) = X_minlistpoint(3) = Y_maxilistpoint(4) = X_maxilistpoint(5) = Y_maxilistpoint(6) = X_maxilistpoint(7) = Y_minlistpoint(8) = X_minlistpoint(9) = Y_min 'on créé trois éléments :'zone, qui est une polyligne représentant les limites du tracé'point1, qui est le point de départ de ta ligne (qui sera testé par la suite)'point2, qui est le point de terminaison de ta ligne (qui sera testé par la suite) Set zone = ThisDrawing.ModelSpace.AddLightWeightPolyline(listpoint)Set point1 = ThisDrawing.ModelSpace.AddPoint(P1)Set point2 = ThisDrawing.ModelSpace.AddPoint(P2)point1.Updatepoint2.Updatezone.Update 'On vérifie si la sélection "test" existait déjà ou nondeja = 0For Each sel In ThisDrawing.SelectionSetsIf sel.Name = "test" Thendeja = 1End IfNext sel 'Si la sélection "test" n'existait pas, on la crééeIf deja = 0 ThenSet sel = ThisDrawing.SelectionSets.Add("test")End IfSet sel = ThisDrawing.SelectionSets("test") 'On efface la sélection (des fois qu'elles existaient avant)sel.Clear 'On va a présent sélectionner les objets de type "POINT" à l'intérieur des limites donnée par'X_min, Y_min, ... (je met -1000 et 1000 en axe z, puisqu'il faut définir un espace de sélection à 3 dimensions) intcodes(0) = 0varvaleurs(0) = "POINT"P1(0) = X_minP1(1) = Y_maxiP1(2) = -1000P2(0) = X_maxiP2(1) = Y_minP2(2) = 1000 sel.Select acSelectionSetWindow, P1, P2, intcodes, varvaleurs 'La sélection est à présent créée, on vérifie si les points créés (point1 et point2) sont dans cette'sélection (et donc dans la zone limite de tracage). si point1 est dedant, alors p1ok sera égal à 1'idem pour point2 (j'utilise le handle des objets pour vérifier si ce sont bien les mêmes) p1ok = 0p2ok = 0 For Each ob In selIf point1.Handle = ob.Handle Thenp1ok = 1End IfIf point2.Handle = ob.Handle Thenp2ok = 1End IfNext ob 'ensuite, selon le cas, on a besoin de connaitre les coordonnées des intersections entre la zone 'délimitées et la ligne que tu veux tracer 'On trace donc la ligne dans un premier tempsSet lineobj = ThisDrawing.ModelSpace.AddLine(point1.Coordinates, point2.Coordinates) 'On récupère les coordonnées des intersections (si il y en a)interpoints = zone.IntersectWith(lineobj, acExtendNone) If UBound(interpoints) <> -1 Then 'si des intersections ont été trouvéesIf p1ok + p2ok = 0 Then 'si les deux points que tu as donné sont en dehors de la zonelineobj.Delete 'on efface la ligne tracé précédemment et on en retrace une entreP1(0) = interpoints(0) 'les deux points d'intersectionsP1(1) = interpoints(1)P1(2) = interpoints(2)P2(0) = interpoints(3)P2(1) = interpoints(4)P2(2) = interpoints(5)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, P2)End IfIf p1ok = 0 And p2ok = 1 Then 'si uniquement le point2 est dans la zonelineobj.Delete 'on efface la ligne tracée précédemment et on en retrace uneP1(0) = interpoints(0) 'entre l'intersection trouvée et point2P1(1) = interpoints(1)P1(2) = interpoints(2)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, point2.Coordinates)End IfIf p1ok = 1 And p2ok = 0 Then 'si uniquement le point1 est dans la zonelineobj.Delete 'on efface la ligne tracée précédemment et on en retrace uneP1(0) = interpoints(0) 'entre l'intersection trouvée et point1P1(1) = interpoints(1)P1(2) = interpoints(2)Set lineobj = ThisDrawing.ModelSpace.AddLine(P1, point1.Coordinates)End Ifzone.Delete 'on efface la zone tracéepoint1.Delete 'on efface le premier point dessinépoint2.Delete 'on efface le deuxième point dessinélineobj.UpdateElse '(si aucune intersection n'a été trouvée)If p1ok + p2ok = 0 Then 'si les deux points étaient en dehors de la zone, on efface toutzone.Delete 'ce qu'on avait dessiné et on ne trace rienpoint1.Deletepoint2.Deletelineobj.DeleteUpdateElse 'si les deux points étaient dans la zone, on efface la zone, leszone.Delete 'deux points, mais on conserve la ligne qui avait été tracéepoint1.Deletepoint2.Deletelineobj.UpdateEnd IfEnd If End Sub bon, j'suis pas très doué pour les commentaires sur les codes, j'espère que t'as saisi un peu la méthode que j'ai utilisée, je ne vois vraiment pas pk ca marche pas chez toi.... bref, redis moi si j'ai fait une bonne gaffe au milieu... c'est toujours bon à savoir
jdsv Posté(e) le 21 août 2007 Auteur Posté(e) le 21 août 2007 Bonjour punky0147Ca y es, cela fonctionne, mea culpa c'etait de ma faute, a force de modifier re-modifier et de re-re-modifier, les déclarations de variables ne suivent pas.j'ai donc adapté ton ptogramme à mes besoins (cela fonctionnent, mais il faut 20 min pour générer l'abaque) donc grace à tes commentaires je vais comprendre et tenter d'optimiser le code. (pas tout de suite, car c'est la rentrée). merci beaucoup de ton aide dés que j'aurais optimisé (si je le peut) je te ferais parvenir le codemerci encore et a+jdsv
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant