rimbo Posté(e) le 10 mars 2004 Posté(e) le 10 mars 2004 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
rimbo Posté(e) le 10 mars 2004 Auteur Posté(e) le 10 mars 2004 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
didier Posté(e) le 10 mars 2004 Posté(e) le 10 mars 2004 Bonsoir RimboHonnê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: Éternel débutant... Mon site perso : Programmer dans AutoCAD
Tramber Posté(e) le 10 mars 2004 Posté(e) le 10 mars 2004 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 ./__\. (.°=°.)
Labletech Posté(e) le 10 mars 2004 Posté(e) le 10 mars 2004 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
didier Posté(e) le 10 mars 2004 Posté(e) le 10 mars 2004 coucouAh 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'extrairele 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
Labletech Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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électionJe 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
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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 ./__\. (.°=°.)
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 (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 ./__\. (.°=°.)
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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 croisj'ai trouvé des lignes très interressantes sous polyligne sous autocad 2004 dans la réponse de didier je continue a bidouillerc'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
Patrick_35 Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 Je m'insinues dans la discutionsPour traiter un jeu de sélection, il faut passer par une boucleIl 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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 ./__\. (.°=°.)
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 Tu devrais utiliser les commandes:OPENWRITE-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 ./__\. (.°=°.)
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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 ./__\. (.°=°.)
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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 ./__\. (.°=°.)
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 (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 ./__\. (.°=°.)
Patrick_35 Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 Oui, Tramber, c'est bien ça, mais je pense que notre ami Rimbo n'a pas tout saisi en ce qui concerne les bouclesJe 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
rimbo Posté(e) le 11 mars 2004 Auteur Posté(e) le 11 mars 2004 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
Tramber Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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 ./__\. (.°=°.)
didier Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 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'arcla 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 proposarrête moi.En tous cas, il faut ABSOLUMENT faire un effortpour être compréhensible de tous.si je ne comprends que dix pour cent de ton messageje vais répondre faux à quatre vingt dix pour cent,Et j'aime pas être Hors Sujet. Amicalement. Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 11 mars 2004 Posté(e) le 11 mars 2004 HelloJ'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 ARCune ligne de base qui rejoint les deux extrémités de l'arcon 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 basejusqu'à 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 basetous les dix centimères en élévation.combien mesure chaque fil ?si c'est çà, j'ai une solution à t'apporterje ne vais pas rabacher, mais la communication n'est pas aisée...amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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