Aller au contenu

Copier depuis point de base d'un bloc


Jo le projeteur

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

  • Upvote 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.

Lien vers le commentaire
Partager sur d’autres sites

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 :

  1. 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" 😉
  2. 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".
  3. 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).
  4. 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.  

Lien vers le commentaire
Partager sur d’autres sites

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

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é