Aller au contenu

[Résolu] Dessiner des lignes avec "recouvrement"


DenisHen

Messages recommandés

Bonjour à la communauté.
Je cherche à dessiner une suite de lignes parallèles avec une distance de "recouvrement" (exemple 40cm) uniquement si la longueur totale est supérieure à 600cm, comme sur ce schéma :
image.thumb.png.efda028eedb5bf49d88e29f8b7ab7a60.png
Mais je ne vois pas comment faire. L'écart entre les lignes sera d'environ 5cm et les longueurs des lignes seront de 600cm, sachant que la dernière sera plus courte.
Je pense à un (while.
Petite précision, je ne sais pas utiliser (lambda et (mapcar...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Plusieurs questions :
C'est une ligne ou polyligne ?
Pas de courbes ?
Toujours à l'horizontale ?

Je verrais quelque chose comme cela en sachant que ton point 0 est à gauche :
1)a) Pour chaque ligne 
b) Je récupère les coordonnées des extrémités en vérifiant le sens de la ligne par rapport à mon point 0 (donc une liste rangée par ordre croissant sur l'axe des X) et j'applique un plus 40 sur l'axe des X pour l'extrémité de gauche (premier point) et un moins 40 sur l'axe des X pour l'extrémité de droite (deuxième point)
Accessoirement je peux appliquer l'écart entre les lignes sur l'axe des Y, comme ça c'est fait
2) Toutes ces coordonnées sont dans une liste rangée par ordre croissant (axe des X)
3) Je supprime ou ne tiens pas compte du premier point, et je créé ma ligne avec le point 2 et le point 3, puis le point 4 avec le point 5 ...

Autre version :
1) Pour chaque ligne je récupère les coordonnées des extrémités
2) Toutes ces coordonnées sont dans une liste rangée par ordre croissant (axe des X)
3) J'applique un MAPCAR sur l'axe des X (une fois sur deux je rajoute 40, et donc une fois sur deux je diminue de 40) et des Y (tous concernés)
4) Je supprime ou ne tiens pas compte du premier point, et je créé ma ligne avec le point 2 et le point 3, puis le point 4 avec le point 5 ...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour JPhil, et merci de ton aide.
Pour répondre à tes question :
 - ce sont des LWPOLYLINE,
 - pas de courbes,
 - ça peut être dans toutes les direction.
Je vais tenté de suivre ta proposition, mais je ne sais pas trop où attaquer.
Encore merci à toi.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Pour préciser, j'ai commencé la saisie des point, la longueur est de PtA à PtB (LongTot).
Voici un schéma plus détaillé ;
image.thumb.png.011c87539cc3670028975552b284782e.png
Et j'ai écris ça pour débuter :
 

(setq   PtA        (getpoint "\nDébut du filant (PtA) : ")
        PtB        (getpoint PtA "\nFin du filant (PtB) : ")
        PtC        (getpoint PtA "\nPoint opposé (PtC): ")
        LongTot    (distance PtA PtB)
        LargTot    (distance PtA PtC)
  )

 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Coucou,
La vrai question qu'il faut se poser, c'est quelles sont les données d'entrées ! Donc sur ton exemple, qu'est-ce qui est une donnée d'entrée et qu'est-ce qui est un résultat ?
Car pour moi la donnée d'entrée c'est la longueur totale et le reste c'est le résultat, mais d'après le post de JPhil, il semblerait que se ne soit pas le cas...

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Luna , je crois que nos postes se sont croisés 😄

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

En effet ^.^

Alors du coup j'ai quelques questions :
  • Comment détermines-tu le nombre de barres ?
  • Comment détermines-tu la longueur des barres ? Est-elle identique pour chacune d'entre-elles ou bien sont-elles différentes ?
  • Comment détermines-tu l'écart entre les barres et tes points PtA et PtC ?
  • Comment détermines-tu la longueur de recouvrement ?

Bisous,
Luna

 

Lien vers le commentaire
Partager sur d’autres sites

@JPhil:
   Désolé pour ce mal entendu.

@Luna :
 - le nombre de barre est déterminé par la longueur total (LongTot),
 - la longueur des barres sera toujours de 600cm, sauf la dernière qui sera plus courte,
 - l'écart entre les barres sera d'un tiers de la distance PtA PtC,
 - la longueur de recouvrement dépendra d'une autre variable, que j'ai ailleurs, mais on peut partir sur 40cm.
Denis.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Coucou la communauté, c'est encore moi.
J'ai écris ce bout de code, mais je n'arrive à rien...
Sachant que la variable Recouvre est égale à 40cm, pour cet exemple.
 

(cond ((<= LongTot 600)
       (setq PtA1 (polar PtA (angle PtA PtC) (/ (distance PtA PtC) 2))
             PtB1 (polar PtA1 (angle PtA PtB) (distance PtA PtB))
       ) ;_ Fin de setq
       (command-s "_pline" PtA1 PtB1 "")
      )
      ((> LongTot 600)
       (setq Cote "G")
       (setq PtA1 (polar PtA (angle PtA PtC) (/ (distance PtA PtC) 3)))
       (setq PtB1 (polar PtA1 (angle PtA PtB) 600))
       (setq LontTot (- LongTot 600))
       (command-s "_pline" PtA1 PtB1 "")
       (setq LongTot (- Longtot 600))
       (while (>= LongTot 600)
         (if (= Cote "G")
           (setq Ang (angle PtA PtC))
           (setq Ang (angle PtC PtA))
         ) ;_ Fin de if
         (setq PtA1t   (polar PtA1 Ang (/ (distance PtA PtC) 3))
               PtA1a   (polar PtA1t (angle PtB PtA) Recouvre)
               PtB1    (polar PtA1 (angle PtA PtB) 600)
               LontTot (- LongTot 600)
         ) ;_ Fin de setq
         (command-s "_pline" PtA1a PtB1 "")
         (if (= Cote "G")
           (= Cote "D")
           (= Cote "G")
         ) ;_ Fin de if
       ) ;_ Fin de while
      )
      (if
       (>= LontTot 0)
       (progn (if (= Cote "G")
                (= Cote "D")
                (= Cote "G")
              ) ;_ Fin de if
              (setq PtA1t   (polar PtA1 Ang (/ (distance PtA PtC) 3))
                    PtA1a   (polar PtA1t (angle PtB PtA) Recouvre)
                    PtB1    (polar PtA1 (angle PtA PtB) 600)
                    LontTot (- LongTot 600)
              ) ;_ Fin de setq
              (command-s "_pline" PtA1a PtB1 "")
       ) ;_ Fin de progn
      )
)

Désolé pour le coté "débutant", mais je fais avec mon humble cerveau. 😊
Mais je sais que je me fourvoie dans les détails du diable, comme disait Nietzche...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Si j'ai bien compris en prenant la ligne du bas :
Longueur premier trait : 600
Longueur premier vide : 520 (600 - 2*40)
Longueur deuxième trait : 600
Longueur deuxième vide : 520 (600 - 2*40)
...

En prenant la ligne du haut :
Longueur premier vide : 560 (600 - 1*40)
Longueur premier trait : 600
Longueur deuxième vide : 520 (600 - 2*40)
Longueur deuxième trait : 600
...

J'ai bon ?

Lien vers le commentaire
Partager sur d’autres sites

Hiya !
Je peux te proposer un truc dans le genre :

(defun polymake (plist)
  (entmakex
    (append
      (list
        '(0 . "LWPOLYLINE")
        '(100 . "AcDbEntity")
        '(100 . "AcDbPolyline")
        (cons 90 (length plist))
      )
      (mapcar '(lambda (p) (cons 10 p)) plist)
    )
  )
)

(defun foo (PtA PtB Ep Blg rcv d / f l a b e)
  (defun f (d)
    (cond
      ( (= d (/ 1 3.0)) (/ 2 3.0))
      ( (= d 0.5) d)
      ((/ 1 3.0))
    )
  )
  (setq
    l (distance PtA PtB)
    a (angle PtA PtB)
    b (+ a (* pi 0.5))
  )
  (if (<= l Blg)
    (progn
      (setq e (* Ep (cond (d (f d)) (0.5))))
      (polymake
        (list
          (polar PtA b e)
          (polar PtB b e)
        )
      )
    )
    (progn
      (setq e (* Ep (f d)))
      (polymake
        (list
          (polar PtA b e)
          (polar (setq PtA (polar PtA a Blg)) b e)
        )
      )
      (foo
        (polar PtA (+ a pi) rcv)
        PtB
        Ep
        Blg
        rcv
        (f d)
      )
    )
  )
)

Si tu essayes avec cette ligne, obtiens-tu ce que tu souhaites ?

(foo (setq PtA (getpoint "\nPtA :")) (getpoint PtA "\nPtB :") (getdist PtA "\nPtC :") 600 40 nil)

Attention si tu modifies le nom de la fonction, elle est récursive donc il faut le modifier également dans sa définition !
J'ai préféré utiliser Ep pour l'Epaisseur à la place de PtC car rien ne permet de vérifier que PtC est bien perpendiculaire à [PtA PtB] 🙂
Ensuite Blg correspond à la longueur max de tes aciers (donc pour toi c'est 600 mais j'ai préféré l'intégré en variable), rcv correspond à la longueur de recouvrement (donc pour toi c'est 40 mais encore une fois, c'est mieux sous forme de variable) et enfin d tu ne t'en occupe pas, c'est toujours nil (c'est ce qui me permet de faire varier les niveaux via la récursivité).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Coucou JPhil, et je m'excuse encore, j'ai toujours eu du mal pour m'exprimer...
Toutes les polylignes sont égale à 600cm, sauf la dernière qui serait plus courte, ou égale à 600cm...
C'est juste une question de chevauchement de 40cm avec, admettons un recouvrement de 40cm...
J'ai refais un petit schéma, qui parle toujours plus qu'un long discours...
image.jpeg.5ba9eb045a00ab17dbde8579625e9a52.jpeg

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Luna, mais tu es une vilaine en fait ! ! !
Ton code fonctionne super bien, et il est impressionnant par sa "simplicité", mais je ne le comprends pas beaucoup (je suis encore un débutant).
De ce fait, tu me donnes du travail en plus (le coté vilaine), et pour cela, je t'en remercie, je vais peut-être progresser en Lisp grâce à toi...
C'est exactement ce que je cherchais à faire.
Maintenant, je vais devoir digérer ton code pour l'adapter à mes besoins...
Par contre, effectivement, je n'ai pas compris le "d"...
Et les (mapcar et (lambda... Je vais devoir chercher où sont créées les lignes, car j'ai des xdata à leur attribuer
Et oui, la récursivité est mon ennemi, contrairement à d'autre, comme Bruno ou Maître (gile)... Coucou à eux...
Encore un million de mercis à toi...
Bisous de loin.
Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Sumimasen >n<
Promis je serais sage la prochaine fois (c'est juste que cette fois j'ai pas pu résister à l'envie de plancher sur ton soucis)... :3

Le programme semble simple mais de part la récursivité, il est assez complexe à comprendre. Même moi j'ai beaucoup de difficultés sur ce genre de fonctions (et c'est donc pour chat que je me force à l'utiliser lorsque c'est possible pour mieux me familiariser avec)...
L'argument 'd est justement ce qui m'a posé le plus de problème malheureusement ! En gros j'avais besoin d'un moyen de faire comprendre au programme sur quel niveau il devait dessiner la polyligne or à cause de la récursivité c'était délicat d'avoir ce principe de "switch" car si la barre est suffisamment longue (donc pas d'utilisation de la récursivité), la barre est à 1/2 de la hauteur, mais si la barre n'est pas assez longue alors elle doit varier entre 1/3 et 2/3 de la hauteur. C'est pour cela que d = nil lors de l'utilisation telle quelle (pour signifier que l'on a pas eut de récursivité auparavant) puis en passant dans la récursivité, elle vaut 1/3 ou 2/3 et permet de multiplier la hauteur.

Pour le reste il faut juste imaginer que le segment [PtA PtB] est un rail et le programme se balade pour dessiner une première ligne, puis fait marche-arrière (pour le recouvrement), re-dessine une autre ligne, etc...

Bon courage pour le digérer en tout cas !

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Luna, je ne comprends pas du tout ton code...
Je ne pense pas réussir à l'adapter à mes besoin...
C'est dommage, car il fait exactement ce que je cherchais à faire, mais il faudrait que je l'adapte à mes besoin, et je n'y arrive pas...
En tous cas, un très grand merci à toi...
Mais je ne perd pas espoir... Je suis en plein (mapcar et (lambda;,mais j'ai mal à la tête...
Encore merci à toi...
Bisous de loin...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Oui, c'est exactement ça, je ne suis pas @VDH-Bruno ni Maître @(gile), la récursivité vient d'un autre monde pour moi...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Merci @Luna pour ton aide extraordinaire.
Un très grand merci et de très gros bisous de loin...
En fait, à chaque ligne créées, je lui attribut des Xdata pour un métré ultérieure :
Je partagerais ma suite de programmes (VBA, Lisp, palette...) quand tout sera bien fait.
Mais j'aimerais attribuer quelques XData après la création de chaque LWPOLILINE, genre

(vlax-ldata-put (entlast "MetreHAHo" MetreHAHo)

C'est pour cela que ton code me pose problème, il est beaucoup trop évolué pour moi.
Mais je continu à le dire, un énorme merci à toi.
Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Ohhh oki doki je comprend parfaitement 🙂

Et bien j'avais un peu prévu le coup avec (polymake) étant donné que j'ai utilisé (entmakex) et non (entmake), donc (polymake) renvoie le nom d'entité de la polyligne nouvellement crée 😉
De plus j'ai épuré au max la fonction (polymake) mais si jamais tu veux ajouter des propriétés DXF en plus lors de la création de la polyligne, tu peux ! Par exemple définir un calque, une couleur forcée, un type de ligne, etc... (utilise l'Aide d'AutoCAD concernant les "LWPOLYLINE (DXF)")

Donc si tu le souhaites, tu peux modifier directement la fonction (polymake) comme suit par exemple :

(defun polymake (plist / ent)
  (setq ent
    (entmakex
      (append
        (list
          '(0 . "LWPOLYLINE")
          '(100 . "AcDbEntity")
          '(100 . "AcDbPolyline")
          (cons 90 (length plist))
        )
        (mapcar '(lambda (p) (cons 10 p)) plist)
      )
    )
  )
  (vlax-ldata-put ent "MetreHaHo" MetreHaHo)
)

Et comme chat pas besoin de modifier la fonction (foo) si jamais c'est trop complexe, après si jamais tu as besoin de faire d'autres choses, il suffit de les ajouter juste après les (polymake), tu as des (progn) donc tu peux rajouter autant d'actions que tu souhaites (il faut juste pas modifier les variables utilisée par la fonction (foo)) 😉

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Luna, je voulais juste ajouter des "(vlax-ldata à toutes les polylignes créées...
Mais ton code me donne beaucoup de réflexion...
Je ne sais pas si je vais m'en sortir, mais tu me donnes une foule de perspectives...
Et j'ai encore beaucoup de mal avec (lambda et (mapcar... Je sais, c'est cruel en lisp, voir un gros default, mais c'est comme ça.... 😒 Mon cerveau n'y arrive pas...
En tous cas, mille mercis à toi...
On pensait CadXP perdu par manque de nouveaux arrivant (les anciens se fatiguent, sauf certain, dont je cacherais le nom)... Tu représentes un nouvel espoir... Et j'espère te seconder, pour des trucs simples, évidement.
Tu représentes le nouvel espoir, pour la section Lisp de CadXP et aussi pour le site...
Et c'est un plaisir partagé par beaucoup d'autres anciens, qui se manifesteront, je l'espère, pour te soutenir...
You are the new wave ! ! ! And it's so good...
Bisous de loin...
Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Oui, la nouvelle vague ! ! !
Je garde un bon souvenir de toi, Monsieur lecrabe...
Tu m'avais fait une formation avec plein d'échange, à Troyes...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Si cela peut aider j'avais fait un bloc pour le recouvrement des TS (répartition d'ou les 240), à adapter pour le sens porteur (600). (voir Wbloc en PJ)

Cela peut éviter de passer par un Lisp, ou mieux utiliser le Lisp et le commander en Lisp (gestion de la longueur et de la visibilité selon le recouvrement, ..)

TS rec1&2.dwg

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité