Aller au contenu

Lisp pour décalage de bordure


DessProj429

Messages recommandés

Bonjour tout le monde.

J'aimerais essayer d'automatiser une routine que je répète souvent, le tracé des bordures en plan avec leur largeur réelle afin d'obtenir une polyligne fermée.

Aujourd'hui j'effectue ces opérations pour arriver à mes fins : je trace une polyligne sur le fil d'eau, je la décale de la largeur de ma bordure, j'ajoute un sommet sur l'une des deux pour fermer un côté, je fais joindre puis dans les propriétés je finis par fermer la polyligne. Un peu rébarbatif quand on a des linéaires importants et des types différents de bordures.

Je n'y connais absolument rien aux LISP mais j'imagine que c'est un petit peu comme les macros sur excel donc je me dis qu'une partie voire toute ma procédure peut être automatisée.

Je pensais pouvoir automatiser la partie "joindre + fermer", qu'en pensez-vous et surtout pouvez vous m'aider sur un éventuel LISP ?

Merci beaucoup  !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DessProj429

Je pense que c'est possible, mais je ne comprends pas le coup d'ajouter des sommets.
Vous pourriez nous déposer un DWG avec des exemples Avant/Après ?

Avec le pseudo, on sait ce que vous faites !
Dans ce métier, la connaissance du LSP AutoCAD est un plus, regardez ma signature et venez apprendre.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir @DessProj429,

 

Voilà un bout de code qui devrait faire l'affaire. J'ai mis des commentaires pour clarifier ce que fait chaque ligne du lisp

(vl-load-com)
(defun C:Bordure ( / oPoly1 oPoly2 lsPts1 lsPts2 oLine AddLine GetListVtx)
  
  ; fonction de création d'une ligne
  (defun AddLine (pt1 pt2)
      (entmake (list (cons 0 "LINE")
		     (cons 10 pt1)
		     (cons 11 pt2)
		)
      )
  )

  ; fonction d'extraction des sommets d'un polyligne
  (defun GetListVtx (oPoly / p)
    (repeat (setq p (1+ (fix (setq p (vlax-curve-getEndParam oPoly)))))
      (setq l (cons (vlax-curve-getPointAtParam oPoly (setq p (1- p))) l))
    )
  )

  	   ; Sélection de la 1ère polyligne
  (if (and (setq oPoly1 (car (entsel "\n1ère polyligne : ")))
	   ; vérifie que c'est une polyligne
	   (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly1))))
	   ; vérifie qu'elle n'est pas close
	   (/= 1 (logand (cdr (assoc 70 (entget oPoly1))) 1))
	   ;Sélection de la 2nde polyligne
	   (setq oPoly2 (car (entsel "\n2ème polyligne : ")))
	   ; vérifie que c'est une polyligne
	   (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly2))))
	   ; vérifie qu'elle n'est pas close
	   (/= 1 (logand (cdr (assoc 70 (entget oPoly2))) 1))
	   ; extrait la liste des sommets de la poly 1
	   (setq lsPts1 (GetListVtx oPoly1))
	   ; extrait la liste des sommets de la poly 2
	   (setq lsPts2 (GetListVtx oPoly2))
	   ; construit la ligne passant par le 1er sommet de chaque polyligne
	   (addLine (car lsPts1) (car lsPts2))
      )
    (progn
      ; récupère la ligne crée
      (setq oLine (entlast))
      ; assemble les 2 polylignes, plus la ligne et clos la polyligne résultante
      (command "_PEDIT" oPoly1 "_J" oPoly2 oLine "" "_C" "")
    )
  )
)

 

Olivier

  • Like 1
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Le 06/09/2024 à 17:09, didier a dit :

Bonjour @DessProj429

Je pense que c'est possible, mais je ne comprends pas le coup d'ajouter des sommets.
Vous pourriez nous déposer un DWG avec des exemples Avant/Après ?

Avec le pseudo, on sait ce que vous faites !
Dans ce métier, la connaissance du LSP AutoCAD est un plus, regardez ma signature et venez apprendre.

Amicalement

Bonjour,

Merci pour votre réponse. Je vais aller m'instruire sur votre site car en effet, je pense que beaucoup de choses pourraient m'être utiles !

Pour en revenir à ma demande, c'est vrai qu'après un week-end, en relisant mon post de vendredi, je comprends votre incompréhension. Quand je parlais d'ajouter un sommet, j'aurais dû préciser que j'ajoute ce sommet au bout d'une des deux polylignes afin de rejoindre l'autre avant de les joindre pour en obtenir une seule. Il me reste plus qu'à la fermer via l'option dans les propriétés.

Si ce n'est toujours pas clair, imaginez simplement tracer une polyligne, la décaler puis vouloir faire de ces deux polylignes, une seule polyligne fermée.

J'espère être assez clair, j'ai fais un petit DWG avec ma démarche.

Dessin bordures.dwg

Lien vers le commentaire
Partager sur d’autres sites

Le 06/09/2024 à 21:42, Olivier Eckmann a dit :

Bonsoir @DessProj429,

 

Voilà un bout de code qui devrait faire l'affaire. J'ai mis des commentaires pour clarifier ce que fait chaque ligne du lisp

(vl-load-com)
(defun C:Bordure ( / oPoly1 oPoly2 lsPts1 lsPts2 oLine AddLine GetListVtx)
  
  ; fonction de création d'une ligne
  (defun AddLine (pt1 pt2)
      (entmake (list (cons 0 "LINE")
		     (cons 10 pt1)
		     (cons 11 pt2)
		)
      )
  )

  ; fonction d'extraction des sommets d'un polyligne
  (defun GetListVtx (oPoly / p)
    (repeat (setq p (1+ (fix (setq p (vlax-curve-getEndParam oPoly)))))
      (setq l (cons (vlax-curve-getPointAtParam oPoly (setq p (1- p))) l))
    )
  )

  	   ; Sélection de la 1ère polyligne
  (if (and (setq oPoly1 (car (entsel "\n1ère polyligne : ")))
	   ; vérifie que c'est une polyligne
	   (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly1))))
	   ; vérifie qu'elle n'est pas close
	   (/= 1 (logand (cdr (assoc 70 (entget oPoly1))) 1))
	   ;Sélection de la 2nde polyligne
	   (setq oPoly2 (car (entsel "\n2ème polyligne : ")))
	   ; vérifie que c'est une polyligne
	   (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly2))))
	   ; vérifie qu'elle n'est pas close
	   (/= 1 (logand (cdr (assoc 70 (entget oPoly2))) 1))
	   ; extrait la liste des sommets de la poly 1
	   (setq lsPts1 (GetListVtx oPoly1))
	   ; extrait la liste des sommets de la poly 2
	   (setq lsPts2 (GetListVtx oPoly2))
	   ; construit la ligne passant par le 1er sommet de chaque polyligne
	   (addLine (car lsPts1) (car lsPts2))
      )
    (progn
      ; récupère la ligne crée
      (setq oLine (entlast))
      ; assemble les 2 polylignes, plus la ligne et clos la polyligne résultante
      (command "_PEDIT" oPoly1 "_J" oPoly2 oLine "" "_C" "")
    )
  )
)

 

Olivier

Bonjour, 

Merci pour cette réponse, je vais essayer ça, en espérant y arriver, je pars de 0 sur les LISP et ne sais pas trop ce que je dois faire mais je vais m'en débrouiller.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DessProj429

je pars de 0 sur les LISP

Pardon, mais je dois vous mettre en garde que pour apprendre, il ne faut pas commencer par trop compliqué
Quand vous apprenez le vélo, vous n'attaquez pas par un col dans les Alpes.

Lien vers le commentaire
Partager sur d’autres sites

il y a 10 minutes, didier a dit :

Bonjour @DessProj429

je pars de 0 sur les LISP

Pardon, mais je dois vous mettre en garde que pour apprendre, il ne faut pas commencer par trop compliqué
Quand vous apprenez le vélo, vous n'attaquez pas par un col dans les Alpes.

Pardon aussi mais je n'ai jamais eu la prétention de commencer par trop compliqué.

Je suis juste curieux et soucieux de faire évoluer ma méthode afin de gagner en confort de travail. Je me retrouve devant un problème que je pense pouvoir résoudre avec l'aide de ce forum et des LISP. J'ai aussi l'envie d'en savoir plus sur ces fameux LISP pour pouvoir me débrouiller seul une fois les bases acquises.

Il me semblait donc en toute modestie que je pourrais "simplement prendre" un LISP créé par quelqu'un qui maîtrise ce sujet comme vous ou Olivier qui m'a proposé quelque chose, et le copier coller dans le dossier qu'il faut pour que cela fonctionne. 

Peut-être que je me trompe là dessus...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DessProj429,

 

Sans lisp, on peut faire plus simple avec ce genre de macro associé à un bouton (à lancer juste après le décalage, car utilise la dernière valeur de décalage pour joindre les 2 polylignes)

^C^C_PEDIT;_M;\\;_J;_J;_D;(getvar "OFFSETDIST");;

Mais il n'y a pas de contrôle.

 

Ensuite la question est 0 en lisp, OK, mais avant de parler programmation, est-ce qu'à partir d'un code fourni en texte, vous savez en créer un fichier LSP, le charger dans AutoCAD et lancer la commande?

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Coucou @DessProj429,
En complément des réponses de Didier et Olivier, je te suggère dans un premier temps de consulter ce post (>>ici<<) concernant le chargement d'un fichier .lsp dans AutoCAD. Car, comme le souligne si bien Olivier, avant même de parler de programmation il faut savoir comment implémenter ces programmes LISP dans AutoCAD et pouvoir les utiliser.

Une fois ces différentes solutions maîtrisées (chargement ponctuel, chargement automatique, utilisation de fichiers LISP définis par AutoCAD ou des fichiers personnels, etc..), on peut alors s'attaquer aux bases de la programmation. Pour cela, de nombreux sites très bien fait peuvent t'aider à explorer le monde de la programmation AutoLISP :

Maintenant si l'on rentre un peu plus dans le vif du sujet, il n'existe jamais une seule et unique solution de programmation pour un problème bien défini. Avant même de parler d'AutoLISP (qui est un langage permettant d'écrire des programmes complexes), on peut déjà considérer des solutions beaucoup plus adaptées lorsqu'on débute en programmation AutoCAD, au même titre que les macros Excel.

Pour cela, rien de bien compliqué puisqu'il suffit de réaliser la manipulation manuellement et de noter l'ensemble des commandes, options, données utilisateurs nécessaires à la suite d'instructions. Dans ton cas, il suffit de comprendre ton besoin :

  1. Tracer une polyligne
  2. Décaler la dernière polyligne crée d'une valeur rentrée par l'utilisateur
  3. Ajouter un sommet depuis le dernier sommet de la polyligne n°1 vers le dernier sommet de la polyligne n°2
  4. Joindre les 2 polylignes
  5. Clore la polyligne

L'ensemble de ces manipulations font appel à des commandes et des entrées utilisateur, donc cela peut être traduit par une suite d'instruction qui fait appel aux commandes. On appelle cela des macros, comme par exemple la macro donnée par Olivier qui répond aux points 3 et 4 (si je ne dis pas de bêtises).
Évidemment, plus on progresse en programmation et plus on va chercher à optimiser notre programme pour améliorer sa performance, étendre son principe de fonctionnement, gestion des erreurs, etc...

C'est d'ailleurs pour cela qu'il faut prendre les problèmes comme un ensemble de sous-problèmes, plus simple à traiter individuellement puis de les mettre bout à bout. Viendra ensuite l'optimisation de la programmation (par exemple, commencer par écrire une macro qui n'est rien d'autre que la suite d'instructions que tu effectues manuellement, puis ensuite d'essayer de traduire cela en AutoLISP simple, avec des (command) et ensuite on pourra encore améliorer avec des (entget), (entmake), ...), mais chaque choses en son temps.

Si je comprends ta démarche d'utilisateur, tu désires apprendre/comprendre le code que tu comptes utiliser et donc pour cela, il ne faut pas partir d'une programmation complexe dès le début. Je pense donc en effet que la meilleure démarche pour ce genre de demande est de commencer par écrire la suite d'instructions que tu fais en ligne de commande, voir quelles options peuvent être directement renseignées (par exemple par le biais de variables système ou des constantes) et lesquelles requiert une intervention utilisateur. Cela permettra donc de connaître et d'identifier rapidement l'ensemble des informations requises pour faire fonctionner le programme et parmi ces informations, lesquelles sont déjà accessibles et lesquelles ne le sont pas. Ensuite lorsque tu voudras optimiser le programme tu verras que tu pourras supprimer certaines interventions utilisateur.

Bref, donc pour la partie "joindre" 2 polylignes, tu as déjà la macro proposée par Olivier mais si on s'amuse à la décrypter on a :

^C^C

correspond à un double Echap (permet de s'assurer qu'aucun programme n'est en cours d'utilisation à l'exécution de notre macro), cf. https://help.autodesk.com/view/OARXMAC/2024/FRA/?guid=GUID-D991386C-FBAA-4094-9FCB-AADD98ACD3EF

_PEDIT;

Lancement de la commande PEDIT en langue internationale grâce au caractère "_" (la commande _PEDIT est ici nommée PEDIT aussi bien international qu'en FR, mais par exemple la commande COPIER en FR est _COPY en international). Cela est une "convention" en programmation afin de s'assurer que quelque soit la langue locale de l'AutoCAD utilisant notre programme, le résultat soit identique (pas d'erreur car la commander COPIER par exemple n'est pas reconnue sur un AutoCAD anglophone).
Le caractère ";" est équivalent à une validation (ENTER).

_M;

correspond à l'option _Multiple de la commande _PEDIT, afin de sélectionner plusieurs entités, cf. https://help.autodesk.com/view/ACD/2024/ENU/?guid=GUID-0C422AA9-23DD-4650-AD66-68E9D7989E3F

\\;

correspond à une pause, indiquant ici que l'utilisateur doit répondre à la question de la commande (en l'occurrence ici il s'agit de la sélection des 2 polylignes que l'on souhaite joindre). Je tiens tout de même signaler que cela peut poser un problème syntaxique, car comme le souligne Olivier, il n'y a pas de contrôle. Par exemple l'option _Multiple peut poser une question supplémentaire si certains objets sélectionnés ne sont pas des polylignes (en effet, _PEDIT va alors demander si Oui ou Non on désire convertir les objets en polylignes, à condition évidemment que la variable PEDITACCEPT est à 0).

_J;

correspond à l'option _Join de la commande _PEDIT.

...

Bref tu vois le principe. En conclusion, décortiquer un problème en sous-problèmes simples ; commencer par des instructions basiques et compréhensibles ; améliorer au fur et à mesure que tu maîtrises les bases.
Si tu as des questions, n'hésite pas ! Comme tu peux le voir tu trouveras toujours des personnes qui accepteront de t'aider, sous réserve que la demande est claire, concise et que tu précises le type d'aide que tu souhaites (pistes de recherche, solution toute faite et "parfaite", documentation, etc...).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci à vous @Luna et @Olivier Eckmann pour vos réponses.

Pour répondre à Olivier, en effet 0 en lisp au point de ne savoir rien faire du tout qui concerne tout ça. Donc pas de création de lisp à partir d'un code, ni d'intégration dans Autocad et encore moins de lancer la commande. Est-ce compliqué à utiliser cette macro ?

Et Pour Luna, merci d'avoir pris le temps de rédiger une telle réponse, je comprends mieux certaines choses et surtout, elle m'aura permis de revoir un peu ma position.

 

En fait je ne souhaite pas spécialement apprendre à programmer, je veux juste arriver à trouver des solutions plus rapides que celles que j'utilise actuellement devant certaines situations. Et que ce soit par une nouvelle fonction que Autocad que je ne connaitrais pas, par une macro, un lisp ou toute autre chose. J'ai découvert récemment l'utilisation des macros sur Excel et ai réussi à m'en dépatouiller non sans difficultés mais sans trouver ça insurmontable non plus. Je croyais à tort et assez naïvement, je le reconnais, que je pourrais m'en sortir de la même façon avec ces lisp. BREF.

Je capitule sur l'utilisation des lisp pour le moment. Je relance un coup la discussion en changeant ma demande.

 

J'aimerais trouver une solution plus rapide et moins barbante pour tracer une polyligne fermée avec comme données de base, une première polyligne et une largeur de décalage. Plus rapide que de faire ça de façon simple avec les fonctions basique d'Autocad. Je remets en PJ le fichier qui montre ce que je fais actuellement et que je cherche à optimiser.

Merci !

Dessin bordures.dwg

Lien vers le commentaire
Partager sur d’autres sites

Pour ta culture Lispesque :

https://gilecad.azurewebsites.net/Resources/Introduction_a_AutoLISP.pdf

Tu peut parcourir les 10 première pages pour comprendre de quoi on parle lorsque l'on parle de LISP, et comment manipuler un fichier .lsp quand on t'en donne une.

Lispeur éternel débutant!
Autocad Map3D 2023
Covadis-Autopist 18.2

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Olivier Eckmann, je reviens vers vous suite au test de votre macro.

Je pense avoir fait ce qu'il fallait pour l'insérer dans Autocad mais n'arrive pas a bien l'exécuter.

Je trace ma polyligne, je fais mon décalage puis lance la macro et à ce moment, Autocad cherche à faire quelque chose mais n'y arrive visiblement pas. Un message "choix de l'option incorrect" apparait dans le texte de la ligne de commande. J'ai toujours la possibilité de faire la jonction manuellement à ce moment la puisqu'étant toujours dans la fonction PEDIT.

Je vous mets en PJ les captures d'écran de la création de la macro dans le menu puis du déroulé des opération dans la ligne de commande.

Merci

 

2024-09-12 10_49_04-Window.png

2024-09-12 10_50_31-Window.png

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é