Jo le projeteur Posté(e) le 9 juin 2022 Posté(e) le 9 juin 2022 Bonjour la communauté. J'ai écris un lisp, mais je n'arrive pas a corrigé l'erreur par manque de connaissance actuellement. A chaque correction de la part d''un de vous, j'apprend à nouveau. J'aimerais que mon lisp, copie le bloc ( sélectionné ou après demande de sélection) depuis sont point de base, puis me laisse la main pour le coller ou je le souhaite. Je vous met mon écriture, si quelqu'un a la générosité de me dire comment réparer ça. Je vous remercie d'avance. CBase.lsp
Steven Posté(e) le 9 juin 2022 Posté(e) le 9 juin 2022 Salut @Jo le projeteur, Sans lisp, tu peux faire ce que tu souhaites. Tu sélectionnes ton bloc sans lancer de commande. Tu sélectionnes le pont d'insertion de ce dernier, tu appuies sur la touche Ctrl puis tu copies ton bloc où tu le souhaites. Tu peux ensuite lâcher la touche Ctrl et faire une copie multiple de ton objet. 1 Steven________________________________________ Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD. Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD. En rêve; AutoCAD sous Linux.
Luna Posté(e) le 9 juin 2022 Posté(e) le 9 juin 2022 Coucou, Je pense que tu as fait une faute de frappe sur ton utilisation du (ssget) dans ta commande...Ci-dessous ton code original : (defun c:CB (/ ss) (if (or (setq ss (ssget "_I")) (setq ss (ssget)) ) (command "_.copy" ssget'((0 . "INSERT")) pause) ) (princ) ) Et ci-dessous la version corrigée : (defun c:CB (/ ss) (if (setq ss (ssget '((0 . "INSERT")))) (command "_.copy" ss "" (trans (cdr (assoc 10 (entget (ssname ss 0)))) 0 1) pause) ) (princ) ) J'ai corrigé plusieurs choses : L'utilisation du (ssget "_I") n'est théoriquement pas nécessaire car la fonction (ssget), si PICKFIRST = 1 (je connais aucun dessinateur qui fonctionne avec PICKFIRST = 0, d'où cette théorie), permet déjà de prendre en compte la sélection actuelle si existante, sinon demande de sélectionner des objets. Mais si tu ne considères pas que PICKFIRST = 1 quoi qu'il advienne, ta méthode est en effet plus "valide" 😉 Suppression de l'erreur ssget'((0 . "INSERT")) dans ta fonction (command) et remplacement par ta variable 'ss correspondant à ton jeu de sélection. Ajout des "" vides après l'utilisation du jeu de sélection 'ss pour valider la sélection et ainsi passer à la question suivante de la commande "_.COPY". Spécification du point de base du premier bloc contenu dans le jeu de sélection pour répondre automatiquement à la question "Premier point" via le code DXF 10. J'ai ajouté la fonction (trans) pour prendre en compte les SCU et ainsi transposer les coordonnées SCG du point en coordonnées du SCU courant (ou SCG si courant). En revanche, le programme ci-dessus ne vérifie aucunement que tu as un seul bloc contenu dans ton jeu de sélection et le point de base utilisé correspond donc uniquement au premier objet contenu dans le jeu de sélection (donc si plusieurs blocs dans 'ss, le point de base ne sera peut-être pas celui souhaité). Bisous, Luna
didier Posté(e) le 9 juin 2022 Posté(e) le 9 juin 2022 Bonjour @Jo le projeteur Je me permets de te proposer ces trois lignes de code qui vont faire le job demandé Je ne suis pas parti dans la même direction que toi avec un (ssget) car on ne parle que de copier UN bloc (setq blo (car (entsel"\nChoix du bloc\n"))) (setq ptins (cdr (assoc 10 (entget blo)))) (command "_.copy" blo "" ptins pause) la première ligne sélectionne le bloc la deuxième mémorise le point d'insertion la troisième copie... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Jo le projeteur Posté(e) le 9 juin 2022 Auteur Posté(e) le 9 juin 2022 Salut @Steven. Je la connais cette méthode, 😃😉, justement le but de cette routine est de ne pas cliquer sur le point de base du bloc, et aller plus vite dans la sélection , mais merci pour ta réponse en tout cas. Salut @Luna merci. Le lisp correspond exactement à ce que je voulais. Attraper le point se base du bloc vite fais sans clic' juste avec une sélection et en lançant une commande. Et encore merci pour toute la description du code qui va avec. Je vais l'étudier dès que j'ai le temps. salut @didier Merci. Je test ton lisp demain. Comme j'ai eu celui de Luna avant, j'ai tester avant 😉, et comme j'étais au boulot, que le lisp faisais ce que je voulais, je suis rester là dessus. En fonction du comportement de ton lisp, je chercherais à interpréter chaque terme du lisp et ça me servira certainement dans les prochains lisp que je tenterais d'ecrire. Encor un grand merci à tous les 3 😁😁 @bientôt.
didier Posté(e) le 10 juin 2022 Posté(e) le 10 juin 2022 Bonjour @Jo le projeteur J'ai crû comprendre que tu es en apprentissage du langage, c'est pourquoi j'ai fait aussi simple. La réponse de @Lunaest excellente par ailleurs, mais en partant du principe qu'on apprend à marcher avant de courir, je me suis permis de te répondre "débutant". Ensuite, si tu dois étendre ta fonction, passer par le SSGET sera nécessaire, pour l'instant ce n'est pas le cas. Pour ce qui est d'apprendre, je te déconseille de copier-coller les réponses, tape le code, tu l'appréhenderas bien mieux. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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