elen29 Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 bonjour a tous,j'ai un soucis urgent à régler et j'ai besoin de vos connaissances. Ce que je souhaite, c'est faire du ménage sur des plans: j'ai donc besoin de supprimer des calques, d'en créer d'autre mais surtout d'en regrouper plusieurs. Voici les étapes que je souhaite établir: Commande 1 : créer un nouveau calque et le rendre courant. Je connais les commandes autocad: Il faut utiliser les commandes « -CALQUE puis ETABLIR et entrer le nom du nouveau calque » Sa c’est OK. Mais j’arrive pas trop à le programmer.Pour commencer à le programmer j’ai pensé à sa : (command « -calque » « e ») Mais je ne sais pas quand il faut que je dise « Entrer le nom du nouveau calque ». Commande 2 : Sélectionner un objet qui devra changer de calque : (princ "\n Choix des objets qui doivent changer de calque...\n")(setq cc1 (ssget)) Commande 3 : Ajouter ce ou ces éléments dans le nouveau calque que nous venons de définir comme courant. J'espère que c'est assez clair et que vous pouvez m'aider à avancer.Merci d'avance Elen29
bseb67 Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Salut elen29, Pour le calque courant utilise plutôt (setvar "clayer" "mon_calque")pour mettre "mon_calque" comme calque courant. La fonction est plus rapidequ'un appel à (command...) Les objets ou entités sous autocad, contiennent des informations sous formede liste dans un codage appelé DXF.(setq ent (car (entsel))) => sélection d'une entité(setq dxf_ent (entget ent)) => récupération des informations DXF Dans dxf_ent tu aura une sous-liste avec l'id 8 : (8 . "calque")qui correspond en fait au nom du calque de l'entité.Donc avec la fonction subst, entmod et entupd tu peux changer le calqueet mettre à jour l'entité. Pour récupérer le calque courant : (getvar "clayer") Si tu as besoin de plus d'informations, n'hésites pas :) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
elen29 Posté(e) le 3 mars 2010 Auteur Posté(e) le 3 mars 2010 j'ai compris la méthode. Je vais essayer de mettre tous sa en forme mais c'est loin d'être gagner!!Je vais surement te demander de m'aider encore lorsque j'aurai commencer le programme, demain quoi!!!Merci beaucoupa+Elen
Tramber Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Je vais répondre à mon tour mais sur d'autres aspects : (command « -calque » « e ») C'est intéressant car on comprends que tu es dans la logique des command (bseb67 a bien raison, on préfèrera régler ce qui peut l'être par des variables, bonne habitude. D'où la necessité de se cultiver et d'en connaitre plein). -calque, c'est le moyen de préparer le code. Je m'explique : tu le tapes en ligne de commande et tu simules ce qui va se passer dans ton programme. -calqueECalque ZozoENTREE (supplémentaire) (un retour à la ligne équivaut à 1 ENTREE)est précisement ce que tu dois taper en mode dessin.Donc cela donne : (command "calque" "e" "Calque Zozo" "" "")(le "-" n'est plus obligatoire) Tant qu'à parler de command : (setq cc1 (ssget)) (command "chprop" cc1 "" "ca" "bla2" "" ) Fonctionne pour ton besoin.CHPROP est une commande particulière qui n'existe qu'en ligne de commande. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 J'ai compris qu'il fallait que je bosse sur les fonctions! Merci les gars!En attendant j'ai essayer en petit truc mais c'est pas très bien.Je galère un peu. (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) ) Je sais pas si sa vaut quelque chose. Le problème c'est que c'est trop simple.Mais surtout, je ne peut pas créer un programme pour tous les calques!Il me faut donc une façon pour créer un nouveau calque que je peut renommé directement et ce avant d'aller sélectionner mes objets. Le programme si dessus n'est pas adapter car il faut déjà avoir les calques et des objets dedans.Comment puis-je faire pour créer un programme avec tous sa sachant que j'ai vraiment du mal à commencer. Merci d'avanceElen
FRAXA Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 les commandes laymrg ou copytolayer ne suffiraient-elles pas? HPZ400 Workstation Intel Xeon W3550 3.07 GHz 6 Go ram QUADRO FX 1800
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 J'ai pas compris, peut tu m'expliquer ce que tu veut dire.merci
FRAXA Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Si tu veux transférer un objet vers un autre calque, il existe la commande laymch des express tools.Tu lances la commande, tu sélectionnes tes objets ensuite:- soit tu choisis un calque existant,- soit tu as la possibilité de le créer en choisissant l'option nommer. HPZ400 Workstation Intel Xeon W3550 3.07 GHz 6 Go ram QUADRO FX 1800
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Salut, Donc tu voudrais :- récupérer un nom de claque (entrée au clavier) -> (getstring ...)- récupérer un jeu de sélection -> (ssget)- transférer les objets du jeu de sélection sur ce calque -> (command "_chprop" ...) avant de faire ce transfert, il faut s'assurer:- que le nom de calque est valide -> (snvalid ...)- que le calque existe déjà -> (tblsearch ...)- sinon, le créer -> (command "_layer" ...)- que le jeu de sélection n'est pas vide (defun c:ss2lay (/ name ss) ;; récupérer un nom de calque (setq name (getstring "\nEntrez le nom du calque: ")) ; si le nom est valide... (if (snvalid name) (progn ;; si le calque n'existe pas (if (not (tblsearch "LAYER" name)) ;; ...on le crée (command "_layer" "_new" name "") ) (princ (strcat "\nSélectionnez les objet à tranférer sur le calque \"" name "\"" ) ) ;; si l'utilisateur sélectionne des objets... (if (setq ss (ssget)) ;; ...on les transfère sur le calque (command "_chprop" ss "" "_layer" name "") ) ) ;; ... le nom spécifié n'est pas valide (princ "\nNom de calque non valide") ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 c'est ça! nickel! Par contre, lorsque je créée mon calque je veux directement lui associer une couleur. Je pense qu'il faut le définir avant si j'ai compris quelque chose.Donc juste après qu'on demande le nom du calque?! (setq col (getvar "\nEntrez numéro de la couleur du calque: ")) Et après mettre quelque chose du genre (command "_layer" "_new" name "") (command "_layer" "co" col "") Mais comme d'habitude c'est pas sa!Une autre idée SVP pour pouvoir la terminer enfin ;)
bseb67 Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 la fonction "getvar" permet de récupérer la valeur d'une variable autocad. Et non une saisie au clavier. Pour la couleur, si tu utilises le codage en entier tu peux faire (getint "\nCouleur du calque : ")et donc (setq couleur (getint "\Couleur du calque : ")) (command "_layer" "co" couleur mon_calque "") [Edité le 4/3/2010 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 en faite je viens de réussir un truc: (defun c:ccalque () (setq nomcal (getstring "\nEntrez le nom du calque: ")) ;; récupérer un nom de calque (setq colcal (getstring "\nEntrez la couleur du calque: ")) (if (snvalid nomcal) ; si le nom est valide... (progn (if (not (tblsearch "LAYER" nomcal)) ;; si le calque n'existe pas (command "_layer" "_new" nomcal "") ;; ...on le crée (command "_layer" nomcal "co" colcal "") ) (princ (strcat "\nSélectionnez les objets à tranférer dans le calque \"" nomcal "\"") ) (if (setq propent (ssget)) ;; si l'utilisateur sélectionne des objets... (command "_chprop" propent "" "_layer" nomcal "co" colcal "") ;; ...on les transfère sur le calque ) ) (princ "\nNom de calque non valide") ;; ... le nom spécifié n'est pas valide ) (princ) ) Cela me permet de donner le nom d'une couleur (ex: rouge)mais d'une part ca ne marche pas pour tout les nom (ex: vert) D'autre part, la couleur de l'objet change mais dans la liste des calques elle reste comme avant!!!comment faut-il que je procède?merci d'avance Elen
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 c'est sur que sa marche mieux mais pas encore comme il faut.Je sais vraiment plus comment faire!Voilà où j'en suis: (defun c:ccalque () (setq nomcal (getstring "\nEntrez le nom du calque: ")) ;; récupérer un nom de calque (setq colcal (getint "\nEntrez la couleur du calque: ")) (if (snvalid nomcal) ; si le nom est valide... (progn (if (not (tblsearch "LAYER" nomcal)) ;; si le calque n'existe pas (command "_layer" "_new" nomcal "") ;; ...on le crée (command "_layer" nomcal "co" colcal "") ) (princ (strcat "\nSélectionnez les objets à tranférer dans le calque \"" nomcal "\"") ) (if (setq propent (ssget)) ;; si l'utilisateur sélectionne des objets... (command "_chprop" propent "" "_layer" nomcal "co" colcal "") ;; ...on les transfère sur le calque ) ) (princ "\nNom de calque non valide") ;; ... le nom spécifié n'est pas valide ) (princ) )
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Tant que tu utilise la fonction command, les arguments sont les mêmes que les options que tu entres en ligne de commande (les commandes et options en anglais précédé d'un underscore sont préférables pour des raisons de compatibilité). Tu peux donc tester dans AutoCAD en ligne de commande : Commande: _-layer Calque courant: "0"Entrez une option [?/Etablir/CHoisir/Nouv/ACtif/INactif/COuleur/TLigne/EPaisseurl/MAtériau/Tracé/Geler/Libérer/Verrouiller/Déverrouiller/étAt]: _newEntrez la liste des noms des nouveaux calques: totoEntrez une option [?/Etablir/CHoisir/Nouv/ACtif/INactif/COuleur/TLigne/EPaisseurl/MAtériau/Tracé/Geler/Libérer/Verrouiller/Déverrouiller/étAt]: _colorNouvelle couleur [coUleursvraies/CArnet de couleurs] : 1Entrez la liste de noms des calques pour la couleur 1 (rouge) : totoEntrez une option [?/Etablir/CHoisir/Nouv/ACtif/INactif/COuleur/TLigne/EPaisseurl/MAtériau/Tracé/Geler/Libérer/Verrouiller/Déverrouiller/étAt]: L'expression LISP sera donc :(command "_layer" "_new" name "_color" col name "") Quand tu seras plus aguerrie, tu utiliseras moins la fonction command et tu créeras les objets AutoCAD (graphiques ou non) avec entmake en leur attribuant directement leur propriétés :(entmake (list '(0 . "LAYER") ; type d'objet '(100 . "AcDbSymbolTableRecord") ; classe '(100 . "AcDbLayerTableRecord") ; sous classe (cons 2 name) ; nom '(70 . 0) ; état (cons 62 col) ; couleur '(6 . "Continuous") ; type de ligne ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Dans ton dernier code tu fais : (if (not (tblsearch "LAYER" nomcal)) ;; si le calque n'existe pas (command "_layer" "_new" nomcal "") ;; ...on le crée (command "_layer" nomcal "co" colcal "") ) La fonction if n'accepte une seule expression then (si la condition est remplie) et, optionnellement une seule expression else (si la condition n'est pas remplie). Dans ton code, si le claque n'existe pas (condition), il est créé, sinon sa couleur est changée.Pour passer plusieurs expressions, on les regroupe à l'intérieur d'une expression progn :(if (not (tblsearch "LAYER" nomcal)) ;; si le calque n'existe pas (progn (command "_layer" "_new" nomcal "") ;; ...on le crée (command "_layer" nomcal "co" colcal "") ) )Mais la fonction command permet la succession des options et/ou des commandes dans la même expression (voir message précédent). Pour la sélection des couleurs, regarde la fonction acad_colordlg PS : mets ton code entre les balises code (le dièse #) plutôt que quote (le phylactère) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 Merci beaucoup sa marche.Vous êtes trop balèze!!! ;) Par contre il faut que je m'y mette pour le "entmake" c'est sa?!! J'ai déjà du mal à comprendre la programmation donc sa ne vas pas être pour tout de suite. C'est le début c'est pour sa!! Merci à tous vous m'avez vraiment sorti de la m.....de!!! A bientôt tous le mondeElen :)
Tramber Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Merci à tous vous m'avez vraiment sorti de la m.....de!!! Comme ca t'auras la moyenne :cool: Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
elen29 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 Comme ca t'auras la moyenne C'est plus compliquer mais dans un certain sens oui (Je préparer mon projet de mémoire) A très vite!!!!
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