Aller au contenu

changer le calque d\'un ou de plusieurs objets


Messages recommandés

Posté(e)

bonjour à tous,

 

je suis en train de commencer la programmation sur AutoCAD Map3d 2010.

 

Le but du programme: sélectionner plusieurs objets de calques différents et les mettre dans un unique calque.

Pour l'instant et au vue de mes compétences, j'ai créer les nouveaux calques dans lesquelles les objets doivent s'afficher.

Plus tard, j'aimerai programmer la création des calques.

Mais chaque chose en son temps!

 

Pour l'instant, j'ai réussit à programmer la sélection de mes objets.

Maintenant je cherche la variable qui me permette d'aller chercher un calque dans le gestionnaire des calques.

 

Voici ce que j'ai fais pour l'instant si cela peut vous guider:

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; ce lisp servira à changer de calques à un ou plusieurs objets du dessin et de les mettre dans un calque unique ;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

(defun c:ccbassin () ; cc=changer les calques dans celui bassin

(princ "\n Choix des objets qui doivent changer de calque...\n") ; PRINC: imprime une expression sur la ligne de commande

 

;Choix des objets, l'ensemble de sélection sera ccbassin

(setq ccbassin (ssget)) ;SSGET: pour sélectionner des objets et renvoie un jeu de sélection.

(if ccbassin ;si la sélection a eu lieu alors nous continuons

(progn

(assoc (

 

j'essaie d'avancer mais si vous avez une petite idée ce serai super sympas.

 

Merci

Elen29

Posté(e)

Bonjour,

 

il y a 3 manières de faire :

 

Pour commencer, la plus simple avec command

(command "_chprop" ccbassin "" "_layer" NOMCALQUE "")

 

Une autre façon est d'utiliser les codes dxf de chaque objet du jeu de sélection (utilisation d'une boucle while et des fonctions assoc, subst, cons entget et entmod)

 

Une autre façon est d'utiliser Vlisp. Comme avant, il faut faire une boucle while et changer le calque de chaque objet du jeu de sélection en utilisant vla-put-layer

 

Alors, fait comme tout le monde, commence par le plus simple.

 

Amicalement

Vincent

 

Posté(e)

Merci pour ta réponse mais lorsque que j'exécute mon programme, il me dit que je n'est pas assez de variables.

Il me manque une fonction avant (command "_chprop" ccbassin "" "_layer" NOMCALQUE "")

mais je n'arrive pas à la trouver et plus j'essaie moins sa va!! La cata!!

Si quelqu'un à des idées merci de me donner un coup de pouce.

 

Mon programme:

 

(defun c:ccbassin ()

(princ "\n Choix des objets qui doivent changer de calque...\n")

(setq ccb1 (ssget))

(if ccb1

(progn

(setq e (entsel "Choix d'un élément du calque BASSIN"))

(command "_chprop" ccbassin "" "_layer" BASSIN "")

)

)

(princ)

)

 

Merci d'avance

Elen

Posté(e)

Bonjour,

 

Un exemple par pointage pour la destination:

 

(defun c:to_layer ( / js lay2 ent n)
 (princ "\nChoisir les objets à changer de calque: ")
 (setq js (ssget))
 (cond
   (js
     (while (null (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))
     (setq lay2 (assoc 8 (entget (car lay2))) n 0)
     (repeat (sslength js)
       (setq ent (entget (ssname js n)))
       (entmod (subst lay2 (assoc 8 ent) ent))
       (setq n (1+ n))
     )
     (princ (strcat "\n" (itoa n) " entité(s) sont maintenant sur le calque " (cdr lay2)))
   )
 )
 (prin1)
)

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci beaucoup bonuscad.

 

J'aimerai tout de même avoir des explication pour comprendre et avancer un peu.

Tout d'abord:

(while (null (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

 

en faite je ne vois pas à quoi sert la fonction "null".

 

De plus, pourquoi on doit changer de "nom": js / lay2 / ent / n ?(enfin je ne sait pas comment on appel sa).

 

(js

 

A quoi sa sert de mettre " ( js " sans rien après.

 

 

Bon désolé pour les questions con que je pose mais j'essaie de vraiment bien comprendre toutes les étapes de ton programme.

 

Merci encore

Elen

 

Posté(e)

Merci beaucoup bonuscad.

 

J'aimerai tout de même avoir des explication pour comprendre et avancer un peu.

Tout d'abord:

(while (null (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

 

en faite je ne vois pas à quoi sert la fonction "null".

 

De plus, pourquoi on doit changer de "nom": js / lay2 / ent / n ?(enfin je ne sait pas comment on appel sa).

 

(js

 

A quoi sa sert de mettre " ( js " sans rien après.

 

 

Bon désolé pour les questions con que je pose mais j'essaie de vraiment bien comprendre toutes les étapes de ton programme.

 

Merci encore

Elen

 

Posté(e)

Salut,

 

(while (null (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

null évalue si l'expression qui lui est passée comme argument est nil (vide)

Si aucune entitté n'est sélectionnée (l'utilisateur clique dans le vide, par exemple), (entsel ...) retourne nil, donc lay2 est nil et (null ...) retourne T : la boucle continue.

Dès qu'une entité est sélectionnée, lay2 n'est plus nil, (null ...) retourne nil et on sort de la boucle.

Cette méthode garantit qu'on avancera pas plus loin dans l'exécution du code tant qu'une entité n'aura pas été sélectionnée.

On aurait auss pu l'écrire :

(while (not (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

ou :

(while (eq nil (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

 

A quoi sa sert de mettre " ( js " sans rien après.

En LISP, une condition utilisée avec while, if, cond, ... n'est pas obligée de retourner Vrai ou Faux (T ou nil).

Il suffit que la condition soit non nil (autre chose que nil) pour que la condition soit considérée comme vraie.

(cond (js (...))) ou (if js (...)) exécuteront l'expression (...) si js n'est pas nil atrement dit si le jeu de sélection n'est pas vide.

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

Posté(e)

(defun c:ccbassin ()

(princ "\n Choix des objets qui doivent changer de calque...\n")

(setq ccb1 (ssget))

(if ccb1

(progn

(setq e (entsel "Choix d'un élément du calque BASSIN"))

(command "_chprop" ccbassin "" "_layer" BASSIN "")

)

)

(princ)

)

 

dans le if, le jeu de sélection s'appelle ccb1, puis plus loin dans (command ...) il s'appelle ccbassin. Forcément ça marche pas bien.

Ensuite, la variable BASSIN "tombe du ciel" : elle n'est initialisée nulle part.

 

Regarde ce que te renvoie entsel (il faudrait aussi prévoir un \n en début de texte pour que le message aille à la ligne)

(setq e (entsel "\nChoix d'un élément du calque BASSIN"))

renvoie

( (91.1812 306.832 -1.43493e-042))

 

donc dans la variable e; il y a une liste dont le premier élément est le nom de l'entité sélectionnée et le second élément les coordonnées du point cliqué. Ce qui nous intéresse, c'est le premier élément de la liste, qu'on obtient avec la fonction car.

 

(setq e (car (entsel "\nChoix d'un élément du calque BASSIN")))

renvoie

 

Maintenant, dans e, il y a l'adresse de l'entité. Pour voir ce qu'elle a dans le ventre, il faut aller regarder ce qu'il y a à cette adresse avec la fonction entget

 

(setq a (entget e))

renvoie

((-1 . ) (0 . "LINE") (330 . )

(5 . "6E7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "BT-CULEE_CP")

(100 . "AcDbLine") (10 55.8153 0.10873 -6.46235e-027) (11 47.2494 1.46543

-6.46235e-027) (210 0.0 0.0 1.0))

 

qui nous renvoie une liste qui contient plein d'informations intéressantes sous la forme d'une liste, où chaque sous-liste commence par une clé, qu'on appelle le code dxf (voir dans l'aide sous ce sujet). La clé 8 correspond au calque : c'est celle là qui nous intéresse et on peut rechercher l'entrée correspondant à cette clé avec assoc.

 

(assoc 8 a)

renvoie

(8 . "BT-CULEE_CP")

 

On y est presque, puisqu'on vient d'obtenir une paire pointée dont le 2ème élément est le nom du calque. Il suffit de pêcher ce 2ème élément dans la liste et le mettre dans une variable, par exemple BASSIN.

 

(setq BASSIN (cdr (assoc 8 a)))

met

"BT-CULEE_CP" dans la variable BASSIN

 

Ce n'est que maintenant que tu peux lancer la ligne (command "_chprop" etc...)

 

(defun c:ccbassin ()

(princ "\n Choix des objets qui doivent changer de calque...\n")

(setq ccb1 (ssget))

(if ccb1

(progn

(setq e (car (entsel "\nChoix d'un élément du calque BASSIN")))

(setq a (entget e))

(setq BASSIN (cdr (assoc 8 a)))

(command "_chprop" ccb1 "" "_layer" BASSIN "")

)

)

(princ)

)

 

Il faudrait encore vérifier, comme le fait Bonuscad, si entsel s'est bien exécuté, d'où le (while (null...)) qui fait recommencer entsel tant qu'on n'a pas cliqué sur une entité. De plus, il utilise la 2ème méthode que je décrivais plus haut. Elle est moins simple, mais plus rapide.

 

Bon courage.

Amicalement

Vincent

 

PS :

Bon désolé pour les questions con que je pose

Il n'y a pas de question con. Les réponses peuvent l'être, mais jamais les questions.

 

 

[Edité le 5/2/2010 par CADZEB]

Posté(e)

(setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))

 

si la sélection fonctionne bien j'aurais en retour un truc de ce style:

(< Nom d'entité: 7ecd82f0 > (333.275 1635.4 0.0)) qui est une liste contenant le nom de l'entité et le point de sélection.

 

Si je rate ma sélection, que se passe t-il? pour lay2 (un nom de variable choisi suivant mon goût) j'aurai en retour: nil

 

Cela ne convient pas , je te laisse une chance pour recommencer ta sélection afin que le programme puisse continuer.

 

Donc: TANT QUE la sélection est NULLE, ALORS faire sélection, ce qui serait la traduction de la boucle (while)

 

Pour COND l'extrait de l'aide du développeur, (j'ai fais l'effort de te traduire la description)

 

(cond (test1 résultat1 ....) ...)

 

La fonction cond accepte un nombre indéfini de liste comme arguments.

Elle évalue le premier élément de chaque liste (dans l'ordre indiqué) jusqu'à ce que l'un de ces éléments renvoie une autre valeur autre que nil.

Ensuite, elle évalue les expression envoyées après le test qui a réussi et renvoie la valeur de la dernière expression de la sous-liste.

Si cette sous-liste contient une seule expression (c'est à dire, si l'argument résultat n'est pas défini), la valeur de l'expression test est renvoyée.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci a vous tous.

je m'y penche ce weekend et lundi je vous fais part de ma solution (en espérant qu'elle soit bonne!!)

 

C'est le premier programme que j'essaie de réaliser et je vois qu'il me manque beaucoup de logique.

Mais bon ca viendra!!

 

Quand on veux on peut!!

 

Bon weekend à tous et à lundi pour la suite des aventures...

 

Encore merci

 

Elen

 

  • 4 semaines après...
Posté(e)

bonjour a tous

 

A la suite de cette conversation, j'ai essayé de retravailler le lisp:

 

 

(defun c:to_layer ( / js lay2 ent n)

 

(princ "\nChoisir les objets à changer de calque: ")

 

(setq js (ssget))

 

(cond

 

(js

 

(while (null (setq lay2 (entsel "\nChoix de l'entité pour calque de destination: "))))

 

(setq lay2 (assoc 8 (entget (car lay2))) n 0)

 

(repeat (sslength js)

 

(setq ent (entget (ssname js n)))

 

(entmod (subst lay2 (assoc 8 ent) ent))

 

(setq n (1+ n))

 

)

 

(princ (strcat "\n" (itoa n) " entité(s) sont maintenant sur le calque " (cdr lay2)))

 

)

 

)

 

(prin1)

 

)

 

 

je me demandais maintenant comment est- ce que je pourrais créer un nouveau calque et mettre le ou les éléments sélectionnés à l'intérieur au lieu de

Choix de l'entité pour calque de destination

 

Je sais que pour le faire la commande autocad c'est:

"-calque" puis "etablir" et on écrit le nom du nouveau calque qui deviendra courant.

 

Le problème, c'est que je n'arrive pas l'écrire sous lisp puis à sélectionner un élément qui ira directement dedans.

 

Je ne sais pas si c'est clair mais j'ai vraiment besoin d'un coup de main car je rame!!!

 

Merci d'avance

Elen

 

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é