barbichette Posté(e) le 27 mars Posté(e) le 27 mars Bonjour, Un collègue a créé un lisp (avec l'aide de l'"IA") pour dessiner les courbes de charge d'une grue. Mais je souhaiterait améliorer ce lisp. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXX MDT219 XXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (defun c:GRUE_DIAG219 () (setq choix-fleche (getstring "\nEntrez la longueur de flèche installée (ex: 30m, 35m, ...): ")) ;; Définition des capacités de levage selon la longueur de flèche et le rayon de travail (setq capacites '( ("25" (20 20) (25 8.4)) ("30" (20 10) (25 8.6) (30 7)) ("35" (21 10) (25 8.5) (30 6.9) (35 5.8)) ("40" (20 10) (25 8.4) (30 6.9) (35 5.8) (40 5)) ("45" (20 10) (25 8.3) (30 6.8) (35 5.7) (40 4.9) (45 4.3)) ("50" (20 10) (25 8.3) (30 6.7) (35 5.6) (40 4.7) (45 4) (50 3.5)) ("55" (20 10) (25 7.9) (30 6.4) (35 5.4) (40 4.5) (45 3.9) (50 3.3) (55 2.95)) ("60" (20 9.4) (25 7.3) (30 6) (35 4.6) (40 4.2) (45 3.6) (50 3.1) (55 2.6) (60 2.2)) ("65" (20 8.88) (25 6.9) (30 5.6) (35 4.6) (40 3.9) (45 3.3) (50 2.85) (55 2.4) (60 1.95) (65 1.6)) )) ;; Récupération des valeurs disponibles pour la flèche choisie (setq valeurs (cdr (assoc choix-fleche capacites))) (if valeurs (progn (foreach item valeurs (setq rayon (car item) charge (cadr item)) ;; Dessiner un cercle pour chaque rayon de travail ;; la partie (command "_circle" '(x x) défini le centre des cercles (command "_circle" '(0 0) (rtos rayon 2 2)) ;; Ajouter un texte avec la charge au bon emplacement ;; (list rayon x) défini la coordonnée y du texte de charge noté ;; (command "_text" (list rayon 0) "1" "90" (strcat (rtos charge 2 2) "t "))) (command "_text" (list rayon 0) "1" "90" (strcat (rtos rayon 2 2) "m - " (rtos charge 2 2) "t"))) (princ "\nDiagramme de levage cree avec toutes les charges affichees.")) (princ "\nFleche non disponible.")) (princ)) Je souhaiterai que - Le lisp interroge et demande le lieu où les courbes de charge soient insérées - Les courbes de charge soient crée dans un bloc Dans un deuxième temps, ce lisp comporte les courbes de charge de plusieurs grues (defun c:GRUE_DIAG219 () (defun c:GRUE_DIAG218 () (defun c:GRUE_DIAG178 () Comment faire pour que le lisp nous interroge sur la grue à installer Quelles sont les modification à apporter au lisp. D'avance, je vous remercie ***********************Rien ne sert de courrir, il faut partir à point.
Luna Posté(e) mardi à 21:42 Posté(e) mardi à 21:42 Coucou, Tu parles d'avoir les courbes de charge de plusieurs grues sous forme de commandes séparées, or je doute que le fond du code change drastiquement. Je suppose que les seules informations qui changent réellement sont celles que l'on trouve dans la variable 'capacites' ? Au vu du programme, il y a de nombreuses choses que l'on peut vraiment améliorer pour un rendu plus professionnel, mais pour cela il faudrait l'ensemble du LISP et quelques infos supplémentaires (notamment qu'entends-tu par "les courbes de charge soient crées dans un bloc" ?). Si en revanche tu souhaites effectuer ces modifications de ton côté : Le 27/03/2025 à 14:09, barbichette a dit : - Le lisp interroge et demande le lieu où les courbes de charge soient insérées Il faut ajouter : (setq point (getpoint "\nSpécifier le point d'insertion : ") x (car point) y (cadr point) ) juste après la ligne (setq valeur ... et modifier les 2 lignes comme suit : ;; remplacer '(0 0) par point (command "_circle" point (rtos rayon 2 2)) ;; remplacer (list rayon 0) par (list (+ x rayon) y) afin d'ajouter les coordonnées du point d'origine au calcul des coordonnées du texte (command "_text" (list (+ x rayon) y) "1" "90" (strcat (rtos rayon 2 2) "m - " (rtos charge 2 2) "t")) Le 27/03/2025 à 14:09, barbichette a dit : - Les courbes de charge soient crée dans un bloc Pour cela, j'aurais besoin d'un peu plus de détail et en fonction des réponses, cela changera la nature du code. Souhaite tu créer des définitions de blocs ou souhaites-tu insérer des références de blocs ? Dans le premier cas, ne serait-il pas plus simple de créer les définitions de blocs à la main (puisqu'il ne me semble pas que cela représente de nombreuses heures de travail) et cela permettrait en plus de créer des blocs dynamiques. Dans le second cas, cela suppose que les définitions de blocs existent déjà. Ou bien est-ce un programme qui se veut "intelligent" c'est-à-dire qu'il insère des références de blocs, et si la définition de bloc n'existe pas encore dans le dessin, alors il faut dans un premier temps créer cette définition de bloc pour ensuite insérer une référence de bloc ? Le 27/03/2025 à 14:09, barbichette a dit : Comment faire pour que le lisp nous interroge sur la grue à installer Pour poser une question à un utilisateur (et dans ton cas je te suggère de n'autoriser que certaines valeurs), tu peux utiliser (getkword) avec la fonction (initget). Voir un exemple ci dessous (pas le plus opti) : (initget 1 "219 218 178") (setq grueNum (getkword "\nVeuillez choisir le type de grue [219/218/178] : ")) (cond ((grueNum = "218") (c:GRUE_DIAG218)) ((grueNum = "219") (c:GRUE_DIAG219)) ((grueNum = "178") (c:GRUE_DIAG178)) ) Bisous, Luna
Luna Posté(e) mercredi à 01:09 Posté(e) mercredi à 01:09 Coucou, Juste à titre d'exemple (désolée, la passion à pris le dessus ^^') j'ai retravaillé ton code dans sa globalité pour qu'il soit un peu plus poussé (sans intégrer la partie concernant les blocs) et plus facilement modifiable (les paramètres développeurs notamment, car je reconnais que pour le reste c'est peut-être plus difficile à comprendre désormais). Il s'agit du fichier GRUE.lsp (mais il est dépendant des fonctions (getkdh), (lst2str) et (str2lst) d'où leur présence également mais rien ne t'empêche de tout regrouper dans le même fichier) et le nom de la commande est GRUE. Bisous (et désolée pour le dérangement), Luna UtDac . lst2str.lsp UtDac . str2lst.lsp UtUse . getkdh.lsp GRUE.lsp
barbichette Posté(e) il y a 12 heures Auteur Posté(e) il y a 12 heures Le 01/04/2025 à 23:42, Luna a dit : Coucou, Tu parles d'avoir les courbes de charge de plusieurs grues sous forme de commandes séparées, or je doute que le fond du code change drastiquement. Je suppose que les seules informations qui changent réellement sont celles que l'on trouve dans la variable 'capacites' ? Au vu du programme, il y a de nombreuses choses que l'on peut vraiment améliorer pour un rendu plus professionnel, mais pour cela il faudrait l'ensemble du LISP et quelques infos supplémentaires (notamment qu'entends-tu par "les courbes de charge soient crées dans un bloc" ?). Si en revanche tu souhaites effectuer ces modifications de ton côté : Il faut ajouter : (setq point (getpoint "\nSpécifier le point d'insertion : ") x (car point) y (cadr point) ) juste après la ligne (setq valeur ... et modifier les 2 lignes comme suit : ;; remplacer '(0 0) par point (command "_circle" point (rtos rayon 2 2)) ;; remplacer (list rayon 0) par (list (+ x rayon) y) afin d'ajouter les coordonnées du point d'origine au calcul des coordonnées du texte (command "_text" (list (+ x rayon) y) "1" "90" (strcat (rtos rayon 2 2) "m - " (rtos charge 2 2) "t")) Pour cela, j'aurais besoin d'un peu plus de détail et en fonction des réponses, cela changera la nature du code. Souhaite tu créer des définitions de blocs ou souhaites-tu insérer des références de blocs ? Dans le premier cas, ne serait-il pas plus simple de créer les définitions de blocs à la main (puisqu'il ne me semble pas que cela représente de nombreuses heures de travail) et cela permettrait en plus de créer des blocs dynamiques. Dans le second cas, cela suppose que les définitions de blocs existent déjà. Ou bien est-ce un programme qui se veut "intelligent" c'est-à-dire qu'il insère des références de blocs, et si la définition de bloc n'existe pas encore dans le dessin, alors il faut dans un premier temps créer cette définition de bloc pour ensuite insérer une référence de bloc ? Pour poser une question à un utilisateur (et dans ton cas je te suggère de n'autoriser que certaines valeurs), tu peux utiliser (getkword) avec la fonction (initget). Voir un exemple ci dessous (pas le plus opti) : (initget 1 "219 218 178") (setq grueNum (getkword "\nVeuillez choisir le type de grue [219/218/178] : ")) (cond ((grueNum = "218") (c:GRUE_DIAG218)) ((grueNum = "219") (c:GRUE_DIAG219)) ((grueNum = "178") (c:GRUE_DIAG178)) ) Bisous, Luna Bonjour, Tout d'abord, je te remercie pour t'être penché(e) sur mon projet/problème. J'ai, de mon côté, travaillé sur mon code et ai réussi à obtenir quasiment ce que je voulais. J'ai intégré ta partie de code pour demander à sélectionner un point, et insérer mes courbes de charge centrées sur ce point. Pour la partie "bloc" voici mon mode de travail. Tout d'abord, j'intègre un bloc dynamique qui représente la grue vue du haut Ce bloc comporte des "états de visibilité" selon que le type de chassis que l'on choisi et si l'on veut faire afficher les cotations ensuite j'indique par des valeurs d'attribut, les détails de la grue (portée de la flèche, hauteur sous crochet, altitude de l'assise...) Enfin je met à jour les champs de valeurs qui mettent à jour les valeurs d'altitude des différents éléments clés de la grue Pour finir, si le conducteur le souhaite j'insère les courbes de charges (fonction de la portée de la flèche) => lisp présentement travaillé. Il arrive que, dans l'étude de notre plan d'installation, nous soyons obligés de déplacer la grue. Déplacer le bloc grue est simple, et déplacer les indications de courbes de charge serait aisé si elles étaient crées dans un bloc. Donc pour répondre à ta question il faudrait que, après le choix du type de grue, de la longueur de flèche, du point d'insertion, tous les éléments soient créés et regroupés dans un bloc. Pour ce qui est des 4 Lisp que tu as créé, ils sont quasi parfaits... Il faut maintenant que je les étudie pour comprendre leur fonctionnement ***********************Rien ne sert de courrir, il faut partir à point.
barbichette Posté(e) il y a 11 heures Auteur Posté(e) il y a 11 heures Alors j'ai regardé. Et j'ai des questions : 1°) où définis tu l'endroit où noter les différents type de grue. J'ai bien trouvé la "219" mais je ne vois pas où je pourrais ajouter les "218", "178", "125", "386", "366" qui seront les 5 autres grues => Edit : J'ai trouvé... Par contre je ne peux pas mettre un nom de grue en style "MDT219" qui est le vrai nom. 2°) de même, où et comment noter les paramètres des 5 autres types de grue => Edit : J'ai trouvé... 3°) il me semble avoir trouvé la zone où sont définis l'angle, et l'alignement du texte, mais je ne vois pas où je pourrais noter le style de police "Style20" ainsi que la taille que je souhaite utiliser. (Ps : les autres paramètres sont parfait : Texmult, alignement centré, et masque d'arrière plan) je pense qu'il manque un argument > Edit : J'ai trouvé... 4°) pour finir, j'avais réussi à intégrer un code qui demandait dans quel calque l'ensemble du truc devait être inséré. Mais je ne sais pas trop où le coller... => Edit : J'ai trouvé..., je l'ai inséré tout au début Et afin de n'avoir qu'un seul lisp à charger, comment fusionner l'ensemble des lisps en 1 seul (j'ai peur de les mettre au mauvais endroit). ***********************Rien ne sert de courrir, il faut partir à point.
Luna Posté(e) il y a 6 heures Posté(e) il y a 6 heures Coucou, Il y a 4 heures, barbichette a dit : 1°) où définis tu l'endroit où noter les différents type de grue. J'ai bien trouvé la "219" mais je ne vois pas où je pourrais ajouter les "218", "178", "125", "386", "366" qui seront les 5 autres grues => Edit : J'ai trouvé... Par contre je ne peux pas mettre un nom de grue en style "MDT219" qui est le vrai nom. En me basant sur les lignes de codes suivantes : ;; ---------[ DEVELOPPER PARAMS ]--------- ;; ;; This section allows the developper to change quickly the parameters used by the program based on their need ;; Each parameters can be set as constants, ignored (= nil) or develop a full question if it needs to be set ;; by the user instead. (setq dimtxt nil ; Defines the text height (nil → use DIMTXT value instead) angtxt nil ; Defines the axis angle on which the text will be aligned on (nil → 0 (East)) algtxt nil ; Defines the text alignment mode (cd. MTEXT(DXF), code 71) (nil → 5 (Middle Center)) radiusPrec nil ; Defines the precision (number of decimal) for the crane boom length (nil → 2) weightPrec nil ; Defines the precision (number of decimal) for the weight (nil → 2) maskBoxScale 1.2 ; Defines the fill box scale value for the text background mask (nil → no mask) capacities ; Defines the different capacities based on the crane model and their length '( ;; ---------[ GRUE_DIAG219 ]--------- ;; (219 (25 (20 20) (25 8.4)) (30 (20 10) (25 8.6) (30 7)) (35 (21 10) (25 8.5) (30 6.9) (35 5.8)) (40 (20 10) (25 8.4) (30 6.9) (35 5.8) (40 5)) (45 (20 10) (25 8.3) (30 6.8) (35 5.7) (40 4.9) (45 4.3)) (50 (20 10) (25 8.3) (30 6.7) (35 5.6) (40 4.7) (45 4) (50 3.5)) (55 (20 10) (25 7.9) (30 6.4) (35 5.4) (40 4.5) (45 3.9) (50 3.3) (55 2.95)) (60 (20 9.4) (25 7.3) (30 6) (35 4.6) (40 4.2) (45 3.6) (50 3.1) (55 2.6) (60 2.2)) (65 (20 8.88) (25 6.9) (30 5.6) (35 4.6) (40 3.9) (45 3.3) (50 2.85) (55 2.4) (60 1.95) (65 1.6)) ) ; End GRUE_DIAG219 params ) ) ; End of DEVELOPPER PARAMS ;; You can change the default value below if needed also (setq dimtxt (cond (dimtxt) ((getvar "DIMTXT"))) angtxt (cond (angtxt) (0)) algtxt (cond (algtxt) (5)) radiusPrec (cond (radiusPrec) (2)) weightPrec (cond (weightPrec) (2)) ) ; End default params values Pour ajouter des nouveau modèles de grues, il suffit d'ajouter une liste comme ceci : ;; ---------[ GRUE_DIAG219 ]--------- ;; (219 (25 (20 20) (25 8.4)) (30 (20 10) (25 8.6) (30 7)) (35 (21 10) (25 8.5) (30 6.9) (35 5.8)) (40 (20 10) (25 8.4) (30 6.9) (35 5.8) (40 5)) (45 (20 10) (25 8.3) (30 6.8) (35 5.7) (40 4.9) (45 4.3)) (50 (20 10) (25 8.3) (30 6.7) (35 5.6) (40 4.7) (45 4) (50 3.5)) (55 (20 10) (25 7.9) (30 6.4) (35 5.4) (40 4.5) (45 3.9) (50 3.3) (55 2.95)) (60 (20 9.4) (25 7.3) (30 6) (35 4.6) (40 4.2) (45 3.6) (50 3.1) (55 2.6) (60 2.2)) (65 (20 8.88) (25 6.9) (30 5.6) (35 4.6) (40 3.9) (45 3.3) (50 2.85) (55 2.4) (60 1.95) (65 1.6)) ) ; End GRUE_DIAG219 params Le premier élément de la liste (ici 219) sert de clé. En l'état actuel j'ai considéré que les clés étaient de type integer mais cela peut se changer "relativement" facilement (il faut cependant modifier le code également un peu plus bas, ligne 88 du fichier : (getkdh (quote (getint msg)) ;; <-- line 88 "\nVeuillez sélectionner le type de grue" (list (apply 'strcat (mapcar '(lambda (x) (strcat (vl-princ-to-string (car x)) " ")) capacities))) ": " (caar capacities) "" ;You can add any help message for this question in order to guide the users on the options ) Remplacer (getint) par (getkword), comme ceci : (getkdh (quote (getkword msg)) "\nVeuillez sélectionner le type de grue" (list (apply 'strcat (mapcar '(lambda (x) (strcat (vl-princ-to-string (car x)) " ")) capacities))) ": " (caar capacities) "" ;You can add any help message for this question in order to guide the users on the options ) Pour l'explication (getint) ne permet que la saisie de nombres entiers, tandis que (getkword) attend la saisie de mots clés (vui c'est dans le nom ^^). Comme tu souhaites utiliser des clés sous forme de chaîne de caractères (offrant plus de libertés), la fonction (getkword) est plus adaptée. Et pour ce qui est de la fonction (getkdh), c'est une fonction que j'utilise absolument partout qui me permet de construire facilement des questions utilisateurs (de son nom complet GET-Keywords/Default/Help). C'est sûrement un peu (très beaucoup) compliqué à lire comme programme donc c'est juste un petit plus dont je ne peux plus me passer quand je programme. Il y a 4 heures, barbichette a dit : 2°) de même, où et comment noter les paramètres des 5 autres types de grue => Edit : J'ai trouvé... C'est à la suite de ta clé principale de la liste 'capacities'. Mais comme tu as trouvé, je suppose que tout va bien ! Il y a 4 heures, barbichette a dit : 3°) il me semble avoir trouvé la zone où sont définis l'angle, et l'alignement du texte, mais je ne vois pas où je pourrais noter le style de police "Style20" ainsi que la taille que je souhaite utiliser. (Ps : les autres paramètres sont parfait : Texmult, alignement centré, et masque d'arrière plan) je pense qu'il manque un argument > Edit : J'ai trouvé... L'angle et la hauteur de texte sont défini au début dans les "Paramètres développeurs". Pour le style de police, il s'agit du code DXF 7 (cf. >>ici<<), par défaut AutoCAD considère "STANDARD" si non précisé. Pour l'ajouter, c'est ici à la fin de la (list) : (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 10 pt0txt) (cons 40 dimtxt) (cons 50 (- angtxt (/ pi 2.))) (cons 71 algtxt) (cons 1 (strcat (rtos radius 2 radiusPrec) "m - " (rtos weight 2 weightPrec) "t")) ; ← if you need to change the text output ; ex: "25.00m - 7.90t" (cons 7 "MyWonderfulFont") ; <-- Remplacer "MyWonderfulFont" par la police souhaitée, ou bien même une variable déclarée plus haut dans les params développeurs ) Il y a 4 heures, barbichette a dit : 4°) pour finir, j'avais réussi à intégrer un code qui demandait dans quel calque l'ensemble du truc devait être inséré. Mais je ne sais pas trop où le coller... => Edit : J'ai trouvé..., je l'ai inséré tout au début Le code DXF 8 permet de définir le calque d'un objet, si pas précisé il considère le calque courant. Si jamais c'est un calque connu et toujours le même, je dirais qu'il faut faire exactement comme pour le code DXF 7. Si c'est un choix utilisateur, ma solution préférée est (ListBox) développé par (gile) (cf. >>ici<< par exemple). Sinon libre à toi. Il faut cependant checker me semble-t-il si le calque existe (à vérifier). Attention à ajouter ce code DXF 8 aux deux types d'entités crées : MTEXT et CIRCLE ! Il y a 4 heures, barbichette a dit : Et afin de n'avoir qu'un seul lisp à charger, comment fusionner l'ensemble des lisps en 1 seul (j'ai peur de les mettre au mauvais endroit). Si tu ne veux pas t'embêter, le plus simple et juste de copier/coller le contenu de chaque fichier dans 1 seul et unique fichier à la suite (par exemple tu colles tous les fichiers "Ut..." à la suite dans le fichier "GRUE.lsp"). Il y a 5 heures, barbichette a dit : Pour finir, si le conducteur le souhaite j'insère les courbes de charges (fonction de la portée de la flèche) => lisp présentement travaillé. Si je comprends bien tu insères un bloc dynamique de grue (qui n'intègre pas les courbes de charge) et le LISP a pour but de créer une nouvelle définition de bloc (si pas déjà existante) puis d'insérer une référence de ce bloc au point d'insertion du bloc grue ? Dans ce cas j'ai plusieurs questions : Pourquoi ne pas intégrer les courbes de charge directement dans le bloc (dans un calque spécifique) et ainsi il suffit uniquement de geler/dégeler le calque pour voir les courbes momentanément ? Cela permettra notamment de gérer qu'un seul et unique bloc. (Bien que je reconnais que du coup, le bloc risque d'être un peu vénère) Est-ce qu'un simple groupe peut satisfaire le besoin ? j'avais une autre question mais j'ai un trou de mémoire, sorry... Bisous, Luna
barbichette Posté(e) il y a 6 heures Auteur Posté(e) il y a 6 heures Encore merci Luna pour ton accompagnement.... Le fait d'échanger de la sorte sur la composition, le comportement, la modification de mon lisp me fait beaucoup progresser... J'ai fait la modification du getini en getkword Effectivement la liste des options disponibles est bien composée de mots clés (les noms de mes grues), mais la sélection d'un type de grue, que ce soit en cliquant sur le nom dans la bare des taches ou en le tapant au clavier ne "lance" pas la suite de la macro. Y'a t'il un autre endroit où il convient de modifier le getint ? ***********************Rien ne sert de courrir, il faut partir à point.
Luna Posté(e) il y a 4 heures Posté(e) il y a 4 heures Coucou, J'ai testé sans problème... Peux-tu m'envoyer l'erreur que tu rencontres ? Bisous, Luna
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