Matt666 Posté(e) le 13 décembre 2007 Posté(e) le 13 décembre 2007 Voici un challenge pour débutants. Ici, les habitués du lisp peuvent répondre en 10 secondes... Mais là n'est pas le but de ce challenge. Pour l'instant la plupart des challenges proposés sont relevés par les habitués et qq débutants. Personne ne se lance, et c'est pourtant le but de ces challenges ! Donc voilà. test avec un challenge simple. Le but est de progresser donc n'hésitez pas !Voici donc : Créer une routine qui affiche le nom du calque d'une entité sélectionnée. Bon pour l'instant on se contente de faire une routine sans argument. Voilà. PS : Lovecraft, tu comprendras qu'il n'est pas nécessaire pour toi de répondre à ce challenge, tu n'est pas un débutant ! :) Tu peux par contre te pencher sur une routine avec argument ! Voilà ! Bon courage. "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 13 décembre 2007 Posté(e) le 13 décembre 2007 Merci de penser à nous les nuls...j'ai pensé qu'en passant par la commande _Laymcur puis "getvar clayer" c'était de la gruge ... alors je veux bien être ridicule et j'ai commencé un trucgenre: (defun c:calq()(setq ent1 (nentsel "entité"))(setq ent2 (entget (ent1)))(setq calq1 (cdr (assoc 8 ent2)))(princ calq1)) mais ça marche pas...(à cause de entget?)suis-je loin du but?
(gile) Posté(e) le 13 décembre 2007 Posté(e) le 13 décembre 2007 Salut, Je te conseilles d'utiliser l'éditeur Visual LISP.Dans la console, tu peux évaluer toutes les expressions de ta routine, ça devrait t'aider à trouver ton erreur Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 14 décembre 2007 Auteur Posté(e) le 14 décembre 2007 Salut !Super, un nouveau !!! :D Merci de penser à nous les nuls...<acronym class=dict title= nan, les débutants. Et on est tous passé par là. :P alors je veux bien être ridicule et j'ai commencé un truc genre:Ce n'est pas ridicule, au contraire... Ca commence bien, en tout cas ! Tu as presque résolu le challenge, il ne te manque pas grand chose ! Tout d'abord, je te conseillerai d'utiliser entsel plutot que nentsel. Nentsel permet de retourner le nom d'une entité qui est dans un bloc. Ici, on veut juste connaitre le nom du calque d'une entité, c'est tout. Mais ce n'est pas ça qui fera fonctionner ta routine !(setq ent1 (entsel "Cliquer sur une entité : "))Essie de copier ce bout de code dans la ligne de commande, et valide là. Si tu cliques sur une entité, tu auras ce type de réponse :( < Entity name: bf93790 > (5096.08 1340.90 0.000000))Ensuite tu enchaînes avec un entget sur ent1 pour avoir les codes dxf associés. Entget attend un nom d'entité à développer. Mais ta variable ent1 est une liste avec un nom d'entité et les coordonnées d'un point. Voici ton erreur. Il faut arriver à donner juste le nom d'entité à entget. Voilà !Adtal !Matt. [Edité le 3/1/2008 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 14 décembre 2007 Posté(e) le 14 décembre 2007 Merci pour les conseils: (defun c:calq()(setq ent1 (entsel "entité"))(setq ent2 (entget (car ent1)))(setq calq1 (cdr (assoc 8 ent2)))(princ calq1)) Pour continuer à faire du social, ou puis je trouver une liste des codes dxf associéet notament pour les attributs de blocs
Matt666 Posté(e) le 14 décembre 2007 Auteur Posté(e) le 14 décembre 2007 ou puis je trouver une liste des codes dxf associéTu peux regarder ici... notament pour les attributs de blocsHoulà.... Extraire les informations des attributs, c'est pas évident !!! Avant de se lancer là dedans, ta routine est finie, mais elle n'est ni concise ni rapide. C'est important dans un développement. Tu peux d'abord regrouper tous tes setq en un seul :(setq ent1 (entsel "entité") ent2 (entget (car ent1)) calq1 (cdr (assoc 8 ent2)) ) (princ calq1)De plus tu n'as pas besoin du princ. Le dernier travail de ta routine est de mettre le nom du calque dans la variable calq1. elle retrournera donc la valeur de la dernière opération. Pour finir, tu peux faire encore plus concis...En compilant les setq... (cdr (assoc 8 (entget (car (entsel)))))Si tu copies ce code dans la ligne de commande et entrée, tu verras que cela fait le même travail que ta routine. Bon maintenant, tu veux retrouver les codes dxf des attributs de blocs. Je t'ai dit ça au début :Nentsel permet de retourner le nom d'une entité qui est dans un bloc. Donc essaie de trouver les codes dxf propres à un attribut avec cette fonction, en cliquant sur un attribut, par exemple... "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 14 décembre 2007 Posté(e) le 14 décembre 2007 effectivement (entget (car (nentsel))) marche mais il faut sélectionner directement l'attributquid si celui ci est masquéEst ce possible en sélectionnant le bloc?Au niveau de l'extraction des attributs y a t il une différence entre blocs à attributs et blocs dynamiques? Si ça continu je vais ma mettre au VBA
Bred Posté(e) le 14 décembre 2007 Posté(e) le 14 décembre 2007 Salut,(entget (car (nentsel)))marche mais il faut sélectionner directement l'attributEt non... car alors tu trouves la calques sur lequel se trouve l'attribut, qui peut-être différent du bloc qui le contient (mais c'est vrais que tu réponds tout de même au sujet). (setq ent1 (entsel "entité"))(setq ent2 (entget (car ent1)))pour rester clair, essaye d'appeler tes variables du nom de ce quel doivent contenir.Ex :(setq ent (entsel "entité")) (setq dxf-ent (entget (car ent))) Pour finir, tu peux faire encore plus concis...En compilant les setq... (cdr (assoc 8 (entget (car (entsel)))))Attention !Si tu ne selectionne rien, le fait de faire ceci te retourne une erreur !(pour les autres codes précédents aussi d'ailleur) Il faut tester la selection... ou empécher une selection nulle...C'est la suite de l'exo j'imagine... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Matt666 Posté(e) le 14 décembre 2007 Auteur Posté(e) le 14 décembre 2007 Salut bred !Tu n'as pas du voir ceciPour continuer à faire du social, ou puis je trouver une liste des codes dxf associé et notament pour les attributs de blocs Le sujet a quelque peu dérivé...pascal19, à la limite, on ouvrira un autre post pour les attributs... Il y a beaucoup à dire dessus... Comme disait Bred, Si tu ne selectionne rien, le fait de faire ceci te retourne une erreur !Il faut tester la selection... ou empécher une selection nulle...C'est la suite de l'exo j'imagine... Voilà... Bon courage ! "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 14 décembre 2007 Posté(e) le 14 décembre 2007 OK JE VAIS Y PENSERmais en dehors de m'amuser à faire du LISPj'ai un métier...et là en + c'est le week end... a+
Matt666 Posté(e) le 14 décembre 2007 Auteur Posté(e) le 14 décembre 2007 j'ai un métier...Oui, comme tout le monde ici, ou à peu près !! Soit dit en passant, ce post n'est pas exclusif à pasall9.. Si d'autres veulent se lancer, faut pas hésiter ! A bientot. Matt "Chacun compte pour un, et nul ne compte pour plus d'un."
(gile) Posté(e) le 14 décembre 2007 Posté(e) le 14 décembre 2007 ou puis je trouver une liste des codes dxf associé Dans l'aide dAutoCAD (et en français !)Aide >> Ressources supplémentairs >> Aide aux développeurs >> Reference DXF >> Section ENTITIES Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Matt666 Posté(e) le 17 décembre 2007 Auteur Posté(e) le 17 décembre 2007 Bon bah comme prévu les challenges débutants ne marchent vraiment pas fort... "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 si si moi ça m'interresse...C'est vrai que je me sens un peu seulc'est vrai aussi que je suis pas un rapide n'etant pas programmeur mais utilisant souvent le LISP sans personne pour m'apprendre (hormis manuel de progrmmation autocad 12)sans que les bénéfices des programmmes soient reconnus dans l'entreprise,ce forum en général et ce sujet en particulier m'apporte beaucoup. Merci à tous les pro du lisp qui y contribue...
Matt666 Posté(e) le 17 décembre 2007 Auteur Posté(e) le 17 décembre 2007 Tu n'étais pas visé, pascal :D ! Au contraire... "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 (defun c:calq()(setq ent1 nil)(while (= ent1 nil) (setq ent1 (entsel "entité?")) )(setq calq1 (cdr (assoc 8 (entget (car ent1)))))) j'ai bon?
Bred Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Super ! :D pour le principe, petites astuces : - Au lieu de mettre ent1 à nil au début, tu "déclarares tes variables locales" afin que le lisp les mettes à nil pour ce code. comme cela :(defun c:calq ([b]/ ent1[/b])(surtout ne pas oublier le " / ") - au lieu d'écrire (while (= ent1 nil)...tu pourrais écrire :(while (not ent1).... - et enfin, pour a lisibité dans la ligne de commande en cas de selection vide, tu fais un "saut à la ligne" à l'appel de l'invite de entsel avec un "\n"(setq ent1 (entsel "\nentité?")) Je pense que maintenant, tu peux mettre le résultat dans une petite boite de dialogue où serait écrit Calque : "Mon_calque"Regarde la fonction "alert" et "strcat".... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 j'ai bon? Ça marche ? Alors oui tu as bon ! C'est l'essentiel, le reste n'est qu'une question de style excepté, à mon avis, ce qui concerne la déclaration des variables. Alors, juste pour compléter ce que dit Bred, le copier/coller d'un message donné ailleurs : (defun fonction1 (arg1 arg2 / var1 var2) ...) arg1 et arg2 sont les arguments (non optionnels) de fonction1, ils doivent être spécifiés conformément aux besoin de fonction1 lors de l'appel de fonction1. (fonction1 arg1) -> ; erreur: nombre d'arguments insuffisant(fonction1 arg1 arg2) -> ; erreur: type d'argument incorrect: ... Si arg1 ou arg2 ne sont pas conformes au type d'argument nécéssaire à fonction1 var1 et var2 sont des variables définies dans fonction1 (avec setq par exemple). Si elle sont déclarées, comme dans l'exemple, on les appelle : variables locales.La valeur qui leur est attribuée dans fonction1 ne le sera que pendant l'exécution de fonction1, elles reprendront ensuite la valeur qu'elles avaient avant l'appel à fonction1 (nil ou autre).Si au sein de fonction1, var3 est definie avec setq, et qu'elle n'a pas été déclarée, on l'appelle variable globale, elle conserve sa valeur pendant toute la session du dessin. De plus amples expilcations, en anglais, dans Aide aux dévellopeurs -> AutoLISP Developer's Guide ->Using the AutoLISP Language -> AutoLISP Basics -> Symbol and Function Handling -> Local Variables in Functions -> Local Variables versus Global Variableset, en français dans le Didactitiel AutoLISP -> Utilisation des outils de débogage Visual LISP -> Différenciation entre les variables locales et les variables globales. ou encore essayer cette séquence à la ligne de commande : (defun test1 () (setq a 2) (print a) (princ))(defun test2 (/ a) (setq a 3) (print a) (princ)) (setq a 1) -> 1!a -> 1(test1) -> 2!a -> 2(test2) -> 3!a -> 2 Où apparaît l'intérêt de déclarer les variables locales et occasionellement de conserver certaines variables globales pour pouvoir rappeler leurs valeurs entre plusieurs lancements d'une routine (dernière valeur entrée par l'utilisateur par exemple). Dans ce cas il est prudent de donner des noms long et peu courant à ces variables pour éviter les conflits, il est aussi une convention que les noms commencent et finissent par une astérisque ex : *nom_de_la_variable_globale* Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
speedy Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Bonjour à tousC'est trés bien ce que vous faites, il en faut pour tout le monde, c'est un bon début de code qui peut être adapté pour afficher la couleur, angle ......il suffit de trouver l'index dxf qu'il faut. Merci à Matt66 et les maitres du Lisp.....de nous aider dans ce chemin..super de mettre des commentaires, ça devient plus clair... @+ Michel a
pascal19 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Merci les gars ,je m'étais tjs demandé ce que c'étais ces trucs entre parenthèses aprés defun... c'est quoi la suite de l'exo?
Bred Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 Salut,c'est quoi la suite de l'exo?Tu peux déjà faire ce que je soumet dans ma réponse 16. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
pascal19 Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 voila: (defun c:calq(/ ent1)(while (not ent1) (setq ent1 (entsel "\nentité?")))(setq calq1 (cdr (assoc 8 (entget (car ent1)))))(alert (strcat "le calque est " calq1)))
Matt666 Posté(e) le 18 décembre 2007 Auteur Posté(e) le 18 décembre 2007 Bravo ! Maintenant, il faudrait mettre ce nom de calque en courant, c'est à dire comme calque actif.... [Edité le 18/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
pascal19 Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 (defun c:calq(/ ent1)(while (not ent1) (setq ent1 (entsel "\nentité?")))(setq calq1 (cdr (assoc 8 (entget (car ent1)))));(alert (strcat "le calque est " calq1)) (setvar "clayer" calq1) ) oh! on a refait la commande "_Laymcur"...là je suis chaud...
Matt666 Posté(e) le 19 décembre 2007 Auteur Posté(e) le 19 décembre 2007 Voilà ! Bravo !Certaines commandes autocad sont assez simples à reproduire... :cool: Maintenant, imaginons que l'entité sélectionnée soit un bloc, il faudrait savvoir si ce bloc contient des attributs ou pas.. Une routine du genre : Commande : Cliquer sur un bloc : Commande : Ce bloc contient des attributs. ;) [Edité le 19/12/2007 par Matt666] "Chacun compte pour un, et nul ne compte pour plus d'un."
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