Aller au contenu

Messages recommandés

Posté(e)

voilà je dois pour demain faire un lisp qui va me permettre de medonner les distances de plusieurs lignes:

une autoroute plusieurs arc symbolise des ouverture sous voies, l'ingé a besoin des distances de ses ouvertures en pas de 0,10 m (chaque ouverture les distances de chaque lignes..) a compter bonjour l'angoisse...

 

pour le lisp je penser a la structure suivante,

créer un jeu de sélection : (setq jx(ssget)

sortir la distance de chaque objet dans l'ordre et la je sèche grave,

peut on aller chercher dans la liste de l'objet ou lancer la commande distance mais voit pas comment vue que ça prends 2 point de sélection...

 

Merci

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

je cherche en fait a trouver le terme qui va me permettre d'extraire dans la liste de la ligne la distance.

je connais : ((= "_line" (jx (assoc 0 (entget (ssname js indice)))))

et d'autre mais pas l'ordre de la liste de la ligne pour extraire la distance....

Je cherche les infos dans l'aide mais ????

Existe t il un fichier ou autres qui donne les ordres et référence d'extraction???

merci

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Bonsoir Rimbo

Honnêtement je n'ai rien compris à l'énoncé de ton problème.

Pour créer le moindre algorythme, il faut être TRES explicatif.

Décomposer pas à pas ce qu'il y a à faire.

il semble, néanmoins, que tu as besoin de la longueur d'une entité "LIGNE".

Donc tu vas utiliser la commande intégrée "DISTANCE"

Hypothèse : dans ton lisp le nom de l'entité ligne est stocké dans la variable "ent".

 

extraction du point de départ :

(setq PD (cdr(assoc 10 (entget ent))))

 

extraction du point d'arrivée :

(setq PA (cdr(assoc 11 (entget ent))))

 

la distance sera obtenue par :

(setq LongueurEnt ( distance PD PA)).

 

En espérant ne pas être Hors Sujet,

amicalement :yltype:

Posté(e)

Dans l'aide, tu retrouves les codes DXF.

 

Rimbo cherche peut-être la distance entre le dernier point d'une ligne et le début dune autre (vide de lignes, car ce sont des arcs qui démarrent ou finissent en ces points, si j'ai compris) ?

 

Peu importe.

Pour que la routine soit comprise, peut-être nous devrions savoir s'il compte saisir les lignes dans l'ordre ou ?)

 

A propos des codes, je crois qu'il y en a 1 pour la longueur. Mais, comme je disais + haut, c'est peut-être un champ inutile.

 

DIDIER, est-ce que distance est une fonction 3D, car, on ne sait jamais ! ?

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Excuse moi Didier je réponds à ta place. Oui la fonction distance peut être 3D à condition que les points saisis le soient eux aussi:

 

 Commande: !p1
(10471.4 9030.42 0.0)

Commande: !p2
(10471.4 9030.42 100)

Commande: (distance p1 p2)
100.0

 

Je vous rejoins tous sur la clarté de la question !! on a du mal à comprendre et donc on ne peut que spéculer !!

 

Rimbo ce serait à mon avis bien que tu fabriques un petit dwf ou un pdf ou un jpg (je n'ai pas d'apriori) expliquant graphiquement ce que tu cherches et que tu pourrais rendre consultable sur ce forum.

Sinon on ne s'en sortira pas ..

Inversement n 'oublie pas que nous sommes dans la rubrique Débuter en Lisp. Si ton pb est trop complexe ... il devra être traité peut-être un peu plus tard ...

Formateur

ATC Autocad - Mechanical - Inventor - Electrical

Posté(e)

coucou

Ah ben oui, mais c'est bien sûr,

le pôv didier, il répond pour de la 3D.

Qu'à celà ne tienne, il fournit aussi le moyen d'extraire

le distance plane de deux extémités d'une ligne 3D

dans ce qui suit les points p1 et p2 ont des Z,

la distance, en revanche est à l'horizontale

 (defun DistH ()
(setq ent (car(entsel"\nChoix d'une ligne\n")))
(setq p1 (cdr(assoc 10(entget ent))))
(setq p2 (cdr(assoc 11(entget ent))))
(setq distH 
(sqrt (+ (* (- (car p1) (car p2))(- (car p1) (car p2)))
          (* (- (cadr p1) (cadr p2))(- (cadr p1) (cadr p2)))
))
)
 )

c'est réparé

amicalement

Posté(e)

Voilà une jolie fonction qui pourrait entrer dans le glossaire de 'Débuter en lisp' !!

Merci Didier pour cette mise à plat du pb !! ;)

 

Au passage un petit cours de géométrie fondamentale ca ne fait pas de mal.... :P

 

D'ailleurs pour dire des banalités , on parlait dans une autre rubrique de l'utilité de définir ses objectifs en matière de progammation, et bien il y aussi un aspect plus que fondamentale dans la programmation Autolisp: c'est Autocad.

Et Autocad s'adresse à des dessinateurs et un dessinateur doit avoir des connaissances mini en matière de géométrie surtout s'il veut faire un peu de programmation.

 

La mise à plat de bonnes vieilles formules comme pythagore , les produits scalaires, les produits vectoriels et les angles modulo pi, permet de se faire une bonne bibli de fonctions stables et fort utiles. On en reparlera au fur et à mesure du temps dispo ..

Formateur

ATC Autocad - Mechanical - Inventor - Electrical

Posté(e)

merci pour la rapidité des réponse et désolé je pensé etre clair mais bon j'ai fais le dwf mais je sais toujours pas comment le lier a ce texte donc donner moi vos adresse mail ou la combine pour vous le faire parvenir.

 

je réexplique.

J'ai des arc qui représente en vue 2D de face des ouverture sous autoroute (pas de 3D)

il a fallut que je trace des lignes en decaler de 0.1 a l'intérieur de ces arcs.

Donc mes arc sont remplis de ligne espacer de 0.1m et il me faut dans l'ordre de sélection bas en haut ou haut en bas et gauche à droite les longueurs de chaque lignes donc sortir sur une liste tout cela.

 

suis je plus clair??? y a pas de math la dedans ce sont des lignes horizontales de différentes longueurs espacé de 0.1m qu'il faut que je liste dans l'ordre de sélection

Je vais déjà me servir de ce que vous m'avez donné

j'ai regardé la liste dxf mais y a pas pour la longueur... connait pas le code???? :casstet:

et extraction pour écrire une liste ?

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Codes de groupe line

 

Codes de groupe

Description

 

100

Marqueur de sous-classe (AcDbLine)

 

39

Epaisseur (facultatif, valeur par défaut = 0)

 

10

Point de départ (dans le SCG)

DXF : valeur X ; APP : point 3D

 

20, 30

DXF : valeurs Y et Z du point de départ (dans le SCG)

 

11

Extrémité (dans le SCG)

DXF : valeur X ; APP : point 3D

 

21, 31

DXF : valeurs Y et Z de l'extrémité (dans le SCG)

 

210

Direction d'extrusion (facultatif ; valeur par défaut = 0, 0, 1)

DXF : valeur X ; APP : vecteur 3D

 

220, 230

DXF : valeurs Y et Z de la direction d'extrusion (facultatif)

 

 

Tu as raison, je trouve pas la longueur. Bonne nouvelle c'est en Francais, je croyais que ca allait être en Anglais.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

ok j'ai essayé ça

 (defun c:lligne()
 (setq ent (ssget))
 (setq pd (cdr(assoc 10 (entget ent))))
 (setq pa (cdr(assoc 11 (entget ent))))
 (setq longueurent (distance pd pa))
 (princ)
 )

 

mais ça marche pas erreur: :casstet: erreur:type d'argument incorrect: lentityp

de plus pas le lisp pour extraire en liste les distance et pour mettre tout cela dans l'ordre de la sélection voir plus bas

 

 

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

 (defun c:lligne()
(setq ent (ssget))
 (setq SS  (entget(ssname ent 0)))
 (setq  PP (cdr (assoc 10 SS)))
 (setq  PP1 (cdr (assoc 11 SS)))
(setq longueurent (distance PP PP1))
(princ)
)

 

RAPPEL: SSGET donne un jeu de selection , pas un entité, il faut donc faire un SSNAME ou utiliser ENTSEL à la place de ENTGET (à confirmer).

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

ok tramber je sais mais là j'essaye déjà de le faire pour une ligne pour aprés le faire pour plusieurs.

J'ai vraiment trop de lacune et je tapes trop haut je crois

j'ai trouvé des lignes très interressantes sous polyligne sous autocad 2004 dans la réponse de didier

je continue a bidouiller

c'est un bon exo quand même

 

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Je m'insinues dans la discutions

Pour traiter un jeu de sélection, il faut passer par une boucle

Il faut aussi trier les infos que l'on peut recevoir d'un jeu de sélection (on ne sélectionne pas forcement que des lignes) et vérifier aussi qu'elle n'est pas vide

 

 (defun c:lligne(/ ent entselec n pa pd)
 (setq ent (ssget))
 (if ent
   (progn
     (setq n 0)
     (while (ssname ent n)
       (setq entselec (entget (ssname ent n)))
       (if (= (cdr (assoc 0 entselec)) "LINE")
         (progn
           (setq pd (cdr (assoc 10 entselec)))
           (setq pa (cdr (assoc 11 entselec)))
           (setq longueurent (distance pd pa))
           (alert (strcat "La longeur de l'entité " (itoa n) " est de " (rtos longueurent)))
         )
       )
       (setq n (1+ n))
     )
   )
 )
 (princ)
)

Pour Tramber, le entsel fait la sélection que d'une seul entité

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Tu as vu le:

(setq entselec (entget (ssname ent n))) de Patrick_35 ?

 

Moi je t'ai proposé :

(setq SS (entget(ssname ent 0)))

en sachant que tu ne sélectionnais qu'un objet (0 est le premier de la liste, après tu peux incrémenter si la longueur de ta selection est supérieur à 1 objet).

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

j'apprécie et ça marche du tonnerre :D

j'ai vérifié toutes les commandes que tu m'as donné patrick_35 pour apprendre, j'analyse chaque ligne c'est beau :o

bon je planche pour sortir cela sur le bloc note ou excell afin d'avoir la liste mais là pas eu de cours a ce niveau si vous pouvez essayer au moins de me guider ;)

merci

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Tu devrais utiliser les commandes:

OPEN

WRITE-LINE

 

Assez faciles, elle te permettent d'écrire une lgine de résultat à chaque boucle dans un fichier texte.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

je pense avoir trouver pour open mais write-line ? vive le bouquin autolisp 12

 

 (defun c:lligne(/ ent entselec n pa pd)
(setq ent (ssget))
(if ent
(progn
(setq n 0)
(while (ssname ent n)
(setq entselec (entget (ssname ent n)))
(if (= (cdr (assoc 0 entselec)) "LINE")
(progn
(setq pd (cdr (assoc 10 entselec)))
(setq pa (cdr (assoc 11 entselec)))
(setq longueurent (distance pd pa))
(alert (strcat "La longeur de l'entité " (itoa n) " est de " (rtos longueurent)))
)
)
(setq n (1+ n))
)
)
)
(setq l (open "text ligne.txt" "w"))
 (write-line "longueur de l'entité" l)
 (princ)
)

c'est la derniere ligne ou je pense sécher et peut-etre faut il reformater des choses...???

 

 

 

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Je l'ai plus en tête mais je peux te dire que ton OPEN doit être ouvert au tout début et non-inclus dans la boucle. Il doit être ouvert une seule fois.

 

Tu es bien parti.

Je me suis peut-être trompé un peu sur WRITE-LINE

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Tu dois aussi faire un CLOSE de l'autre côté de la boucle:

 

Writes a string to the screen or to an open file

 

(write-line string [file-desc])

 

Arguments

 

string

 

A string.

 

file-desc

 

A file descriptor for an open file.

 

Return Values

 

The string, quoted in the normal manner. The quotes are omitted when writing to a file.

 

Examples

 

Open a new file:

 

Command: (setq f (open "c:\\my documents\\new.tst" "w"))

 

#

 

Use write-line to write a line to the file:

 

Command: (write-line "To boldly go where nomad has gone before." f)

 

"To boldly go where nomad has gone before."

 

The line is not physically written until you close the file:

 

Command: (close f)

 

nil

 

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

(defun c:lligne(/ ent entselec n pa pd)

(setq ent (ssget))

(setq l (open "text ligne.txt" "w"))

(if ent

(progn

(setq n 0)

(while (ssname ent n)

(setq entselec (entget (ssname ent n)))

(if (= (cdr (assoc 0 entselec)) "LINE")

(progn

(setq pd (cdr (assoc 10 entselec)))

(setq pa (cdr (assoc 11 entselec)))

(setq longueurent (distance pd pa))

;;;;;; (alert (strcat "La longeur de l'entité " (itoa n) " est de "))

(write-line (rtos longueurent) l)

)

)

(setq n (1+ n))

)

)

)

 

 

(princ)

)

 

Je pense que ca doit marcher (je peux pas tester maintenant)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Oui, Tramber, c'est bien ça, mais je pense que notre ami Rimbo n'a pas tout saisi en ce qui concerne les boucles

Je pourrai traduire une boucle while --> tant que

 

La boucle qui est faite dans le présent exemple est

tant que (ssname ent n) n'est pas nil alors

...

...

(setq longueurent (+ longueurent (distance pd pa))) j'additionne les longueurs dans la boucle

...

...

(setq n (1+ n)) j'incrément de 1 pour passer à la sélection suivante

...

...

) je ferme le while

 

(alert (strcat "La longeur Total des entitées est de " (rtos longueurent))) j'affiche le résultat

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

exact j'ai un peu de mal avec les boucles surtout pour savoir quoi placer ou (enfin quelle ligne...)

Merci je vais plancher sérieusement la-dessus mais tramber ton lisp, le fichier texte il s'ouvre tout seul , vaut-il mieux que je lui donne un chemin ?

Cordialement

 

Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia

 

Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM

Posté(e)

Bien sur tu peux mettre un chemin.

 

Je dis qu'il faut faire un CLOSE et je ne le fais même pas.

N'oublies pas de la faire à la fin du programme (hors de la boucle, avant le PRINC)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

OUAIS !!!!!!!

Je viens de percuter, ben dis donc, t'es pas clair.

Ai-je bien compris :

Les différentes longueurs des lignes que tu veux mesurer,

sont les "CORDES" de l'arc.

la première est la liaison entre les deux extrémités de l'arc

la deuxième est la première 10 centimètres plus haut et ainsi de suite ...

Est ce bien çà, si c'est le cas c'est pas dur à faire.

et on va faire un joli tableau pour la réponse.

Je commence un truc dans ce sens.

Si j'ai mal interprété ( au vrai sens du terme ) tes propos

arrête moi.

En tous cas, il faut ABSOLUMENT faire un effort

pour être compréhensible de tous.

si je ne comprends que dix pour cent de ton message

je vais répondre faux à quatre vingt dix pour cent,

Et j'aime pas être Hors Sujet.

 

Amicalement.

Posté(e)

Hello

J'espère très honnêtement avoir compris,

car mon petit programme est prêt.

La seule chose qui me reste à faire, et là, je patiente jusqu'à ta réponse,

C'est le formatage de la réponse, ja fait quoi ?

un fichier texte ?

une case de dialogue à l'écran ?

un texte au milieu de chaque ligne ?

libre à Toi, tout est possible...

Je récapitule mon hypothèse :

un ARC

une ligne de base qui rejoint les deux extrémités de l'arc

on divise la FLECHE de cet ARC par des segments de dix centimètres,

on trace une ligne passant par le premier point à dix centimètres de la base

jusqu'à toucher l'ARC des deux côtes, donc on crée une nouvelle CORDE.

et ainsi de suite ...

Le but est de mesurer chaque CORDE.

 

exemple pratique :

dans un tunnel de section demi circulaire,

je dois tendre un fil parallèle à la base

tous les dix centimères en élévation.

combien mesure chaque fil ?

si c'est çà, j'ai une solution à t'apporter

je ne vais pas rabacher, mais la communication n'est pas aisée...

amicalement

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é