Invité Patrick Posté(e) le 13 décembre 2004 Posté(e) le 13 décembre 2004 La fonction Vlisp suivante renvoie une liste de tous les sommets d'une LWpolyligne: (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget lwpolyline))) lwpolyline est le nom de l'entité LWpolyligne à fournir à la fonction. auteur: Patrick EMIN
Serge Posté(e) le 13 décembre 2004 Posté(e) le 13 décembre 2004 Patrick, Pour ceux qui veulent une fonction plus générale, il y a un exemple daté du 3 septembre. Je ne sais pas comment faire le lien vers ce message. Si quelqu'un .... Serge
Tramber Posté(e) le 14 décembre 2004 Posté(e) le 14 décembre 2004 J'ai pas trouvé le message. Sinon, c'est (url=www..eflfkjfhk.dsfS;fsFsdfsdf.com)lien(/url)[ au lieu de (, of course. ....bah c'est quoi cette nouvelle rubrique !? On connait par coeur cette formule, des fois je la chante dans ma douche :cool: Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
bonuscad Posté(e) le 14 décembre 2004 Posté(e) le 14 décembre 2004 Voici le lien du thème identique http://www.cadxp.com/sujetXForum-106.htm ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
DenisHen Posté(e) le 30 mai 2006 Posté(e) le 30 mai 2006 Alors, comme il est connu que j'ai du mal avec le Lisp, J'aimerai une petite précision, Patrick a écrit (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget lwpolyline))) J'ai l'impression (qui devrait être fausse) que Lambda est le nom de la liste des sommets de la Lwpolyligne et que x et le numéro du sommet ? De plus, le code DXF de 10 étant l'X du point, si on le remplaçait par 20, on aurait l'Y, non ? Qui va être le plus rapide pour me dire que je me suis encore planté ? ? Compte à rebours lancé ! ! Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Tramber Posté(e) le 30 mai 2006 Posté(e) le 30 mai 2006 En Français : le entget donne la liste complète y compris tous les groupes 10 (je ne crois pas qu'on rencontre souvent des 20 et je ne sais pas à quoi ca correspond). De cette liste j'enlève tous les "non 10", lambda étant une fonction qui s'applique à tous les membres de la liste retournée par ENTGET. Ensuite, je fais un MAPCAR 'CDR pour enlever tous les en-tête de codes de groupe, tous les 10 de (10 x y) pour donner (x y). Avec un peu d'habitude, ca devient super clair. Je n'ai plus de problèmes à comprendre ce code. De l'eau a coulé sous les ponts. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
DenisHen Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Bon, alors, si je commence ( seulement ) à comprendre... mapcar lance une fonction sur une liste ou des variables ( merde, pas variables mais symboles... désolé, faut que ça rentre ) par contre lambda, en anglais (dans l'aide) c'est super pas évident...Et pour 10, s'il n'y a pas de 20, y-a t'il d'autre ... "entête" que 10 ? :o Je cherche à tout comprendre sur les LW pour pouvoir écrires les distences entre les sommets, leur XY et aussi dessiné, sur la LW une multiligne... sans compter lui donner des Xdata, quand je comprendrai aussi ce truc... Ca viendra, grace à ce site.. Et à votre patience... Pourvu qu'elle ne se tarisse pas... ;) Mais j'ai encore beaucoup besoin d'aide et de conseils... Merci pour tout... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Salut, Mapcar retourne une liste qui est le résultat de l'exécution d'une fonction dont chaque élément d'une (ou de plusieurs, mais on verra çà plus tard) liste est l'arguments. Avec la fonction cdr, qui retourne une liste sans son premier élément : (cdr '(1 2 3)) -> (2 3) (cdr '(10 1.0 2.0) -> (1.0 2.0) (mapcar 'cdr '((10 1.0 2.0) (10 5.0 7.0) (10 -8.0 6.0))) -> ((1.0 2.0) (5.0 7.0) (-8.0 6.0)) Lambda définit une fonction anonyme (comme defun définit une fonction nommée) (lambda (x) (= (car x) 10)) pourrait être remplacé par MaFonction définie avec un defun : (defun MaFonction (x) (= (car x) 10)) Et on pourrait écrire (vl-remove-if-not 'MaFonction (entget lwpolyline)) Lambda sert donc à eviter d'avoir à faire un defun. 10 est le code groupe DXF pour les sommets d'une lwpolyligne (pour le point départ d'une ligne, pour le centre d'un cercle ...). Chaque entité AutoCAD a ses données DXF accessibles avec la fonction LISP (entget ...) sous forme de liste dont chaque élément est lui même une liste (ou paire pointée) dont le premier terme est le code de groupe (voir ici). Essaye de faire (entget (car (entsel))) sur une lwpolyligne (ou sur d'autres entités), tu auras la "liste entget" de l'entité. Les références DXF sont détaillées dans l'aide aux dévellopeurs (en français, tu n'as plus d'excuses !) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 2 juin 2006 Posté(e) le 2 juin 2006 Bonsoir (gile)... Bon, je m'en vais prendre de tes nouvelles.... Depuis le temps que tu m'aides.... J'espère donc que tu te porte bien... Et on en revient au Lisp^... Je ne me trompe pas... En DXF, 10=X 20=Y 30=Z C'est pour cela que ja na saisi âs le "DXF Lisp" et le "DXF AutoCAD" à moins que je me sois encore gouré... Mais je compte trop sur toi... Je lis souvent "Lisp" et "Code DXF" en même temps... Serait-ce le réelle code des DWG ? Bon..... Je ne sais plus comment te remercier....... Alors : Merci..... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 2 juin 2006 Posté(e) le 2 juin 2006 Il y a effectivement pour certains code de groupe une différence entre les les codes de groupe selon qu'ils s'appliquent aux fichies DXF ou aux applications. Vois l'aide aux développeurs -> Référence DXF -> Format DXF -> Conventions de formatage dans ce manuel d'utilisation et toujours dans Référence DXF -> Section ENTITIES -> LWPOLYLINE. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 2 juin 2006 Posté(e) le 2 juin 2006 Waow... (gile)... Merci... Mais cette réponce, je l'imprime... Car dans le truc toudu... Le chemin d'accès est bigrement vicieux... Encore une fois..... (gile)...... ;) Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 2 juin 2006 Posté(e) le 2 juin 2006 Sinon, pour un accès rapide aux données DXF (pour application) d'une entité, voir ce sujet, personnellement, j'ai ajouté dans le menu Outils -> Renseignement une commande LST_DXF : (defun C:LST_DXF () (mapcar 'print (entget (car (entsel)))) (textscr) (princ) ) [Edité le 2/6/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 16 octobre 2006 Posté(e) le 16 octobre 2006 Merci (gile), J'avais oublié çe sujet... Mais dans "(mapcar 'print (entget (car (entsel))))", je ne comprend pas commant "mapcar" sait quand il faut passer au code DXF suivant... J'aimerai isoler tous les code DXF 10, en gros, j'avais fais ça : (cond ((= (cdr (assoc 0 (entget poly))) "POLYLINE") ) ((= (cdr (assoc 0 (entget poly))) "LWPOLYLINE") (progn ;(princ entlast) (while (/= "SEQEND" (cdr (assoc 0 (entget poly)))) (setq som (cdr (assoc 10 (entget poly)))) (princ som) (setq som_x (rtos (car som) 2 3)) (princ som_x) (setq som_y (rtos (cadr som) 2 3)) (princ som_y) ) ;_ Fin de while ;(close f) ) ;_ Fin de progn ((T) (princ "\nMaivaise pioche") ) ) (princ) ) Mais j'ai encore dû me plonter quelque part, J'ai ça en réponse : 1045.6615039.441(1045.66 5039.44)1045.6615039.441(1............ Bref, les coordonnées du premier sommet... som=(1045.66 5039.44)som_x=1045.661som_y=5039.441 Mais je n'arrive pas à obtenir les autres coordonnées, T'as un truc pour m'aider à m'en sortir ? Merci encore, Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 16 octobre 2006 Posté(e) le 16 octobre 2006 Denis, tu confonds, l'expression pour récupérer les coordonnées d'une polyligne "optimisée" est celle donnée dans le premier message de ce fil. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 16 octobre 2006 Posté(e) le 16 octobre 2006 Merci des milliards de fois (gile) ! ! Denis, tu confonds, l'expression pour récupérer les coordonnées d'une polyligne "optimisée" est celle donnée dans le premier message de ce fil Je dois confondre encore, mais grace à tes liens, j'ai réussi à faire un truc qui me servira dans ma cotation de polyligne : J'ai ma routine : (defun c:CotPoly () (setq ename (car (entsel "\nSelectionnez la polyligne: "))) (princ (strcat "\nEntité sélectionnée :" (cdr (assoc 0 (entget ename))))) (getVertices ename) ;au retour, mes coordonnées sont dans return (XY du premier point : (car return) ) ;_ Fin de defun Et une routine piquée à Serge : ;;; getVertices ;;; Retourne une liste de sommets ;;; Usage (getVertices ename), où le ename s'obtient par un entsel, un ssget, etc. (defun getVertices ( ename / plineGet return vertex vertexGet ) (setq return nil) (cond ((or (/= (type ename) 'ENAME) (not (setq plineGet (entget ename)))) (setq return nil)) ((= "POLYLINE" (cdr (assoc 0 plineGet))) (setq vertex (entnext ename)) (while (= "VERTEX" (cdr (assoc 0 (setq vertexGet (entget vertex))))) (setq return (cons (cdr (assoc 10 vertexGet)) return)) (setq vertex (entnext vertex)) ) (setq return (reverse return)) ) ((= "LWPOLYLINE" (cdr (assoc 0 plineGet))) (setq return (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) plineGet))) ) (t (setq return nil)) ) return ) J'ai du mal à comprendre cette routine car elle mélange LiSP et Visual LiSP... Merci encore (gile).... Une petite question encore : peut-on compter les éléments dans une liste... J'aimerai savoir combien de point j'ai dans ma lwpolyligne ou dans ma polyligne... En tous cas, merci encore, Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 16 octobre 2006 Posté(e) le 16 octobre 2006 Ah ah ah ! ! ! Des milliers de millons de milliards de mercis à vous tous ! ! Voici ma routine qui cote une polyligne, si elle peut vous servir... (defun c:CotPoly (Haut) ; Haut=Hauteur de texte en milimètre papier (setq Haut 2) (setvar "cmdecho" 0) (setvar "dimzin" 3) (if (= (setq Ech (vlax-ldata-get "Phalene" "Ech1")) nil) (c:phEch) ) ;_ Fin de if (setq ename (car (entsel "\nSelectionnez la polyligne: "))) (getVertices ename) (setq pp (car return)) (while (not (equal (car return) (car (reverse return)))) ;(setq dp (car return) (setq p1 (car return)) (setq p2 (car (cdr return))) (setq rot (- 500 (* 200 (/ (angle p1 p2) pi)))) (if (<= rot 400) (- rot 400) ) ;_ Fin de if (setq p4 (polar p1 (angle p1 p2) (/ (distance p1 p2) 2))) (setq p5 (polar p4 (- (angle p1 p2) (/ pi 2)) (/ Ech 1000))) ;(command "point" p4) ;(command "point" p5) (princ (strcat (rtos (Distance p1 p2) 2 2) " m")) (command "-style" "Cote" "simplex.shx" "0" "0.7" "1" "N" "N" "N") (setq Texte (strcat (rtos (Distance p1 p2) 2 2) " m")) (command "_.text" "j" "hc" "_none" p5 (/ (* Haut Ech) 1000.0) rot Texte) ;_ Fin de command (setq return (cdr return)) ) ;_ Fin de while (princ "\nSorti de While\nReturn = ") (setq return (car return)) (setq rot (- 500 (* 200 (/ (angle return pp) pi)))) (if (<= rot 400) (- rot 400) ) ;_ Fin de if (setq p4 (polar return (angle return pp) (/ (distance return pp) 2))) (setq p5 (polar p4 (- (angle return pp) (/ pi 2)) (/ Ech 1000))) ;(command "point" p4) ;(command "point" p5) (princ (strcat (rtos (Distance return pp) 2 2) " m")) (command "-style" "Cote" "simplex.shx" "0" "0.7" "1" "N" "N" "N") (setq Texte (strcat (rtos (Distance return pp) 2 2) " m")) (command "_.text" "j" "hc" "_none" p5 (/ (* Haut Ech) 1000.0) rot Texte) ;_ Fin de command ) ;_ Fin de defun Et je donne aussi la routine pour l'échelle du dessin que "cotpoly" utilise :Faire du nettoyage dans cette routine... Elle me sert à plusieurs trucs, j'en ai déjà fais, mais si j'en fais de trop, j'ai peur qu'elle ne fonctionne plus ou mal...(defun c:phEch ( ) (setq Ech (vlax-ldata-get "Phalene" "Ech1")) (if Ech ;; si Ech est déjà défini (progn (if (setq Ech (getreal (strcat "\nAncienne échelle primaire (1/" (rtos Ech 2 0) ") - Nouvelle échelle primaire : 1/" ))) ;; Si Ech est re-défini (vlax-ldata-put "Phalene" "Ech1" Ech) ) ;_ Fin de if ;(princ (strcat "\nEchelle primaire = 1/" (rtos (vlax-ldata-get "Phalene" "Ech1") 2 0))) ;_ Fin de princ ) ;_ Fin de progn ;; si Ech n'est pas encore défini (progn (setq Ech (getreal "\nÉchelle du dessin primaire 1/")) (vlax-ldata-put "Phalene" "Ech1" Ech) ;(princ (strcat "\nEchelle primaire = 1/" (rtos (vlax-ldata-get "Phalene" "Ech1") 2 0))) ) ;_ Fin de progn ) ;_ Fin de if (menucmd (strcat "GPhalene.ID_echa" (rtos Ech 2 0) "=!.")) ) Je suis super content ! ! :D C'était un truc dont j'avais besoin depuis TRÈS lontemps ! ! ! :D Je ne penssais pas y arrivé ! ! :D Même en utilisans un maximum de routine extérieur ( = autre auteur que moi) ! ! :D Sincèrement, merci... :D Denis... (super content) ;) Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
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