Aller au contenu

Copier 100+


Jo le projeteur

Messages recommandés

Bonjour. 

 

Je m'appelle jonathan, je suis projeteur en BE CVC et j'aurais besoin de votre aide. 

 

Je n'arrive pas à écrire un lisp pour copier à 100 de plus ou de moins la sélection. 

 

Je m'explique.  

 

J'aimerais sélectionner des objet, tapper c+ et entrée et que la sélection soit copier 100 unitée de plus dans l'axe des y. Idem pour c-. 

 

J'ai réussit sans problème avec la commande -pan pour me déplacer de 100 de plus ou de moins. Je tape + ou - puis entrée et je me déplace de 100 ,mais quand fais pareil avec la commande copier Autocad me demande de sélectionner des objet. Que ma sélection n'est pas valide. Mais je ne connais pas la commande à tapper pour indiquer que je veux copier les éléments qui ont étaient sélectionnés avant de lancer la commande.

 

En vous remerciant par avance. 

 

Jo 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

J'imagine que si tu veux sélectionner d'abord, puis lancer la commande ensuite (sélection nom-verbe), c'est que tu travailles avec la variable système PICKFIRST à 1. Dans ce cas l'expression (setq ss (ssget)) dans ton code prendra la sélection courante s'il y en a une ou te demandera de sélectionner des objets.

(defun c:C+ (/ ss)
  (if (setq ss (ssget))
    (command-s "_.copy" ss "" "_Displacement" '(0. 100.))
  )
  (princ)
)


Si tu veux que ta routine fonctionne quelle que soit la valeur de PICKFIRST, il faut explicitement d'abord essayer s'il existe une sélection avec l'option "_I" de ssget et ensuite appeler ssget sans option s'il n'y en a pas.

(defun c:C+ (/ ss)
  (if (or (setq ss (ssget "_I"))
	  (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" '(0. 100.))
  )
  (princ)
)

 

  • Like 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci Gille.

 

C'est parfaitement ce que je voulais. Du coup le lisp adapté a mes 6 commandes 

(defun c:C+ (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" '(0. 100.))
  )
  (princ)
)

(defun c:C- (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" '(0. -100.))
  )
  (princ)
)


(defun c:D+ (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" '(0. 100.))
  )
  (princ)
)

(defun c:D- (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" '(0. -100.))
  )
  (princ)
)

(defun c:+ ()  ;; Se déplace à 100 de+

  (command "-pan" "0,0,0" "0,-100,0")
 (princ)
)

(defun c:- ()  ;; Se déplace à 100 de-
  
  (command "-pan" "0,0,0" "0,100,0")
 (princ)
)

 

 

Turtle76

Je travaille avec des blocs dynamique, et j'aimerais pouvoir changer l'état de visibilité d'un étage sans avoir à décomposer le réseau rectangulaire. Mais je me sert de cette commande quand les étages plombent parfaitement entre eux.

 

Merci beaucoup.

 

Maintenant, il faut que je cherche comment attribuer une variable A dans dans le Lisp pour pouvoir modifier la valeur de 100 à une valeur que je souhaite, ex, les grands plans ou a 100 de différences sur X il y a encor des éléments de l'étage inférieur, je le passe a 150 ou 200. sans voir a modifier ligne par ligne la valeur de 100 à 150 ou 200

 

Merci a vous pour votre réactivité en tout cas.

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Pour ton cas, tu peux utiliser une variable globale afin de conserver la valeur précédente dans un même dessin. Je te propose ceci, tu as une commande supplémentaire (actuellement nommé setA mais tu peux la renommer comme tu veux) pour modifier la valeur de la variable *a*. Si tu lances une commande sans définir *a*, il te faudra spécifier la valeur à la première utilisation, sinon cela prendra la valeur enregistrée. Donc si tu veux changer ta variable, tu as juste à relancer la commande setA et cela modifiera la valeur pour toutes les autres commandes :3

(defun setA (*a*)
  (if *a*
    *a*
    (progn
	  (initget 7 "100")
	  (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :"))
	)
  )
)

(defun c:SetA ()
  (initget 7 "100")
  (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :"))
)

(defun c:C+ (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" (list 0. (setA *a*)))
  )
  (princ)
)

(defun c:C- (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" (list 0. (- (setA *a*))))
  )
  (princ)
)


(defun c:D+ (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" (list 0. (setA *a*)))
  )
  (princ)
)

(defun c:D- (/ ss)
  (if (or (setq ss (ssget "_I"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" (list 0. (- (setA *a*))))
  )
  (princ)
)

(defun c:+ ()  ;; Se déplace à 100 de+

  (command "-pan" "0,0,0" (strcat "0," (rtos (- (setA *a*))) ",0"))
 (princ)
)

(defun c:- ()  ;; Se déplace à 100 de-
  
  (command "-pan" "0,0,0" (strcat "0," (rtos (setA *a*)) ",0"))
 (princ)
)

En espérant que cela corresponde à ton besoin !

PS : Fais tout de même attention avec les variables globales car cela peut très vite semer le chaos si plusieurs programmes utilisent des variables ayant la même dénomination mais une utilité différente. C'est pour cela qu'il est toujours préférable de travailler avec des variables locales et pour les rares fois où une variable globale est nécessaire (dans ton cas par exemple), il est fortement conseillé de nommer cette variable avec des caractères spéciaux pour la différencier des autres variables et ainsi éviter une confusion dans la programmation !

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Petit rappel : lorsque l'argument requis pour la fonction command est un nombre ou une liste de nombres, il peut être spécifié indifféremment
sous la forme d'un entier, d'un réel , d'une liste de nombres ou d'une chaîne de caractères.
Utiliser des nombres ou des listes de nombre évite les rtos, strcat et autres fonctions de traitement des chaînes.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

Bonjour à tous. Merci pour vos réponses. C'est parfait. je commence a aller un peu loin, mais est il possible de répéter la commande si j'appuie sur espace ou entrer. Explication : quand la commande 100+ est finit, si je fait espace pour la répéter a nouveau , elle ne fonctionne pas , contrairement aux commandes natives. Désolé de mon absence sur le réseau depuis pas mal de temps et merci encore .

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Les programmes que je t'ai proposé c'est par rapport aux commandes que tu avais dev' ! Le problème vient du fait que la commande DEPLACER, une fois terminée, les objets déplacés sont dé-sélectionnés ! Or avec ton utilisation du (ssget) sur le mode "_Implied", cela ne fonctionne pas car il faut un jeu de sélection initial obligatoirement..
Je ton conseille simplement de ne mettre aucun mode pour le (ssget), autrement-dit, remplace toutes les occurrences

(ssget "_I")

par

(ssget)

Et cela devrait marcher correctement avec le rappel de commande. Cela ne va pas reprendre les anciens objets déplacés initialement mais cela va te demander de sélectionner des objets, donc soit tu sélectionnes de nouveaux objets, soit les mêmes, sinon il te suffit d'utiliser les raccourcis pour les sélections d'objets (cf. ci-dessous pour les deux plus connus) :

"P"   > pour "Précédent" (ou "_P" en anglais)
"D"   > pour "Dernier" (ou "_L" en anglais)

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci. Du coup il n'existe pas de raccourcit pour récupérer tous les derniers objets copié?  Car SSGET "D" récupère uniquement le dernier objet. Et non pas tous les objets résultant de la copie et précédent récupérer les objets sélectionné précédemment. Donc si on le copie a +100 on créé un doublon que l'on recopie a nouveau 

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Je pense que tu n'as pas compris quel était le soucis en précisant le mode "_P" ("_Previous") directement dans le programme... :
Pour qu'il y ait une sélection précédente, il faut bien que la sélection soit définie avant le lancement de la commande n'est-ce pas ? Donc que se passera-t-il à ton avis lors du tout premier lancement de la commande ? Il te faudra sélectionner les objets via la commande SELECT ou bien les avoir utiliser précédemment dans une autre commande pour pouvoir les prendre...Après si tu es prêt à prendre le risque de déplacer des objets non désirés, tu peux tenter cela :

(defun setA (*a*)
  (if *a*
    *a*
    (progn
	  (initget 7 "100")
	  (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :"))
	)
  )
)

(defun c:SetA ()
  (initget 7 "100")
  (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :"))
)

(defun c:C+ (/ ss)
  (if (or (setq ss (ssget "_P"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" (list 0. (setA *a*)))
  )
  (princ)
)

(defun c:C- (/ ss)
  (if (or (setq ss (ssget "_P"))
      (setq ss (ssget))
      )
    (command-s "_.copy" ss "" "_Displacement" (list 0. (- (setA *a*))))
  )
  (princ)
)


(defun c:D+ (/ ss)
  (if (or (setq ss (ssget "_P"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" (list 0. (setA *a*)))
  )
  (princ)
)

(defun c:D- (/ ss)
  (if (or (setq ss (ssget "_P"))
      (setq ss (ssget))
      )
    (command-s "_.move" ss "" "_Displacement" (list 0. (- (setA *a*))))
  )
  (princ)
)

(defun c:+ ()  ;; Se déplace à 100 de+

  (command "-pan" "0,0,0" (strcat "0," (rtos (- (setA *a*))) ",0"))
 (princ)
)

(defun c:- ()  ;; Se déplace à 100 de-
  
  (command "-pan" "0,0,0" (strcat "0," (rtos (setA *a*)) ",0"))
 (princ)
)

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci luna.Bon elle va rester comme tu me l'as donné avec la possibilité de donner l'espacement . Je voulais (en l'utilisant dans n cas différent) l'adapter encore un peu mais en vain. J'apprend de tes commentaires pour les prochaines et j'y bosse. J'ai voulu ajouter en début de chaque commande un (command "scu" "GE" )

 puis en fin de chaque commende un (command "scu" "p")  

Afin de rester en scu objet pendants ma commande mais je n'ai pas trouver où l'insérer pour que la commande continue de fonctionner . 

 

 

 

 

 

 

 

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é