-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
L'intérêt d'un fichier csv (ou autre type de fichier texte) c'est que c'est beaucoup plus facile et rapide à lire ou à écrire qu'un fichier Excel. On ne peut pas faire de 'base de données' ou 'table de données' en LISP, mais on peut faire des fonctions qui retournent une liste de données en fonction d'une clé.
-
Introduction à AutoLISP est accessible en PDF depuis cette page ou depuis Autodesk Apps Store. Concernant les variables (et les arguments) tu peux lire ce sujet. Pour lire ou écrire dans Excel, tu peux utiliser les routines de Terry Miller.
-
Salut, Personnellement j'ai toujours trouvé les liaison LISP / Excel plutôt lourdingues, aussi j'essayerais de faire les calculs directement dans le LISP. Si le passage par Excel est vraiment incontournable, une recherche avec GetExcel te dirigeras vers plusieurs sujets qui traitent de ça. Je n'aurais pas le temps de t'aider plus avant aujourd'hui.
-
normalement, tout ce que tu peux faire avec le VBA AutoCAD (i.e., l'API COM/ActiveX d'autoCAD), tu peux aussi le faire en Visual LISP avec les fonction vla-*.
-
AUTOMATISER LE NETTOYAGE DE SOLIDE 3D
(gile) a répondu à un(e) sujet de famaice dans LISP et Visual LISP
(defun c:netsol (/ sols nb) (if (setq sols (ssget "_X" '((0 . "3DSOLID")))) (progn (repeat (setq nb (sslength sols)) (command "_SOLIDEDIT" "C" "N" (ssname sols (setq nb (1- nb)))) ) (princ (strcat "\n" (itoa (sslength sols)) " Solides 3D traitées.")) ) (princ) ) ) -
Les premiers retours ne semblent pas très positifs...
-
Salut, Je suis assez d'accord avec didier. Ne serait-il pas préférable d'envoyer un message privé au créateur du sujet plutôt que de faire remonter tous ces messages. Je ne sais pas comment font les modérateurs des autres groupes de discussion que je suis (essentiellement .NET et AutoLISP), mais on n'y voit pas de sujets remontés et, personnellement, je préfère car comme ça les dernières réponses des sujet réellement actifs restent bien visibles en tête des sujets. Ceci dit, concernant la nouvelle interface, j'aurais quelques remarques. On distingue désormais les sujets non lus des sujets lus uniquement par la couleur du champ "X réponses" qui passe du bleu foncé au noir, subtil... Il m'a fallu scruter la page pour m'en apercevoir. Dans l'ancienne interface le titre des sujets non lus était en gras et passait en normal quand ils étaient lus, c'était plus visible. Il semble qu'il n'y ait plus de marque pour distinguer les sujets auxquels on a répondu, en tout cas, je n'ai pas trouvé, c'est dommage, la flèche noire de l'ancienne interface était bien pratique.
-
Bon week-end...
-
Liste des codes DXF (chapitre 6)
(gile) a répondu à un(e) sujet de DenisHen dans LISP et Visual LISP
Les fonctions vlr, c'est pour les réacteurs. Niveau avancé et à manipuler avec précautions. Pour ce dont tu parles, as-tu déployé le nœud DXF Reference, puis les nœuds enfants : Entities Section par exemple (le 6ème nœud) ? didier a été plus rapide... -
Liste des codes DXF (chapitre 6)
(gile) a répondu à un(e) sujet de DenisHen dans LISP et Visual LISP
Ajoute ce lien a test favoris, tu auras accès à l'aide aux développeurs complète. http://help.autodesk.com/view/OARX/2018/FRA/ -
AUTOMATISER LE NETTOYAGE DE SOLIDE 3D
(gile) a répondu à un(e) sujet de famaice dans LISP et Visual LISP
@Fraid, Attention : - ton jeu de sélection prend aussi les solides 2d (SOLID) - tu testes si ton jeu de sélection n'est pas nil après l'avoir utilisé dans (sslength ...) (if (setq sols (ssget "_X" '((0 . "3DSOLID)))) (repeat (setq nb (sslength sols)) (command "_SOLIDEDIT" "C" "N" (ssname sols (setq nb (1- nb)))) ) ) -
[Résolu] Comment faire un (ssget uniquement dans l'espace papier actif
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
N'hésite pas à consulter section Reference DXF de l'aide aux développeurs. Aucune excuse, elle est en français. Code de groupe 67 : Absent ou zéro indique que l'entité est dans l'espace objet. 1 indique que l'entité est dans l'espace papier (facultatif). Code de groupe 410 : nom de l'onglet de présentation. -
[Résolu] Comment faire un (ssget uniquement dans l'espace papier actif
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
En informatique, les choses les plus improbables finissent toujours par arriver. -
[Résolu] Peut-on attacher des Xdata à une fenêtre ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Tu fais simplement : (setq Select (car (entsel "\nSélectionner la fenêtre 'situation':"))) (gc:SetXdata (vlax-ename->vla-object select) '((1001 . "NomVue") (1000 . "site"))) où le groupe 1001 correspond au nom de l'application enregistrée ("NomVue"). Les routines contenues dans AutomationHelpers.lsp permettent précisément d'éviter d'avoir à coder le traitement des variants et safearrays et donc d'écrire de façon plus "AutoLISP" avec des listes et des paires pointées. -
[Résolu] Peut-on attacher des Xdata à une fenêtre ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Les accolades (1002) servent à faire des groupements quand on a de longues liste de données pour faciliter les recherches en lecture. Elle ne sont pas obligatoires Il me semble t'avoir déjà vu utiliser les fonctions vlax-ldata*, tu peux le faire aussi pour des objets (graphiques ou non) à la manière des dictionnaires d'extension. (vlax-ldata-put vp "DenisHen" "site") (vlax-ldata-get vp "DenisHen") -
[Résolu] Peut-on attacher des Xdata à une fenêtre ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Tu vas devoir utiliser les fonctions vla-* Tu peux utiliser les routines ci dessous, extraites de AutomationHelpers.lsp en bas de cette page qui te permettront d'écrire simplement : (gc:SetXdata (vlax-ename->vla-object vp) '((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}"))) ou (gc:GetXdata (vlax-ename->vla-object vp) "Nom_App")qui retournera : ((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}")) ;; gc:VariantToLispData ;; Convertit un variant ou un safearray en donnée LISP ;; ;; Argument ;; var : variant ou safearray (defun gc:VariantToLispData (var) (cond ((= (type var) 'variant) (gc:VariantToLispData (vlax-variant-value var))) ((= (type var) 'safearray) (if (< -1 (vlax-safearray-get-u-bound var 1)) (mapcar 'gc:VariantToLispData (vlax-safearray->list var)) ) ) (T var) ) ) ;; gc:VariantsToDxfList ;; Retourne une liste d'association (type liste DXF) ;; ;; Arguments ;; xtyp : variant (array d'entiers) ;; xval : variant (array de variants) (defun gc:VariantsToDxfList (xtyp xval) (mapcar 'cons (gc:VariantToLispData xtyp) (gc:VariantToLispData xval)) ) ;; gc:GetXdata ;; Retourne la liste DXF des données étendues de l'objet ;; ;; Arguments ;; obj : (vla-object) l'objet auquel sont liées les données étendues ;; app : (string) le nom de l'application enregistrée ("" pour toutes les applications) (defun gc:GetXdata (obj app / xtyp xval) (vla-GetXdata obj app 'xtyp 'xval) (gc:VariantsToDxfList xtyp xval) ) ;; gc:DxfListToVariants ;; Définit 2 variables et affecte un variant à chacune ;; ;; Arguments ;; lst : une liste DXF ;; typeSymbol : un symbole quoté ;; valueSymbol : un symbole quoté (defun gc:DxfListToVariants (lst typeSymbol valueSymbol) (set typeSymbol (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger (cons 0 (1- (length lst))) ) (mapcar 'car lst) ) ) ) (set valueSymbol (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbVariant (cons 0 (1- (length lst))) ) (mapcar '(lambda (x) (if (listp (setq x (cdr x))) (vlax-3d-point x) (vlax-make-variant x) ) ) lst ) ) ) ) ) ;; gc:SetXdata ;; Attribue des données étendues à un objet ;; ;; Arguments ;; obj : (vla-object) l'objet auquel sont liées les données ;; lst : (liste DXF) les données sous la forme : ;; '((1001 . "Nom_App") (1002 . "{") (1000 . "chaîne") (1070 . 1) (1002 . "}")) (defun gc:SetXdata (obj lst / xtyp xval) (gc:DxfListToVariants lst 'xtyp 'xval) (vla-SetXdata obj xtyp xval) ) -
[Résolu] Peut-on attacher des Xdata à une fenêtre ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut, On ne peut pas utiliser la fonction entmod pour modifier les fenêtres (viewport). Extrait de l'aide : "You cannot use the entmod function to modify a viewport entity." -
Projet de routines dans plusieurs domaines...
(gile) a répondu à un(e) sujet de DenisHen dans Routines LISP
Salut, Je suis d'accord avec didier, d'ailleurs je n'ai pas souvenir d'avoir jamais fourni ici ni menu ni barre d'outils ou ruban, c'est certainement en partie dû au fait que je ne les utilise pas. Si tu fournis un menu avec plusieurs outils, tu t'exposes à recevoir des retours du style : "ça ne marche pas" et tu vas devoir déterminer si ce qui ne "marche pas" dépend de l'installation, du menu, de la définition d'une commande ou d'une routine appelée par cette commande. Je te conseillerais d'organiser ton code en plusieurs routines qu'on peut tester séparément les unes des autres (tests unitaires). Il est beaucoup plus facile de tester/déboguer séparément plusieurs routines de 10 lignes qu'une commande de 200 lignes ou, pire, un programme complet de plusieurs commandes avec mnu, etc. -
Comment savoir si une variable est un nombre
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Pour un entier strictement positif, on peut utiliser le fait que atoi retourne 0 si la chaîne ne représente pas un nombre. (while (not (< 0 (setq ech (atoi (getstring "\nEchelle: "))))) (alert "Nécessite un entier strictement positif") ) -
Comment savoir si une variable est un nombre
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut, Il faut essayer d'être le plus précis possible dans l'énoncé de ce qu'on cherche à faire. Quand on y arrive, le boulot est quasiment fait, il suffit juste de traduire en LISP. Finalement, il s'avère que la variable est toujours une chaîne qui peut représenter un nombre, ou pas. Mais on ne sait toujours pas précisément si ce nombre doit être un nombre entier ou peut être un nombre réel. Autrement dit, est-ce que tu veux : "évaluer si le contenu d'une chaîne de caractère représente un nombre strictement positif" ou "évaluer si le contenu d'une chaîne de caractère représente un nombre entier strictement positif" ou autre chose ? -
Programmation fonctionnelle ou impérative
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
J'ai failli mal le prendre... -
Salut, Je ne répondrais pas pour le côté matériel (certains passionnés ne manqueront pas de le faire). Je te conseillerais juste de bien vérifier la compatibilité des logiciels que comptes utiliser avec Windows 10. Si besoin, on doit pouvoir encore trouver des stations de travail qui proposent un downgrade Windows 7.
-
[Résolu] Comment décaler une polyligne ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
La fonction Pline-Algebraic-Area ci-dessus renvoie l'aire algébrique de la polyligne c'est à dire l'aire 'signée' de la polyligne. Si l'aire est négative, c'est que la polyligne est en sens horaire, sinon, il te suffit l'inverser (il existe plein de routines pour ça datant d'avant l'option Inverser de la commande PEDIT). En programmation, on essaye au maximum de ne pas accorder trop de confiance à l'utilisateur. -
Programmation fonctionnelle ou impérative
(gile) a répondu à un(e) sujet de (gile) dans Pour aller plus loin en LISP
Il ne faut pas s'affoler et surtout pas désespérer. À part de très rares exceptions pour qui la programmation fonctionnelle semble innée (comme VDH-Bruno qui ne cesse de m’impressionner), quand on commence à programmer c'est en général de façon impérative, a fortiori quand on cherche à automatiser ce qu'on fait dans AutoCAD de façon procédurale. Qu'on soit passé par les macros, les scripts ou le VBA AutoCAD, on commence par enchaîner les commandes, éventuellement dans des boucles. Dans tous les cas, la programmation d'AutoCAD sera toujours essentiellement procédurale. comme dit plus haut, la programmation fonctionnelle ne s'applique qu'à certains traitements de données. Et, à de très rares exceptions près, ces traitements peuvent très bien être fait (et être très bien faits) de manière impérative. À mon sens l'intérêt de la programmation fonctionnelle avec AutoLISP est d'une part didactique ou pédagogique*, d'autre part pratique. Le côté didactique est essentiellement représenté par la récursivité en ce sens que c'est une façon de raisonner différente de la pensée séquentielle/linéaire et qu'elle est fondamentale dans l'implantation du LISP. Une expression LISP se définit récursivement comme étant : soit un atome ; soit une liste d'expressions LISP. Une liste chainée (seule structure de données utilisé par AutoLISP) est en fait une structure récursive : (list 1 2 3) est un raccourci pour (cons 1 (cons 2 (cons 3 (cons nil)))). La compréhension de la récursivité peut donc être vue comme une ouverture d'esprit, un prise conscience de la façon dont le LISP fonctionne. Dans la pratique, à part produire du code souvent plus concis et plus élégant, la récursivité est généralement moins efficiente en terme de performance et limitée par la "taille de la pile". Par contre, les fonctions d'ordre supérieur (apply, mapcar, vl-sort, vl-some, vl-remove-if, etc.) ont, à mon avis, un grand intérêt pratique en permettant d'écrire un code à la fois plus concis et plus facile à comprendre en ce sens qu'il décrit directement l'objectif à atteindre plutôt que le processus à suivre pour y arriver. * avant de revenir un peu sur le devant de la scène ces dernières années la programmation fonctionnelle intéressait surtout le milieu éducatif. -
[Résolu] Comment décaler une polyligne ?
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
On est d'accord, "à droite" ou "à gauche", c'est dans le sens de création, mais avec une polyligne fermée, pour que le décalage soit "à l'intérieur", "à droite" ou "à gauche" dépend du fait que la polyligne ait été créée en sens horaire ou pas (ce que tu as compris). Avec la méthode que j'ai donné dans ma première réponse, il faut que l'utilisateur respecte la consigne : "\nTournez dans le sens horaire ! !" Avec la méthode de l'aire algébrique pour déterminer le sens de rotation on peut garantir le décalage vers l'intérieur quel que soit le sens de création de la polyligne. Il suffit de charger les routines que j'ai donné et de faire : (command "_.pline") (while (not (zerop (getvar "cmdactive"))) (command pause) ) (OffsetInside (entlast) 5) Toujours avec une polyligne fermée, une autre méthode, consiste à décaler des deux côtés (avec vla-Offset + et - la distance de décalage) et a effacer les (ou les) décalge dont l'aire est la plus grande. (defun OffsetInside (pl dist / ) (vl-load-com) (if (= (type pl) 'ENAME) (setq pl (vlax-ename->vla-object pl)) ) (setq of1 (vlax-invoke pl 'offset dist) of2 (vlax-invoke pl 'offset (- dist)) ) (if (< (apply '+ (mapcar 'vla-get-area of1)) (apply '+ (mapcar 'vla-get-area of2)) ) (foreach o of2 (vla-Delete o)) (foreach o of1 (vla-Delete o)) ) )
