Aller au contenu

Sommets d\'une LWpolyligne


Invité Patrick

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
  • 1 an après...
Posté(e)

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)

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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

  • 4 mois après...
Posté(e)

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.661

som_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)

Posté(e)

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)

Posté(e)

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)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é