Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Convertir un liste en getkword

12 RÉPONSES 12
RÉSOLU
Répondre
Message 1 sur 13
Romain.R
618 Visites, 12 Réponses

Convertir un liste en getkword

Bonjour à vous,

 

J'essaie tant bien que mal de me faire mon petit fichier LISP, mais je n'ai clairement pas les compétences nécessaires. 

 

Je souhaiterai au lancement de ma commande faire :

- apparaître ma liste d'états de calques dans la barre de commande sous forme getkword

- dupliquer une présentation existante dans le dessin pour y appliquer l'état de calque sélectionné.

 

Pouvez-vous m'aider pour transformer un (layerstate-getnames) en getkword ?

 

Je vous remercie par avance.

 

Cordialement.

 

12 RÉPONSES 12
Message 2 sur 13
-didier-
en réponse à: Romain.R

Bonjour @Romain.R 

 

Je ne comprends pas la question, désolé.

 

Je vais me permettre un conseil (on verra bien comment il est pris...)

Pour tout apprentissage la règle est de ne pas mettre la barre trop haut.
Quand on apprend le piano, on fait des gammes, Quand on apprend le vélo on a des petites roues pour sécuriser l'équilibre, en info c'est pareil... Commencez par les fondamentaux avant de viser des programmes ambitieux.

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

Message 3 sur 13
Romain.R
en réponse à: Romain.R

Bonjour @-didier- 

 

Ci-joint un fichier LISP qui permet de choisir un état de calque et de l'appliquer à toutes les présentations dans le dessin.

 

J'aimerai avoir le même principe sauf qu'au lieu d'appliquer l'état de calque à toutes les présentations, ça me duplique une présentation existante et lui applique l'état de calque sélectionné en amont.

 

Je suis d'accord pour les fondamentaux, d'ailleurs c'est sur votre site que je vais me renseigner pour les fonctions. N'ayant aucune formation dans le domaine de l'informatique, cela me prendra énormément de temps avant d'acquérir une base solide.

Il ne reste que peu de solutions , soit j'attends X années pour pouvoir écrire le code moi-même, ce qui est dommage car je ne connais pas ma situation professionnelle future, ni même si ce programme me sera utile, et même pas sûr que j'y arrive :). Alors que cette commande me sera utile actuellement.

Soit je demande l'aide de professionnels tels-que vous , ce qui me permettra de gagner du temps et d'apprendre un peu plus.

 

J'ai vraiment essayé par mes propres moyens mais comme vous le dites, la barre est trop haute pour moi.

 

Cordialement.

Message 4 sur 13
O_Eckmann
en réponse à: Romain.R

Bonjour,

 

Dupliquer une présentation existante peut se faire en ligne de commande dans AutoCAD, via la commande

-PRESENTATION        (bien taper le tiret)

C                                   (puis l'option C pour Copier)

Ensuite AutoCAD demande le nom de la présentation à copier et enfin le nom de la nouvelle présentation.

Donc ça s'automatise sans souci en Lisp avec (command ...

 

Quant à appliquer un état de calque à cette présentation uniquement, dans le lisp il y  a une boucle pour chaque présentation dans la liste des présentations avec la création d'un jeu de sélection de toutes les fenêtres de cette présentation et la vérification qu'il existe.

       (foreach layout layouts
         (setq found (setq ss nil))
         (if (setq ss
                    (ssget "_x" (list '(0 . "VIEWPORT") (cons 410 layout)))
             )

Il suffit d'ajouter dans le if une condition pour tester que le nom de la présentation correspond au nom précédemment créé.

Il ne s'agit que de piste à explorer et pas d'un programme tout fait, mais si vous voulez chercher un peu, c'est faisable. 

Si vous n'y arrivez pas, on vous aidera un peu plus.

 

Olivier

 

Olivier Eckmann

EESignature

Message 5 sur 13
Romain.R
en réponse à: O_Eckmann

bonjour @O_Eckmann 

 

Merci pour votre réponse.

 

Ci-joint un fichier tests qui représente le déroulement de la commande.

Tout se passe bien jusqu'à (initget 1 (layerstate-getnames)), je vois bien ma liste des états de calques présent mais ne se met pas en mot clé. Et je n'arrive pas adapter le code du 1er LISP joint pour y arriver.

A savoir :

 - Que les présentations GAB-* seront toujours présentes sur les dessins. Se sont des présentations qui servent de base pour en faire d'autres.

 - Que le nom des états de calques seront toujours identiques, c'est juste qu'ils seront présents ou non suivant le plan.

Je pourrai très bien rentrer dans le LISP tous mes états de calque, mais elle serait longue et j'afficherai des états de calque parfois non présent dans le fichier. C'est pour épurer la liste de choix que je souhaite convertir la liste des états de calque présent dans le dessin en mots clef.

 

Autre question au passage 😁, j'ai mis par sécurité "cvport" "2" , mais sur toutes mes présentations en tapant _.mspace je rentre dans la bonne fenêtre. Est-ce qu'il vaut mieux le garder par sécurité , ou c'est une action redondante qui ralentit la commande ? Ou sa présence ne change pas grand chose ?

 

En tout cas merci à vous et @-didier-  d'avoir pris la peine de répondre.

Message 6 sur 13
Romain.R
en réponse à: Romain.R

Voila ma commande dans sa globalité.

Mais je pense que le setq e de fin ne soit la bonne manière de faire.

Et il me reste l'histoire de la liste des états de calque en mettre en mot clé

Message 7 sur 13
O_Eckmann
en réponse à: Romain.R

Bonjour,

 

Il faut convertir ta liste d'états de calques en chaine de texte séparée une fois par un espace pour le initget et une fois avec le / pour le getkword.

Giles a écrit un tas de routine très intéressante dont une fonction qui convertit une liste en chaine avec le séparateur souhaité

;; LST2STR
;; Concatène une liste et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur
;;
;; Exemples
;; (lst2str '(1 2 3) ",") -> "1,2,3"
;; (lst2str '("a" "b" "c") " ") -> "a b c"

(defun lst2str (lst sep)
  (if (cadr lst)
    (strcat (vl-princ-to-string (car lst))
	    sep
	    (lst2str (cdr lst) sep)
    )
    (vl-princ-to-string (car lst))
  )
)

 

Donc dans ton lisp tu remplaces 

(initget 1 (layerstate-getnames))

par 

(initget 1 (lst2str (layerstate-getnames) " "))

 

puis 

(setq d (getkword "\nChoix de l'état de calque à appliquer : [(layerstate-getnames)] "))

par 

(setq d (getkword (strcat "\nChoix de l'état de calque à appliquer : [" (lst2str (layerstate-getnames) "/") "] ")))

 

J'ai fait ça sans pouvoir tester, donc à vérifier.

 

 

Olivier

Olivier Eckmann

EESignature

Message 8 sur 13
Romain.R
en réponse à: O_Eckmann

bonjour @O_Eckmann 

 

C'est ce que j'essai d'intégrer dans mon lisp.

Quand je rentre cette partie de code tel-quel dans mon fichier quand je sélectionne un mot clé, la valeur renvoyée est "Choix de l'option incorrect." ou "Nom de présentation non valable."

J'essai de l'adapter mais sans succès 😅

 

Message 9 sur 13
CADaSchtroumpf
en réponse à: Romain.R

Bonjour,

Je voudrais simplement évoquer la difficulté d'utiliser une liste pour alimenter (initget) et (getkword).

Getkword pour fonctionner correctement demande des mots-clé totalement distincts.

Donc pour des mots ayant une similitude, on doit déclarer les LETTRE clés avec des majuscules pour les différencier

Par exemple pour différencier "Polyligne" et "Prolonger" qui commence par la même lettre il faudrait les définir comme ceci : "POlyligne" et "PRolonger".

Donc dans une génération automatique, tu risque d'avoir des mots double qui ne pourront être différenciés.

Et dernière remarque pour le symbole "_" qui sert à une interprétation internationale.

Voici plusieurs exemples, seul le premier est totalement fiable, les autre sont aléatoire et peuvent donner un résultat erronée.

 

((lambda ( / )
(initget "Mur Cloison")
(getkword "[Mur/Cloison]: ")
))
((lambda ( / )
(initget "mur cloison")
(getkword "[mur/cloison]: ")
))
((lambda ( / )
(initget "Détail-mur Détail-cloison")
(getkword "[Détail-mur/Détail-cloison]: ")
))
((lambda ( / )
(initget "Mur Etage _Cloison Machinerie")
(getkword "[Mur/Etage/_Cloison/Machinerie]: ")
))

 

Message 10 sur 13
Romain.R
en réponse à: Romain.R

Merci beaucoup pour vos explications, je vais explorer tout ça. 

Je reviendrai sur le post pour dire ce qu'il en est  😉.

Message 11 sur 13
Romain.R
en réponse à: Romain.R

Merci à vous pour votre aide et vos précieuses explications.

Ce n'est peut-être pas écrit dans les règles de l'art, il y a peut-être moyen de faire plus simple, mais chez moi il fonctionne correctement.

Pour ceux que ça intéresse voici le LISP.

A savoir que

 - le nom des présentations dans les 1er conditions sont  à remplacer avec les noms des présentations existantes dans votre DWG que vous voulez dupliquer.

 - que les .......... dans les 2nd conditions sont à remplacer avec le nom des états de calque présents dans votre dwg.

Et il faut que vos états de calque n'ai ni de "_" ni d'espace dans le nom

 

Bonne journée

Message 12 sur 13
O_Eckmann
en réponse à: Romain.R

C'est juste pour comprendre : qu'as tu voulu faire en écrivant ça?

(strcat b "_" (itoa 1))

 

Olivier

Olivier Eckmann

EESignature

Message 13 sur 13
Romain.R
en réponse à: O_Eckmann

Je précise que le LISP final ne ressemble pas du tout à mon idée de base, j'ai modifié au fur et à mesure de mon avancement, mes difficultés à comprendre les fonctions et l'utilité des actions.

En faite à la base mon lisp me créait autant de présentations que d'état de calque présent dans le dessin, donc pour numéroter les présentations je passais par un itoa 1+. C'était pour tester l'incrémentation et c'était la seule solution que j'avais trouvé pour passer automatiquement sur chaque présentation.

Maintenant que je créais qu'une présentation plus vraiment besoin de l'itoa mais je l'ai gardé car ça fonctionne aussi 😄

Ca me nomme la présentation avec le avec le suffixe _1 au lieu du (2) classique.

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report