Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 13/10/2011 dans Messages

  1. Salut, ;; ;; https://gilecad.azurewebsites.net/Lisp.aspx ;; ;; https://gilecad.azurewebsites.net/LISP/Dialog.lsp ;; Pour faire comme un de mes mentor, je regroupe ici des LISP éparpillés un peu partout. Pour beaucoup, ces LISP ont été publiés sur le site, certains étaient des réponses à des demandes, beaucoup y ont évolué à la suite de tests et de suggestions, merci à tous ceux qui ont participé. Pour l'utilisation des LISP (chargement, lancement) voir cette page Certains semblent avoir des soucis pour décompresser les fichiers ZIP, je leur recommande d'utiliser : 7-zip (gratuit). 3dPolyFillet : "Raccord" sur les polylignes 3D (arc constitué des segments jointifis). commande : 3dpolyfillet Arc2Seg : Transforme des arcs et cercles en polygones et les arcs des polylignes en successions de segments droits. Les Xdatas (ainsi que les données d'objet MAP) sont conservées. commande : arc2seg Ac_ob&Rac_ob : ACcroche ou RACcorde l'extémité des objets (ligne, polyligne spline) située en deçà d'une distances spécifiée au centre, point d'insertion, ou point du cercle bloc point sélectionné. commandes : ac_ob (accrocher) rac_ob (raccorder) lien : Routine pour accrocher les fils AddVtx&DelVtx : Ajoute ou supprime des sommets à une polyligne (lw, 2D ou 3D). commandes : addvtx (ajouter) delvtx (supprimer) liens : Ajouter un sommet sur une polyligne, Enlever des sommets sur une Lwpolyligne Anse de panier : crée une polyligne en anse de panier. commande : adp Arcedit : Permet de changer les angle de départ et de fin d'un arc (cercle ou ellipse) ou de transformer un cercle en arc. commande : arcedit Arcs_spec : Crée des arcs d'après le périmètre de l'arc. commandes : arc_dcl (départ, centre, longueur), arc_cdl (centre, départ, longueur), arc_del (départ, fin, longueur) Bbox : Crée une polyligne ou polyligne 3D figurant la "bounding box" de l'objet par rapport au SCU courant. commande : bbox lien : Boundingbox Bissectrice : Crée une ligne sur la bissectrice de deux segments rectilignes. commande : bissectrice Cadre&Masque : Crée un cadre ou un masque sur les texte et mtextes sélectionnés. commandes : ct pour un cadre mt pour un masque lien : Cadre/Masque pour textes et mtextes CleanPoly : Supprime les sommets superposé d'une polyligne. commande : clean_poly lien : Poignées superposées Curve2Pipe : Extrude un anneau sur les chemin spécifés. commande : curve2pipe ou c2p Dist : Retourne à la ligne de commande la distance entre 2 points ou celle de l'objet sélectionné (plus la longueur du segment pour les polylignes). commande : dist lien : Un DISTANCE amélioré Diviser_Mesurer_3D : Comme les commandes diviser et mesurer avec des options supplémentaires. commande : div3d (diviser) et mes3d (mesurer) lien : Commande Diviser... Edit_bloc : (version 3.5) Modifie les propriétes des entités composants les blocs spécifiés. Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "Lisez moi". commandes : edit_bloc et edit_bloc_rep (tous les DWG d'un répertoire) liens : Modifier des blocs ; Modifier des blocs version 2 ; Edit_bloc version 3 : Sélectionner le contenu de calques "non purgeables" Fusion : Crée une polyligne sur le contour de chaque gorupe de polylignes fermées et contiguës sélectionnées. commande : fusion ou upl lien : Fusion de plusieurs polylignes, Polyligne englobante. Gileselscu : Active la fenêtre de sélection parallèle au SCU courant pour les commandes : copier, déplacer, échelle, effacer, miroir, rotation et 3drotation. commande : gileselscu lien : Sélection suivant SCU Helicoide : Crée une hélicoïde (succession d'arcs elliptiques) Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "Lisez moi". commande : helicoide lien : Solides 3D en colimaçon Increment version 2.0 : Incrémenter une valeur numérique, alphabétique ou alphanumérique dans une chaîne de caractères (texte ou attribut) commandes : inctxt (insertions multiples d'un texte) ; incatt (insertions multiples d'un bloc avec attribut) ; incsuf (incrémentation du suffixe des textes sélectionnés) ; incsel (incrémentation d'une valeur dans les textes sélectionnés) ; incadd (ajout d'une chaîne avec incrément) ; incr (choisir une de ces commandes) liens : Incrémenter les suffixes ; Lisp Numeros...besoin d'une correction. Ins3d : (version 1.1) Insère un bloc sur le plan spécifié par 3 points. commande : ins3d InsTopo : Lit un fichier ascii (txt,csv...) contenant des points topo et insère des points et/ ou des blocs avec attributs. commande : instopo lien : Importer des points depuis un fichier Join3dPoly : Joint les objets sélectionné en une polyligne 3D. commande : join3dpoly Long_line : Retourne dans la fenêtre de texte la longueur de ligne et polyligne du calque sélectionné (possibilité d'enregistrer en XLS) commande : long_line Long_objt : Modifie la longueur totale d'un objet en fonction du périmètre de l'objet sélectionné. commande : long_objt Matchset : Rend courantes le propriétés de l'entité sélectionnée qui sont cochées dans la boite dialogue. Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "lisez-moi". commande : matchset lien : 2 outils que j'ai dans la tête Mcopy : Effectue la copie multiple d'une sélection suivant le décalage spécifié par 2 points. commande : mcopy Mediatrice : Crée une ligne sur la médiatrice du segment défini par 2 points. commande : mediatrice Model_hatch : Un LISP de BonusCAD tourné à ma façon. Récupère la définition du modèle de hachure et propose de l'enregistrer. commande : model_hatch lien : Créer fichier PAT depuis une hachure existante MoveAtt : Permet de déplacer les attributs sélectionnés. commande : moveatt lien : Déplavement attribut ; Amélioration du lisp Move-Att.lsp MsFreeze : Gèle les calques sélectionnés dans une liste ou à l'écran uniquement dans l'onglet objet. commande : msfreeze lien : Geler uniquement en EO ; Geler calques EO mais pas EP Obj2Wipeout : Crée un "Wipeout" à partir de l'objet sélectionné (cercle, ellipse, ou polyligne avec arcs). commande : ob2wo lien : Wipeout avec des arcs Pline_Block : Insère un bloc contenant des attributs dont certains sont des champs dynamiques liés à une polyligne. Le ZIP contient les fichiers source, un fichier compilé VLX, un fichier PDF "Mode d'emploi" et un bloc DWG. commande : pline_block liens : Blocs avec champs dynamiques ; Etiquettes de métré automatique ; Pline_block ; Pline_block (mode d'emploi) ; MAJ Pline_Block PlineOrg : Change le sommet de départ d'une polyligne fermée. Version 2.0 : le sommet peut être choisi n'importe où sur la polyligne. commande : plineorg lien : Changer l'origine d'une polyligne 2D ; départ polyligne PolySegments : Permet de copier ou décaler uniquement certains segments d'une polyligne. commandes : copsegs (copier), ofsegs (décaler) lien : Décaler plusieurs segments de polyligne PolySolid : Permet de créer des "polysolides" avec les versions antérieures à AutoCAD 2007 commande : polysolid lien : Polysolide Res_hel : Crée un réseau hélicoïdal avec les objets sélectionnés. Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "Lisez moi". commande : res_hel liens : Réseau hélicïdal ; Solides 3D en colimaçon ; Réseau polaire avec REF R_pline : Inverse le sens des sommets d'une polyligne. commande : r_pline lien : Inverser les sommets d'une polyligne Soustrac : Effectue une soustraction de solides 3d ou de régions sans les unir les objets (les objet soustraits sont consevé ou supprimés suivant la valeur de la variable DELSUB). commande : soustrac Special_selections : Plusieurs routines pour faire des jeux de sélection suivant les propriétés d'un objet,suivant une fenêtre parallèle au SCU courant ou ou une fenêtre délimitée par un objet. commandes : ssc (suivant la couleur), ssl (suivant le calque), sse (suivant le type d'entité), sstl (suivant le type de ligne), ssatt (suivant la valeur d'un attribut) , sscu (fenêtre parallèle au SCU), ssof (fenêtre définie par un objet), ssoc (capture définie par un objet), inv_sel (inverser la sélection), ssd (suivant les valeurs de paramètres de blocs dynamiques). liens : Sélection de tous les objets d'un calque ; Sélection suivant SCU... ; Sélection rapide de blocs par valeur d'attribut ? ; SELETION BLOC DYNAMIC!!!!!!!! SSFilter : Sélectionne les objets ayant les mêmes propriétés que les entités sélectionnées et qui sont cochées dans la boite dialogue. Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "lisez-moi". commande : ssf SSMatch : ssm sélectionne les objets ayant les mêmes propriétés que l'entité sélectionnée et qui sont cochées dans la boite dialogue ; ssmm permet à l'utilisateur de faire des sélections multiples chacune utilisant le filtre créé à partir d'un objet sélectionné et des propriétés cochées dans la boite de dialogue. Le ZIP contient les fichiers source, un fichier compilé VLX et un fichier "lisez-moi". commandes : ssm et ssmm lien : 2 outils que j'ai dans la tête ; Sélection de tous les objets d'un calque SurfDev : Crée une région représentant le développé d'un maillage 3D ouvert ou fermé à 2 sommets M (surface réglée). commande : surfdev lien : Développer les surfaces développables Tangente : Crée une ligne sur la tangente à la courbe au point spécifié. commande : tap lien : Tangente au point TotalArea (v4.06) : Crée un lien dynamique entre deux attributs du bloc "TotalArea" : étiquette "AREA" pour la somme des aires des objets (arc, cercle, ellipse, polyligne, spline, hachure, région, mpolygon) qui lui sont liés et "NOBJ" pour le nombre d'objets. Le fichier ZIP contient le fichier LISP (TotalArea.lsp), un exemple de bloc (TotalArea.dwg), un fichier d'aide (TotalArea.chm) et un fichier texte (TotalArea.txt). Décompresser le ZIP dans un répertoire du chemin de recherche et charger automatiquement le LISP au démarrage (pour activer les réacteurs) commandes : arebox (boite de dialogue), totalarea (insertion et liaison), areaedit (lier ou détacher des objets), areashow (mettre en surbrillance les objets liés), areaconv (facteur de conversion), areaprec (affichage des décimales). liens : Pline_block+ ; surfaces cumulées, TotalArea & TotalPerim, nouvelles versions. TotalPerim (v4.06) : Crée un lien dynamique entre deux attributs du bloc "TotalPerimeter" : étiquette "PERIM" pour la somme des longueurs des objets (arc, cercle, ellipse, ligne, polylines, région, spline, mpolygon) qui lui sont liés et "NOBJ" pour le nombre d'objets. Le fichier ZIP contient le fichier LISP (TotalPerim.lsp), un exemple de bloc (TotalPerimeter.dwg), un fichier d'aide (TotalAPerim.chm) et un fichier texte (TotalPerim.txt). Décompresser le ZIP dans un répertoire du chemin de recherche et charger automatiquement le LISP au démarrage (pour activer les réacteurs) commandes : perimbox (boite de dialogue), totalperim (insertion et liaison), perimedit (lier ou détacher des objets), perimshow (mettre en surbrillance les objets liés), perimconv (facteur de conversion), areaprec (affichage des décimales). lien : Longueurs cumulées, TotalArea & TotalPerim, nouvelles versions. Trapeze : Crée une polyligne trapézoïdale. Le ZIP contient le fichiers source .LSP, un PDF "Mode d'emploi" et 2 icones. commande : trapeze lien : (mon premier message sur CADxp) Dessiner un trapèze Vues_pavé : Les vues prédéfinies avec le pavé numérique commandes : 0 (Bas), 1 (Isométrie sud Ouest), 2 (Avant), 3 (Isométrie sud Est), 4 (Gauche), 5 (Haut), 6 (Droite), 7 (Isométrie Nord Ouest), 8 (Arrière), 9 (Isométrie Nord Est) Le coin des lispeurs Il ne s'agit plus ici de commandes définies en LISP mais de routines LISP utilisables dans divers programmes. Dialog : Des petites boites de dialogue (sans fichier DCL séparé) pour récupérer des données de la part de l'utilisateur . Routines : getBlock, retourne le nom du bloc entré, sélectionné à l'écran, dans la liste déroulante ou depuis la boite de dialogue AutoCAD de sélection de fichier (getfiled). getLayer, retourne le nom du calque entré, sélectionné à l'écran ou dans la liste déroulante. getLayers, retourne les noms des calques cochés (possibilité de pré-cocher et/ ou de griser des calques) InputBox, retourne la donnée entrée en réponse au message (chaîne) DoubleInputBox, retourne la liste des données entrées en réponse aux messages (chaîne) GetLayouts, retourne la liste des présentations choisies dans la boite de dialogue OptionBox, retourne la (ou les) clé de l'option (ou des options) cochées(s) (chaîne) ListBox, retourne la (ou les) clé de l'option (ou des options) choisie(s) dans une liste (chaîne) Vecteurs&Matrices : Petite librairie de fonctions de calcul vectoriel et matriciel élémentaire et des exemples d'application à la DAO Listes : Petite librairie de fonctions de manipilation des listes Dernière édition : 24/11/2011
    1 point
  2. Bonjour à vous tous Cela fait un moment que je fais des lisp et que je les publie sur ce forum On en trouve un peu partout et j'ai donc décidé de les regrouper dans ce post Les Lisps de Patrick AST Afficher le dessin selon le style de tracé. CAT Recopier les valeurs d’attributs d’un bloc vers un/des autres bloc(s), même si on n’a pas le même nombre d’attributs entre les blocs. CHAT Créer un champ dynamique à un attribut pour lui indiquer la hauteur Z de l’objet. COUP Couper des intersections de lignes par une distance donnée. CPL Importer des calques depuis un dessin Autocad pas forcement ouvert. CPS Importer des styles de côtes depuis un dessin Autocad pas forcement ouvert. CPSCU Importer des scu depuis un dessin Autocad pas forcement ouvert. DEF Définir comme paramètres par défaut selon les caractéristiques d’un objet sélectionné (calque, couleur, épaisseur, etc…) DUC Mettre tous objets de tous les dessins d’un répertoire complet en couleur ducalque. EPO Geler des calques apparents dans les fenêtres de présentations et plus en espace objet. EXL v1.11 Exporter les présentations d’un dessin. L’idée est de créer un nouveau dwg par onglet mais en ne conservant que ce qui est affiché dans la présentation. Le dessin exporté se nomme en reprenant le nom du dessin actuel et en y ajoutant le nom de l’onglet. Fonctionne avec une seule fenêtre par présentations EXL V3.02 Exporter les présentations d’un dessin. L’idée est de créer un nouveau dwg par onglet mais en ne conservant que ce qui est affiché dans la présentation. Le dessin exporté se nomme en reprenant le nom du dessin actuel et en y ajoutant le nom de l’onglet. Fonctionne avec plusieurs fenêtres par présentations. Nécessite d’utiliser GEXL (fournit avec EXL) pour geler les calques dans les fenêtres des présentations exportées. EXP Décomposer complètement une sélection, même les objets imbriqués. FOG Changer facilement et rapidement de présentation. Quand on a plusieurs présentations, rien de plus fastidieux que de faire un clic sur le bouton de défilement et plusieurs fois de suite tout en faisant une petite pause afin que l’onglet suivant s’affiche. On choisit directement sa présentation. GEF Gérer les différents calques dans les différentes fenêtres des présentations. Par exemple, si on a ajouté un calque dans notre dessin et que l’on ne souhaite pas le voir apparaître dans plusieurs présentations sur plusieurs fenêtres, GEF le gèle facilement. GRF Importer plusieurs folios (fichiers) depuis un répertoire dans un dessin unique. Ces folios seront insérés dans les présentations. IAT Incrémenter des attributs. Permet d’avoir une chaine de caractères avec une numérotation qui se suit. Par exemple : B008-006, B008-007,B008-008 Par exemple : 001AA, 001AB, 001AC INC Incrémenter des textes. Un tri est possible avec les coordonnées des textes afin d’obtenir une suite logique. IND Incrémenter les indices des cartouches. INSEDIT InsEdit (gile) Redéfinir le point d'insertion des blocs. IXL Insérer des blocs dans Autocad depuis une feuille Excel. JAV Nettoyer un dessin en profondeur, des objets difficilement effaçables autrement qu’en programmation. JSD Créer un jeu de sélection de ce qui a été dupliqué. LATT simplifié Lier des attributs de manière croissante. Les attributs de mettent à jour de manière dynamiques. Par exemple, si on efface un attribut lié, alors les autres se renumérotent afin que la suite logique reste la même. LATT Lier des attributs de manière Identique, Croissante ou encore de faire une Somme. Les attributs de mettent à jour de manière dynamiques. Par exemple, si on efface un attribut lié, alors les autres se renumérotent afin que la suite logique reste la même. LSTATT Décompte des blocs, mêmes les dynamiques avec la possibilité de distinguer les blocs avec attributs (sur autant d’attributs possible). Possibilité aussi d’exporter les résultats dans un fichier texte. Ce fichier, s’il est renommé en .xls sera ouvert sans problème avec Excel. LXL Lier des Attributs, Textes, Mtexts ou des Rtexts avec Excel. Le principe est de lier à une cellule Excel une valeur. Les données peuvent être transmises depuis Autocad vers Excel, ou dans le sens inverse. On peut travailler avec plusieurs fichiers, feuilles Excel dans plusieurs dessins Autocad Le lisp inclus : EXPLXL : Exporter des données de LXL dans un fichier texte afin de conserver une sauvegarde de ses données créé avec LXL. IMPLXL : Récupérer la sauvegarde préalable de Explxl pour remettre à jour ses données. XL->ATT: Mise à jour pour les scripts, d'Excel vers Autocad ATT->XL: Mise à jour pour les scripts, d'Autocad vers Excel. MAT Propager la valeur d'un attribut. MES Mesurer en continu et avec cumul des distances directement dans le dessin. MIM En cas de changement d’imprimante réseau ou tout simplement parce que le service informatique à redéfinit ses serveurs, MIM permet de réaffecter une nouvelle imprimante pour toutes les présentations choisies tout en conservant les paramètres d’impression. MPL On configure correctement la mise en page d’une présentation. MPL permet la recopie de cette mise en page sur les présentations choisies. ONG Gérer ses présentations. Reprends tous ce qui est sous le clic droit mais d’une manière plus ergonomique. OOG Réorganiser les onglets d'une manière simple. OU Localiser facilement des blocs. Quand on a un grand dessin et qu'on arrive pas à localiser ses blocs, OU dessine un trait de 0,0 au point d'insertion du bloc, ce qui permet d'enfin le localiser. OUA La même chose que le lisp Ou, sauf qu'on peut différencier les blocs avec une valeur d'attribut. PAT Changer la valeur d'un attribut dans plusieurs fichiers. Même principe de fonctionnement que MAT. RA Faire un raccord sans joindre. RB Refait tous les blocs de la couleur dubloc et sur le calque 0. (gile) à fait un super lisp avec edit_bloc, mais ayant déjà celui-là et qu'il ne pose pas de question... RBLOC Remplacer un/des bloc(s) par un autre en conservant ou pas ses attributs, son échelle, ses propriétés dynamiques. RECD Rechercher des blocs superposés. RET Renommer des étiquettes des blocs. RINS Redéfinir le point d'insertion d'un bloc simplement. RON Renuméroter les onglets de 01 à .. ROT_0 Laisser l'angle constamment à 0 de tous les attributs. ROT Laisser l'angle de rotation constamment à 0 de certains attributs définit dans ces deux variables (setq Nom_bloc "UN_BLOC" Eti_Bloc '("ETI1" "ETI2" "ETI3")). RXR Remplacer un xref en déchargeant l'ancien et en conservant les calques qui étaient gelés auparavant. RXREF Donner un chemin relatif aux xrefs par rapport au dessin courant (s'ils sont sur le même lecteur). SCRIPTOR Lisp qui créé et lance un script ou un lisp (depuis un lisp/script source) pour traiter tous les fichiers d'un répertoire et de ses sous-répertoires. STRIPMTEXT Lisp de Steve Doman et Joe Burke. Permet d'enlever au choix, les formats d'un texte. SYN Synchroniser les attributs tout en conservant (ou pas), la valeur, position, angle et style de texte. TOT Affiche le résultat du cumul de différentes longueurs (lignes, polylignes, arc, etc…) UNVERR Déverrouiller toutes les fenêtres des présentations. VERR Verrouiller toutes les fenêtres de toutes les présentations. Vous trouverez ci-après d'autres lisps des plus intéressants. Les Lisps de Bonuscad Les Lisps de (gile) sur Cadxp ou sur sa page perso Vous trouverez d'autres lisps dans ce blog. @+
    1 point
  3. Merci Didier, mais ne te laisse pas aveugler, je ne suis pas du tout sûr d'avoir été très clair. Encore une fois, ne pas hésiter à demander des précisions. On pousse un peu le bouchon ? Les fonctions passées comme argument Certaines fonctions LISP natives requièrent une fonction comme argument (appelées "fonctions d'ordre supérieur", ces fonctions sont caractéristiques de la programmation fonctionnelle) : les essentielles mapcar et apply, mais aussi vl-sort, vl-member-if, vl-remove-if, vl-catch-all-apply, etc. Attardons nous un peu sur quelques unes de ces fonctions avant de voir comment définir de telles fonctions. apply est une fonction essentielle en LISP (on va s'en servir prochainement), elle requiert comme argument une fonction et une liste et passe la liste comme arguments de la fonction pour retourner le résultat de l'évaluation. Un petit exemple pour illustrer ça : (apply '+ '(1 2 3)) le premier argument : '+ est la fonction (elle doit être 'quotée' pour ne pas être évaluée dans cette expression) le second : '(1 2 3) est une liste de nombres. Cette expression est équivalente à : (eval (cons '+ '(1 2 3))) qui s'évalue pas à pas : (eval '(+ 1 2 3)) => (+ 1 2 3) => 6 L'intérêt de cette fonction peut ne pas sembler évident dans cet exemple simple où la liste est explicite (on aurait pu écrire simplement (+ 1 2 3)) mais on est souvent amené en LISP à manipuler des listes dont on ne connais pas la valeur des éléments. mapcar autre fonction essentielle requiert comme arguments une fonction et une ou plusieurs listes. Elle retourne une liste dont chaque élément est le résultat de l'application de la fonction à chacun des éléments de la (ou des) liste(s). Quelques exemples simples pour illustrer ça : (mapcar '1+ '(1 2 3)) la fonction 1+ est le premier argument, la liste le second. mapcar applique la fonction à chacun des éléments et retourne la liste des résultats : (2 3 4) soit le résultat de : (list (1+ 1) (1+ 2) (1+ 3)) Dans la même veine, (mapcar 'strcase '("a" "b" "c")) retourne ("A" "B" "C") Avec plusieurs listes passées comme arguments, mapcar passe chacun des éléments correspondants de chaque liste comme argument à la fonction (premier argument de mapcar) : (mapcar '+ '(1 2 3) '(4 5 6)) est équivalent à (list (+ 1 4) (+ 2 5) (+ 3 6)) et retourne (5 7 9) Dans les exemples ci dessus la fonction passée comme argument est une fonction native, mais on peut aussi utiliser des fonctions définies par l'utilisateur ou des fonctions anonymes (fonction lambda) Par exemple, avec la fonction sqr définie plus haut : (mapcar 'sqr '(1 2 3)) retourne (1 4 9) Mais il n'est pas toujours intéressant ou judicieux de définir une fonction avec defun pour l'utiliser avec ces fonctions. On peut aussi définir localement (dans l'expression mapcar, apply ou autre) une fonction anonyme. La fonction LISP lambda sert à définir ces fonctions anonymes qui sont exécutée à l'endroit même où elle sont définies et qu'on ne peut appeler depuis ailleurs (puisqu'elle n'ont pas de nom). Par exemple, si on n'avait pas défini de fonction nommée sqr (qui ne présente que peu d'intérêt vue la simplicité du code) on pourrait très bien définir une fonction anonyme pour avoir le même résultat que ci-dessus. La syntaxe avec la fonction lambda est exactement la même qu'avec defun à ceci près que l'argument 'nom de la fonction' est omis. (mapcar '(lambda (num) (* num num)) '(1 2 3)) retourne aussi (1 4 9) '(lambda (num) (* num num)) est la fonction anonyme premier argument pour mapcar '(1 2 3) est la liste second argument pour mapcar Dans la fonction anonyme num est l'argument de la fonction (comme dans sqr) qui prend tour à tour les valeurs de chaque élément de la liste. Il est aussi tout à fait possible de définir des fonctions LISP dont un des argument est une fonction. En prenant comme exemple la fonction ssmap (extraite de la stdlib de Reini Urban) on va pousser la factorisation de c:ssTo0 commencée plus haut. ssmap permet d'appliquer une fonction à un jeu de sélection, les arguments requis sont : la fonction à appliquer à chaque entité et le jeu de sélection (noter l'utilisation de apply dans ssmap). (defun ssmap (fun ss / n) (if (= 'PICKSET (type ss)) ; si ss est bien un jeu de sélection, (repeat (setq n (sslength ss)) ; répéter autant de fois qu'il y a d'entité, (apply fun (list (ssname ss (setq n (1- n))))) ; appliquer la fonction a chaque entité ) ) ) La fonction à appliquer à chaque entité du jeu de sélection est la fonction ChangeLayer, or, de la façon dont nous l'avons définie cette fonction requiert 2 arguments : le nom d'entité et le nom du calque. Il n'est donc pas possible de l'utiliser en l'état avec ssmap dont le premier argument doit être une fonction qui ne requiert qu'un argument de type ENAME (nom d'entité). Qu'à cela ne tienne, on va inclure la fonction ChangeLayer dans une fonction anonyme pour lui passer le second argument (le nom du calque). c:ssTo0 peut donc s'écrire (avec ChangeLayer et ssmap chargés) : (defun c:ssTo0 (/ ss n) (if (setq ss (ssget)) (ssmap '(lambda (x) (ChangeLayer x "0")) ss) ) (princ) ) '(lambda (x) (ChangeLayer x "0")) est le premier argument de ssmap où x est l'argument de la fonction anonyme qui prendra tour à tour la valeur de chaque entité contenue dans ss, le second argument pour ssmap On peut voir ici comment implémenter des fonction dont l'argument est une fonction en utilisant apply ou eval. Je sais que cette partie est plus dure à assimiler, mais je suis convaincu que la compréhension des fonctions apply, mapcar et lambda est une étape majeure dans l'apprentissage du LISP (une autre étant la compréhension de la récursivité). Une fois ceci acquis tout le reste n'est plus que du "vocabulaire"...
    1 point
×
×
  • 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é