Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. Salut, Est-ce-que tu cherches pour un bloc précis ou pour tous les blocs ?
  2. (gile)

    Lisp Profil

    Salut, Le LISP fonctionnne avec une boite de dialogue (fichier "gene_pro.dcl"). Le fichier DCL doit être placé dans un répertoire des chemins de recherche.
  3. (gile)

    Selection de texte

    Salut, Si tu as une version pleine, tu peux insérer cette expression LISP dans ton script (adapte la caîne de recherche avec caractères génériques à tes besoins. (and (setq s (ssget "_X" '((0 . "MTEXT") (1 . "* Corerespondante générique")))) (command-s "_.erase" s ""))
  4. (gile)

    3DSOLID Infos ?

    La commande CHAMPSOLIDE accepte tous les solides "primitifs" ("Boîte" "Cylindre" "Cône" "Sphère" "Pyramide" "Biseau" "Tore"). Elle fonctionnera uniquement sur des versions françaises (la propriété SolidType est localisée). Elle affiche dans des champs les dimensions du solide sélectionné en utilisant les formats courants (LUNITS, LUPREC). ;; Affiche dans des champs les dimensions du solide primitif sélectionné ;; Version française uniquement (defun c:CHAMPSOLIDE (/ ent solidType str) (vl-load-com) (while (not (and (setq ent (car (entsel "\nSélectionnez un solide (primitive uniquement): "))) (= (cdr (assoc 0 (entget ent))) "3DSOLID") (not (vl-catch-all-error-p (setq solidType (vl-catch-all-apply 'getpropertyvalue (list ent "SolidType"))) ) ) (member solidType '("Boîte" "Cylindre" "Cône" "Sphère" "Pyramide" "Biseau" "Tore")) ) ) (prompt "\nSélection non valide.") ) (setq id (vla-GetObjectIdString (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object) ) ) (vlax-ename->vla-object ent) 0 ) str (cond ((= solidType "Boîte") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Cylindre") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MajorRadius \\f \"%lu6\">%" "\\PPetit rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ) ((= solidType "Cône") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMajorRadius \\f \"%lu6\">%" "\\PPetit rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMinorRadius \\f \"%lu6\">%" "\\PGrand rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMajorRadius \\f \"%lu6\">%" "\\PPetit rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ) ((= solidType "Sphère") (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" ) ) ((= solidType "Pyramide") (strcat "Côtés = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Sides >%" "\\PRayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Biseau") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Tore") (strcat "Rayon de tore = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TorusRadius \\f \"%lu6\">%" "\\PRayon de tube = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TubeRadius \\f \"%lu6\">%" ) ) ) ) (vl-cmdf "_.mtext" pause "_width" 0.0 str "") (princ) )
  5. (gile)

    3DSOLID Infos ?

    Je n'en sais pas plus, je ne fais que tester. Il semblerait que les propriétés qui apparaissent dans la palette des propriétés pour certains types de solides ou de surface (ceux qui ont une propriété "Type de solide" ou "type de surface") soient utilisables dans les champs. Ce qui est curieux (mais on n'en est pas à une incohérence près chez Autodesk) c'est qu'il semble que, pour les solides, ces propriétés ne soient accessible par programmation qu'en AutoLISP via les fonctions getpropertyvalue ou setpropertyvalue.
  6. (gile)

    3DSOLID Infos ?

    En fait, c'est pas si compliqué. (defun c:extrudechamp (/ ent util oid str) (vl-load-com) (while (not (and (setq ent (car (entsel "\nSélectionnez un solide extrudé: "))) (= (cdr (assoc 0 (entget ent))) "3DSOLID") (= (getcname (getpropertyvalue ent "SolidType")) "_EXTRUDE") ) ) (prompt "\nVous n'avez pas sélectionné un solide extrudé.") ) (setq util (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object))) oid (vla-GetObjectIdString util (vlax-ename->vla-object ent) 0) str (strcat "Hauteur = " "%<\\AcObjProp Object(%<\\_ObjId " oid ">%).Height \\f \"%lu6\">%" " Angle = " "%<\\AcObjProp Object(%<\\_ObjId " oid ">%).TaperAngle \\f \"%au5\">%" ) ) (vl-cmdf "_.text" pause pause pause str) (princ) )
  7. (gile)

    3DSOLID Infos ?

    Salut, Tu peux essayer ça (pour le champ, je crains que ça ne soit plus compliqué). (defun c:extrudata (/ ent) (while (not (and (setq ent (car (entsel "\nSélectionnez un solide extrudé: "))) (= (cdr (assoc 0 (entget ent))) "3DSOLID") (= (getpropertyvalue ent "SolidType") "Extrusion") ) ) (prompt "\nVous n'avez pas sélectionné un solide extrudé.") ) (prompt (strcat "\nHauteur = " (rtos (getpropertyvalue ent "Height")) "\tAngle d'extrusion = " (angtos (getpropertyvalue ent "TaperAngle")) ) ) (princ) )
  8. (gile)

    Lisps de gile

    Je ne comprends pas bien la demande. Si on choisi, par exemple : "Trier par : X Croissant" "puis par : Y Décroissant", le programme ne tient compte des Y qu'en cas d'égalité stricte des X. On a donc bien un tri en fonction des X sans tenir compte des Y sauf dans le cas d'égalité stricte des X (2, 3, 4), et dans ce cas là seulement, on tient compte des Y. Si on ne tenait pas compte des Y, les X égaux (2, 3, 4) seraient incrémentés aléatoirement mais ça ne changerait rien à l'ordre croissant des X.
  9. Salut, Les fonctions initget et getkword devraient répondre à ta demande (voir sections 7.0 et 7.1 de Introduction à AutoLISP). (initget 1 "5 10 15 20 25 33.33333 40 50 75 100") (setq option (getkword "\nChoisissez l'échelle [5/10/15/20/25/33.33333/40/50/75/100]:")) (setq echelle (if (= option "33.33333") 0.03 (/ 1. (atof option)) ) ) Coiffé au poteau par Luna....
  10. Salut Patrick; Je reconnais avoir été caricatural, mais ça n'explique pas pourquoi quelqu'un comme Didier qui, selon ses dires, a postulé plusieurs n'ait pas été retenu.
  11. J'avoue ne pas bien comprendre non plus les critères d'Autodesk si ce n'est qu'ils semblent préférer ce qu'on appelle outre atlantique des evangelists, à savoir des enthousiastes fussent-ils quelque peu novices plutôt que de réels experts qui risqueraient d'être plus critique. Je pense que tu es complètement "dans les clous" au même titre que les autres piliers de CADxp (qui, pendant des années, a beaucoup plus fait pour AutoCAD dans la francophonie que les sites Autodesk). De plus, le fait de créer un site pertinent dédié à AutoCAD, AutoLISP ou autre produit Autodesk devrait être un critère prédominant.
  12. Justement on ne peut pas. Toute liste dont le premier terme est une liste du type ([arguments] [/ variables ...]) peut être exécutée comme une fonction qu'elle ait été créée par defun-q ou autrement.
  13. Salut, La fonction AutoLISP command appelle toujours la version 'ligne de commande' de la commande (quand elle existe). Pour forcer la version 'boite de dialogue', if faut appeler la fonction initdia avant l'appel à command. (initdia) (command "_layer")
  14. Bien-vu, il s'agissait bien d'une erreur dans le code. Bsc_Med_Per_Tan.lsp est à jour sur cette page.
  15. (gile)

    ???

    ('((rec s) (rec s (strlen s))) '((s n) (if (<= 0 (setq n (1- n))) (cons (ascii (substr s 1 1)) (rec (substr s 2 n) n)) ) ) "Bravo Bruno !" )
  16. (gile)

    ???

    @Fraid, un benchmark plus significatif qui compare la même fonction définie avec une liste, defun-q, lambda et defun. ;; liste (setq f1 '((x) (* x x))) ;; defun-q (defun-q f2 (x) (* x x)) ;; lambda (setq f3 (lambda (x) (* x x))) ;; defun (defun f4 (x) (* x x)) _$ (benchmark '((f1 4) (f2 4) (f3 4) (f4 4))) Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s): (F3 4).....1703 / 3.00 <fastest> (F4 4).....1703 / 3.00 (F2 4).....5093 / 1.00 (F1 4).....5109 / 1.00 <slowest>
  17. (gile)

    ???

    La possibilité de redéfinir une fonction définie avec defun-q est généralement illustré avec la fonction S::STARTUP. On trouve aussi une ingénieuse façon d'utiliser ce comportement dans la fonction ai_sysvar définie dans .\Support\fr-fr\acad20XXdoc.lsp du répertoire d'installation. On peut prendre un exemple simple avec une fonction qui génère un entier incrémenté à chaque appel sans utiliser aucune donnée extérieure. (setq f '((/ i) (setq i 1) (setq f (cons '(/ i) (cons (list 'setq 'i (+ i 1)) (cddr f)))) i ) ) _$ f ((/ I) (SETQ I 1) (SETQ F (CONS (QUOTE (/ I)) (CONS (LIST (QUOTE SETQ) (QUOTE I) (+ I 1)) (CDDR F)))) I) _$ (f) 1 _$ f ((/ I) (SETQ I 2) (SETQ F (CONS (QUOTE (/ I)) (CONS (LIST (QUOTE SETQ) (QUOTE I) (+ I 1)) (CDDR F)))) I) _$ (f) 2 _$ f ((/ I) (SETQ I 3) (SETQ F (CONS (QUOTE (/ I)) (CONS (LIST (QUOTE SETQ) (QUOTE I) (+ I 1)) (CDDR F)))) I) _$ (f) 3 Et Bonne Année quand même....
  18. (gile)

    ???

    Je vais essayer une petite explication. En des temps que seuls certains dinosaures ont connu, avant l'optimisation d'AutoLISP avec Visual LISP (AutoCAD 2000) les fonctions LISP étaient définies comme des listes. De cette époque reculée, il nous reste une trace : la fonction defun-q. L'aide nous dit que cette fonction existe essentiellement pour des problèmes de compatitbilité avec les anciennes versions d'AutoLISP et recommande de lui préferer defun. Si on définit une fonction avec defun, on crée un objet de type USUBR : _$ (defun sqr (x) (* x x )) SQR _$ (type sqr) USUBR _$ sqr #<USUBR @000001d743bd8188 SQR> Si on fait la même chose avec defun-q, on crée une liste : _$ (defun-q sqr (x) (* x x )) SQR _$ (type sqr) LIST _$ sqr ((X) (* X X)) Or on sait aisément construire cette liste sans utiliser defun-q : _$ (list '(x) '(* x x)) ((X) (* X X)) Ou, plus simplement : _$ '((x) (* x x)) ((X) (* X X)) Ce qui veut dire qu'une liste 'quotée' contenant la structure d'une fonction, est une fonction LISP. On peut affecter cette liste à un symbole avec setq : (setq sqr '((x) (* x x))) et utiliser le symbole comme une fonction : _$(sqr 3) 9 On peut aussi utiliser directement la liste (comme on le ferait avec un lambda) : _$ ('((x) (* x x)) 3) 9 On peut utiliser ce symbole avec les fonctions d'ordre supérieur : _$ (mapcar 'sqr '(1 2 3)) (1 4 9) mais aussi directement la liste quotée (comme on le ferait avec une expression lambda), et comme les fonctions passées comme argument aux fonctions d'ordre supérieur doivent être 'quotée', il faut doubler l'apostrophe (attention, il semble que ce ne soit pas le cas avec l'AutoLISP de BricsCAD) : _$ (mapcar ''((x) (* x x)) '(1 2 3)) (1 4 9) Les différences de performance notée par Fraid sont dues au fait que defun comme lambda génèrent des objets de type USUBR qui sont optimisés par rapport aux listes qui sont ré-interprétées à chaque exécution. En conclusion, le seul intérêt (excepté le fait d'écrire du code plus 'crypté') de defun-q (ou des listes équivalentes) est la possibilité de redéfinir la fonction en modifiant la liste (à suivre...). PS : j'ai découvert ça assez récemment avec ce sujet sur TheSwamp dans lequel, chose exceptionnelle, Elpanov Evgeniy pose une question.
  19. (gile)

    ???

    C'était bien une faute de frappe, c'est corrigé. Pour les explications concernant le code, je ferais une réponse plus étoffée.
  20. ('((s) (vl-list->string (mapcar ''((x) (if (<= 33 x 136) (+ 33 (rem (+ x 14) 94)) x ) ) (vl-string->list s) ) ) ) "q@??6 p??é6" )
  21. Si tu colles bien tout le contenu du fichier (qui contient plusieurs routines), tu ne devrais pas avoir de souci. C'est le fonctionnement normal des champs avec AutoCAD.
  22. (gile)

    SUBR vs USUBR

    Salut, La différence entre SUBR et USUBR semble assez floue, même dans l'aide : SUBR Internal AutoLISP functions or functions loaded from compiled (FAS or VLX) files Functions in LISP source files loaded from the AutoCAD Command prompt may also appear as SUBR USUBR User-defined functions loaded from LISP source files
  23. Pour un point : (setq p1 (getpropertyvalue bloc "Position")) (setq x1 (rtos (car p1))) (setq x2 (rtos (cadr p1))) Pour traiter plusieurs points il faut penser aux listes (LISP = LISt Processing)...
  24. Non c'est juste que tes points sont loin de l'origine, donc les coordonnées sont affichées en notation scientifique (puissance de 10). 1.63655e+006 est environ égal à 1636550 Tu peux utiliser la fonction rtos pour convertir le nombre en chaîne et ainsi l'afficher sous une forme décimale.
  25. Salut, Depuis AutoCAD MAC/Windows 2012 la fonction getpropertyvalue permet un accès facile au propriétés des objets ainsi qu'aux attributs de blocs. (setq bloc (car (entsel "\nSélectionnez le bloc: "))) (setq position (getpropertyvalue bloc "Position")) (setq alt (getpropertyvalue bloc "ALT")) (setq mat (getpropertyvalue bloc "MAT"))
×
×
  • 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é