-
Compteur de contenus
1 489 -
Inscription
-
Dernière visite
-
Jours gagnés
19
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par zebulon_
-
Bonjour, j'ai posté un message concernant une bibliothèque de fonctions concernant les xdata, mais ce message n'a eu que très peu de "succès" et j'en suis fort triste. Cela devrait intéresser les personnes que rebutent les lignes de code du genre (-3 ("Mon_App" (1000 . "Texte")) et autres joyeusetés du même tonneau. Amicalement Vincent
-
il est vrai que l'énoncé était un peu succin, d'où les différentes questions et réponses qui sont tombées dans la foulée. J'aime bien ces challenges parce que, quand j'essaye d'y répondre, il me faut trois pages de code et d'autres, qui se reconnaitront, font preuve d'une concision exemplaire. Ma frustration est là ;) Dans le code que je donne plus haut, il y a une erreur de logique dans la fonction (numonly ...). D'abord je conserve les caractères "+" pour les supprimer par la suite. Autant les supprimer tout de suite, j'y gagnerai en concision. Amicalement Vincent
-
(vl-load-com) (defun numonly (txt / RES SIGN) ;; supprimer tous les caractères autres que des nombres, "." "+" et "-" (setq RES (vl-list->string (vl-remove-if-not '(lambda (x) (member x '(43 45 46 48 49 50 51 52 53 54 55 56 57)) ) (vl-string->list txt) ) ) ) ;; déterminer le signe (if (= (substr RES 1 1) "-") (setq SIGN "-" RES (substr RES 2) ) (setq SIGN "") ) ;; supprimer tous les "+" et "-" (setq RES (vl-list->string (vl-remove-if '(lambda (x) (member x '(43 45)) ) (vl-string->list RES) ) ) ) (strcat SIGN RES) ) (defun borne (ELEM / POS BI BS) (if (setq POS (vl-string-position 58 ELEM)) (setq BI (distof (numonly (substr ELEM 1 POS)) 2) BS (distof (numonly (substr ELEM (+ POS 2))) 2) ) (setq BI (distof (numonly ELEM) 2) BS (distof (numonly ELEM) 2) ) ) (if (and BI BS) (list BI BS) ) ) (defun in (NB PLAGE / LELEM POS ELEM PLAGE) (if (= (type NB) 'STR) (setq NB (distof (numonly NB))) ) (while (setq POS (vl-string-position 44 PLAGE)) (if (setq ELEM (borne (substr PLAGE 1 POS))) (setq LELEM (cons ELEM LELEM)) ) (setq PLAGE (substr PLAGE (+ POS 2))) ) (if (setq ELEM (borne PLAGE)) (setq LELEM (cons ELEM LELEM)) ) (setq LELEM (reverse LELEM)) (print NB) (print LELEM) (apply 'or (mapcar '(lambda (x) (and (<= (car x) NB) (>= (cadr x) NB) ) ) LELEM ) ) ) (defun c:plage () (in "-50abc" "-55:-45,sfs:66,100,800,df") ) un premier jet Amicalement Vincent
-
j'ai un petit problème de syntaxe. Comment ça se passe quand il y a des nombres négatifs ? Le (-) moins et le (-) tiret vont être difficiles à discerner. Je propose d'utiliser ":" comme dans les plages excel. (in -47 "-50:-44,55sfs:66,100,800") Si tu es d'accord. Amicalement Vincent
-
Bonjour, On ne parle que de nombres entiers ? Le premier argument peut être soit un entier, soit un texte ? Pour "corriger" les fautes de frappe, je verrais bien la fonction atoi. (atoi "55sfs") -> 55 Il y a juste le cas où la faute de frappe est très lourde et que le texte ne commence pas par un chiffre. Dans ce cas atoi renvoi 0 (atoi "sfs55") -> 0 (atoi "coucou") ->0 Amicalement Vincent Finalement, non. Atoi ne peut pas convenir puisque dans les exemples il y a des réels, mais je n'avais pas bien regardé. [Edité le 28/4/2010 par zebulon_]
-
Récupérer la liste des calques gelés dans une fenêtre de présentation
zebulon_ a répondu à un(e) sujet de Dieunis dans Débuter en LISP
Bonjour, (defun massoc (key alist / x nlist) (foreach x alist (if (eq key (car x)) (setq nlist (cons (cdr x) nlist)) ) ) (reverse nlist) ) massoc est une fonction construite sur l'exemple de la fonction assoc, sauf qu'elle renvoie la liste des éléments concernés. Si A est la liste ci dessus (massoc 331 A) renvoie la liste des adresses associées au code 331 Amicalement Vincent -
POSITION ATTRIBUT BLOC ET CHANGEMENT DE CALQUE
zebulon_ a répondu à un(e) sujet de fabichou dans Routines LISP
je t'ai envoyé mon adresse par message privé. Si cela ne pose pas de problème de confidentialité, tu peux me faire parvenir le fichier dwg concerné, ou le déposer quelque part sur un site FTP ? Amicalement Vincent -
Bonjour, Je n'ai pas bien compris la demande mais, pour enlever (ou rajouter) des éléments à un groupe, il faut utiliser la commande GROUPE (comme pour la création du groupe). Il faut d'abord sélectionner le nom du groupe concerné par la modification (le cas échéant, il faut d'abord cocher "inclure sansnom", si le groupe porte un nom du style "*A1"). Puis, en bas de la boite de dialogue de la commande GROUPE apparaissent les boutons qui permettent de rajouter, enlever (sans les effacer) ... des objets à un groupe existant, décomposer le groupe etc... La valeur de PickStyle n'intervient pas dans ce qui est décrit ci-dessus. Amicalement Vincent
-
POSITION ATTRIBUT BLOC ET CHANGEMENT DE CALQUE
zebulon_ a répondu à un(e) sujet de fabichou dans Routines LISP
Bonjour fabichou, Effectivement, que ce soit avec battman ou attsync, une synchronisation replace les attributs à leur position d'origine. Pour palier à ce problème, l'idée, qui n'est sans doute pas la meilleure, est de lancer un premier lisp qui construit une liste contenant l'adresse de l'attribut et le point qui correspond à son TextAlignmentPoint. Ensuite tu procèdes à la synchronisation qui change le TextAlignmentPoint. Pour terminer, tu exécutes un second lisp qui remet le TextAlignmentPoint tel que sauvegardé dans la liste construite par le premier lisp. (vl-load-com) ;; construire liste LSTPT (defun c:getpos (/ AcDoc eobj sel latt att) (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object))) (setq LSTPT nil) (ssget "_X" '((0 . "INSERT") (2 . "NOM_DU_BLOC"))) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (if (= (vlax-get-property eobj 'HasAttributes) :vlax-true) (progn (setq LATT (vlax-invoke eobj 'getAttributes)) (foreach ATT LATT (if (= (vla-get-TagString ATT) "NOM_ETIQUETTE") (setq LSTPT (cons (list ATT (vla-get-TextAlignmentPoint ATT)) LSTPT)) ) ) ) ) ) (vla-delete sel) (princ) ) ;; remettre les attributs à leur place d'origine contenue dans LSTPT (defun c:putpos (/ PT) (foreach PT LSTPT (vla-put-TextAlignmentPoint (car PT) (cadr PT)) ) (princ) ) Bien sûr il faut changer NOM_DU_BLOC et NOM_ETIQUETTE pour que ça corresponde à ton cas. Amicalement Vincent [Edité le 22/4/2010 par zebulon_] -
Bonjour, chalenge n°42 : Cadmin réussira-t-il à mettre CADxp à l'heure ? pfuuuu, qu'est ce que l'oisiveté ("oisiveté", c'est quand même plus joli que "rien à bra...") nous pousse à dire comme âneries, c'est affolant. Vivement la fin de la crise qu'on ait de nouveau un peu de boulot. Amicalement Vincent PS : dans "qu'on rien à bra...", le "on", c'est le verbe ? Dans ce cas, il faut écrire "ont". Pour bien faire, comme c'est une phrase négative, il faudrait même écrire "n'ont". (Comme vous l'avez remarqué, je profite du temps libre que m'offre cette période de "qu'on rien à bra..." pour parfaire mon vocabulaire, mon orthographe et ma grammaire)
-
calcul de pente à partir de points altimétriques
zebulon_ a répondu à un(e) sujet de kclement dans Routines LISP
surtout quand on est chauve. Pour le problème de nom d'étiquette, je pense que speedy a donné la bonne réponse. avec la commande BATTMAN et la synchronisation qu'elle permet, cela ne devrait pas arriver Amicalement Vincent -
Bonjour, à l'heure GMT réelle sans doute ? Non, CADxp a une heure d'avance sur GMT, donc c'est pas ça... Amicalement Vincent [Edité le 20/4/2010 par zebulon_]
-
Bonjour, pour préciser la réponse de bseb67, il faut rappeler que DCL date de la version 12 (pour autant que je me rappelle), ce qui correspond au début des années 90. Les boîtes de dialogue DCL correspondent à la mode de l'époque. J'ai conservé le manuel de programmation et le manuel de personnalisation de la version 12 (datés respectivement de septembre 92 et octobre 92) : on n'a pas fait mieux depuis. Je m'en suis beaucoup servi et je m'en sers encore souvent. Le reproche principal qu'on peut faire à DCL est qu'il faut décrire littéralement un objet graphique. Par ailleurs, il est difficile de faire des onglets et, pour terminer, il est impossible d'afficher des images autres que des clichés ou des graphiques assez succins. Pas de bmp et encore moins de jpg... L'avantage de DCl est qu'il est fourni avec Autocad. Pour avoir mieux, il faut regarder du côté de ObjectDCL (il y a un forum correspondant sur CADxp). Peut être qu'un jour autodesk rachètera cette licence pour la fournir dans ses versions futures d'autocad ? Amicalement Vincent
-
calcul de pente à partir de points altimétriques
zebulon_ a répondu à un(e) sujet de kclement dans Routines LISP
c'est vrai, mais ce n'est pas toujours évident d'y trouver son bonheur (la rançon du succès de CADxp, sans doute). Le code de Gile s'intéresse aux attributs. Aussi, si on veut l'utiliser, il faut que le tagstring du bloc corresponde à celui utilisé dans le lisp (à savoir "alt"). kclement en a rêvé et et le rêve était déjà réalisé ;). Preuve s'il en fallait que CADxp est une vraie mine d'or pour qui sait y trouver la pépite qui l'intéresse. Amicalement Vincent -
calcul de pente à partir de points altimétriques
zebulon_ a répondu à un(e) sujet de kclement dans Routines LISP
Bonjour, Un brin d'exagération ;) Personnellement, mes rêves les plus fous n'ont pas pour objet des lignes de code. Chacun ses fantasmes, on n'est pas là pour juger. Est-ce que le bloc est positionné à l'altitude indiquée par l'attribut ou est-ce qu'il se traîne bêtement à l'altitude 0 ? Dans le premier cas on pourrait faire ceci, sans se préoccuper de l'attribut (defun c:pnpt (/ b1 b2 pt1 pt2 DZ DL PENTE) (prompt "\nsélectionner le 1er bloc") (setq b1 (car (entsel))) (prompt "\nsélectionner le 2ème bloc") (setq b2 (car (entsel))) (setq pt1 (cdr (assoc 10 (entget b1)))) (setq pt2 (cdr (assoc 10 (entget b2)))) (setq DZ (- (caddr PT2) (caddr PT1))) (setq DL (distance (list (car PT1) (cadr PT1)) (list (car PT2) (cadr PT2)) ) ) (setq PENTE (/ DZ DL)) (alert (strcat "Delta Z : " (rtos DZ 2 3) "\nDelta L : " (rtos DL 2 3) "\nPente : " (rtos (* PENTE 100) 2 3) "%" ) ) ) Amicalement Vincent -
Bonjour, afin de me faciliter la tâche avec les xdata, j'ai utilisé une bibliothèque de fonctions proposée par Didier DUHEM sur son site perso. C'est écrit en lisp (je veux dire sans VLISP) et j'ai trouve le principe excellent. Par contre, comme j'utilise de plus en plus VLISP, et pour éviter de faire un (vlax-ename->vla-object ...), j'ai réécrit ces fonctions en VLISP. Je les ai déposé ici . Pour en illustrer le fonctionnement, j'ai dessiné 2 ou 3 lignes dans un fichier quelconque 1) rajouter des xdata, sans vérifier s'il y en a déjà, dans un objet que le lisp vient de créer (vl-load-com) (load "XdataFer") (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object))) (defun c:testput (/ I eobj sel xdata) (setq I 0) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq xdata (x_putint "key0" I nil "MonAppli")) (x_write xdata eobj "MonAppli") (setq I (+ I 1)) ) (vla-delete sel) ) un xdlist revoie ceci. 2) rajouter des xdata en préservant les xdata existants de la même appli (defun c:testrajout (/ I eobj sel xdata) (setq I 65) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq xdata (x_read eobj "MonAppli")) (setq xdata (x_putstr "key1" (chr I) xdata "MonAppli")) (x_write xdata eobj "MonAppli") (setq I (+ I 1)) ) (vla-delete sel) ) xdlist donne 3) lire une information xdata d'un objet (defun c:testtrouvinfo (/ eobj sel ResKey1) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq ResKey1 (x_trouvinfo "key1" eobj "MonAppli")) (alert ResKey1) ) (vla-delete sel) ) 4) modifier la valeur d'une clé (defun c:testmod (/ I eobj sel xdata) (setq I 97) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq xdata (x_read eobj "MonAppli")) (setq xdata (x_modstr "key1" (chr I) xdata "MonAppli")) (x_write xdata eobj "MonAppli") (setq I (+ I 1)) ) (vla-delete sel) ) xdlist donne 5) supprimer une clé (defun c:testdel (/ eobj sel xdata) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq xdata (x_read eobj "MonAppli")) (setq xdata (x_otegen "key1" xdata "MonAppli")) (x_write xdata eobj "MonAppli") ) (vla-delete sel) ) xdlist donne 6) supprimer tous les xdata d'une appli (defun c:testraz (/ eobj sel xdata) (ssget) (vlax-for eobj (setq sel (vla-get-ActiveSelectionSet AcDoc)) (setq xdata '((1001) ("MonAppli"))) (x_write xdata eobj "MonAppli") ) (vla-delete sel) ) xdlist donne Amicalement Vincent
-
Bonjour, tu essayes de lancer un script depuis un lisp. Soit tu suis la proposition de Tramber, tu écris un un script et tu l'exécutes, soit tu veux pousser plus loin et utiliser le lisp. Pas les 2 en même temps. Amicalement Vincent
-
à vrai dire, ce n'est pas une notation bien explicite. Pour calculer un tonnage d'acier, il faut connaitre, pour chaque repère, son diamètre, le nombre de barres et la longueur unitaire de ces barres. on va dire que (1) est le repère 23 le nombre d'aciers de repère 1 8HA, qu'il s'agit d'un HA8 12m, que la barre unitaire fait 12m de long e=20, que cette barre est disposée avec un espacement de 20 cm (donnée qui n'est pas nécessaire pour calculer la masse d'acier) Donc pour le repère (1), il faudrait faire 23u. x 12.00ml x 0.395 kg/ml = 109.02 kg Pour le repère (2) on ne connait pas le nombre d'aciers. L'espacement e=12 veut dire qu'il y a un acier tous les 12cm (donc environ 8 par mètre), mais comme on ne sait pas sur combien de mètres on doit disposer le repère (2), il est difficile de calculer quelque chose. En principe, une nomenclature de barres se présente sous la forme d'un tableau qui nous indique clairement de quoi il s'agit (diamètre, nombre de barres, longueur par barre et façonnage). Celui qui vous à fourni ces données pourra sans doute mieux vous indiquer leur signification. Amicalement Vincent
-
Bonjour, la masse volumique de l'acier est de 7850 kg/m3. C'est la donnée de base, la suite c'est de l'arithmétique assez simple : section (m2) * masse volumique (kg/m3) = masse/mètre_linéaire (kg/m) pour un HA8, on aura une masse au ml de PI*0.004*0.004*7850 = 0.395 kg/ml pour un HA12, on aura une masse au ml de PI*0.006*0.006*7850 = 0.888 kg/ml .... pour un HA40 : 9.864 kg/ml et, de façon similaire, tu obtiens les masses au ml des autres sections. Après, il suffit de multiplier par la longueur pour obtenir la masse totale. Amicalement Vincent [Edité le 12/4/2010 par zebulon_]
-
http://img440.imageshack.us/img440/2276/numriser0001.gif le formulaire pour une pièce encastrée aux deux extrémités et soumise à une charge uniforme sur toute sa longueur. Le granite a un module d'élasticité E certainement moins "performant" que l'acier (module de Young d’environ 210 000 MPa), sans doute plus proche de celui du béton (on va dire autour de 50 000 MPa) ce qui en fait un matériaux pas très bon en flexion. D'où l'intérêt d'encastrer cette poutre aux deux extrémités : la déformation est 5 fois moindre que si elle reposait librement sur 2 appuis. Le moment quadratique I correspond à celui d'une section rectangulaire. A toutes fins utiles Amicalement Vincent [Edité le 7/4/2010 par zebulon_]
-
ssgetfirst et activeselectionset
zebulon_ a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
et Dieu sait que j'en ai fait beaucoup... Le if n'est finalement intéressant que lorsqu'il y a un alors ET un sinon. Une dernière chose au sujet de (vla-get-activeselectionset AcDoc) et de l'inutilité de stocker le jeu de sélection dans une variable : si je fais (ssget) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) et qu'au niveau de (ssget) l'utilisateur ne sélectionne rien, ssget renvoie nil mais le vlax-for se met en branle quand même et se plante. Donc, si je veux l'éviter, il faut faire quelque chose comme ça (if (ssget) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) (alert "rien sélectionné") ) si je peux me passer du sinon, j'utilise or ou and, comme dans ton exemple. (and (ssget) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent))) Donc, quand je disais que j'avais besoin de la variable par ailleurs, ce n'étais pas vrai : elle est parfaitement inutile. Amicalement Vincent -
ssgetfirst et activeselectionset
zebulon_ a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Je l'avais écrit comme ça aussi, au départ. Mais le prompt s'affiche dans tous les cas, même lorsqu'il n'y a pas de choix des objets à faire par l'utilisateur dans le cas des grips. Ce n'est qu'une question d'esthétique ;) Par ailleurs, il y a un truc qui m'a perturbé en regardant quelques exemples de tes lisps, c'est l'utilisation des fonctions or et and "toutes seules". Bêtement, je ne les imaginais que dans les expressions test des fonctions if, cond ou while. Du coup, j'ai lu l'aide de or et de and plus en détail et j'ai appris que or évalue les expressions de gauche à droite, en cherchant une expression non-nil. Si une telle expression est trouvée, or ne fait plus d'autres évaluations (c'est ce point qui est intéressant !) et retourne T. Si toutes les expressions sont nil, or retourne nil. and stoppe toute évaluation et retourne nil, si l'une des expressions résulte en nil; la fonction retourne T le cas échéant. exemples : (or T (alert "coucou")) ;;; renvoie T et n'affiche pas "coucou" (or nil (alert "coucou")) ;;; renvoie nil et affiche "coucou" (and T (alert "coucou")) ;;; renvoie nil et affiche "coucou" (alert renvoie nil) (and nil (alert "coucou")) ;;; renvoie nil et n'affiche pas "coucou" Merci Amicalement Vincent [Edité le 1/4/2010 par zebulon_] -
ssgetfirst et activeselectionset
zebulon_ a répondu à un(e) sujet de zebulon_ dans Pour aller plus loin en LISP
Effectivement, je me complique la vie pour rien. Même lorsqu'il y a un filtre, ssget regarde d'abord les grips (si PICKFIRST est à 1). Par contre, si je veux mettre un (prompt "message spécifique") avant le ssget et que ce message ne soit s'afficher que quand il n'y a pas de grips, il faut faire quelque chose de ce style (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (ssget "_I" '((-3 ("RBCADSYS"))))))) (progn (prompt "\nSaisir les reprises de bétonnage à modifier :") (setq ss (ssget '((-3 ("RBCADSYS"))))) ) ) (if ss (setq RB_DIST (getdist "\nEspace entre les symboles de reprise : ")) ) ou bien je me complique encore la vie pour rien ? j'ai bien intégré ce fait, mais j'en avais besoin par ailleur. Amicalement Vincent [Edité le 1/4/2010 par zebulon_] -
Bonjour, souvent, un lisp commence par un ssget pour permettre à l'utilisateur de choisir les entités sur lesquelles le lisp doit intervenir. Avant de proposer ce ssget et lorsque la variable PICKFIRST vaut 1, il faudrait pouvoir exécuter le lisp avec les entités comprises dans le jeu de sélection implicite (les "poignées" pour faire simple). Pour faire cela, j'utilise la fonction (ssgetfirst) (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (cadr (ssgetfirst))))) (setq ss (ssget)) ) pour ensuite passer en revue chaque entité du jeu de sélection ss avec une boucle itérative (repeat ou while). Etant donné que j'utilise de plus en plus les fonctions VLISP, il est plus efficace dans ce cas d'utiliser vla-get-activeselectionset. Le problème se situe au niveau du ssgetfirst, puisqu'il ne crée pas de jeu de sélection actif et il faut préférer (ssget "_I") qui crée un jeu de sélection avec les entités comprises dans le jeu de sélection implicite. (if (not (and (= (getvar "PICKFIRST") 1) (setq ss (ssget "_I")))) (setq ss (ssget)) ) (vlax-for ent (vla-get-activeselectionset AcDoc) (vlax-dump-object ent)) Amicalement Vincent
-
Le titre du sujet c'est "MODERATION", ce qu'on ne peut pas vraiment prétendre de cette phrase. Mais le propre du fantasme n'est-il pas d'être irraisonné et reste le plus souvent une activité ludique imaginaire d'un jeu théâtral où l'on est à la fois l'auteur, l'acteur et le metteur en scène ? Le passage à l'acte reste marginal, malheureusement dans ce cas, faute de belle blonde plantureuse d'1m80, non fumeuse et héritière (veuve ?) qui, de surcroit, essaie tant bien que mal de se servir d'Autocad au péril de sa vie. Mais, on ne sait jamais. Alors, si tu es blonde, belle, plantureuse, sans enfant, non fumeuse, héritière, mais que tu n'as que 1m79, ça l'intéresse aussi... Amicalement Vincent
