-
Compteur de contenus
3 442 -
Inscription
-
Dernière visite
-
Jours gagnés
44
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par La Lozère
-
(gile) merci pour ton exemple. J'avais en fait tout sous la main, il me manquait juste strcat et (setq *defaultRadius* radius) (setq radius *defaultRadius*) Salut Didier, Tu ne me manques pas de respect, mais comme pour Autocad, et très souvent pour toutes choses il y a plusieurs façon d'arriver à ces fins. Et dans le cas présent, je n'ai pas la même que toi. Voici comment fonctionne globalement mon lisp: Au lancement de la commande il me demande si je veux extraire des valeurs d'un fichier ou les saisir manuellement Donc, si la réponse et non: 1- je sélectionne mes objets du profil voulu 2- je sélectionne par clic le point de base 3- je saisi manuellement ou par clic les coordonnées de destination 4- je saisi manuellement le gisement 5- A la validation tout ce met en place 6- Si besoin je relalance la commande Si la réponse est oui (avec la modif faite grâce à (gile): 1- une boite de dialogue s'ouvre afin de sélectionner le CSV dans lequel se trouve les données du type "PT-1;815679.200;6299727.790;78.056;292.310", "PT-2;815659.345;6299725.385;78.256;292.339", etc et autant de ligne que de profils 2- Début de la boucle 3- je sélectionne mes objets du profil voulu 4- je sélectionne, par clic, le point de base 5- Je sélectionne, par clic, manuellement ou je valide la proposition, les coordonnées de destination 6- Je saisie ou je valide la proposition de gisement 7- A la validation tout ce met en place 8- etc... jusqu'à la fin de la boucle, soit la fin des lignes du CSV 9- Fin de la boucle Donc, pour l'instant tout marche. Sauf que quand je sort de la boucle str2lst là, ça bug
-
Alors: 1 - Dans le fichier CSV sur chaque ligne il y a des info du numéro de point, les coordonnées du point et le gisement 2- Mon lisp est censé déplacer des objets sélectionnées aux coordonnées du point (et d'autre actions). 3- Pour chaque ligne du CSV, je sélectionne des objets différents, d'où le WHILE et ce jusqu'à la fin du CSV Le truc, c'est qu'en modifiant le code suivant les info de (gile) à savoir sortir str2lst de la boucle, j'ai l'impression que mes variables (coordonnées du point, et autres)ne change pas entre chaque sélection d'objet. Je sélectionne mes premiers objets, et hop ça part au bon endroit. Suite de la boucle. Je sélectionne mes nouveaux objets, et patatra, ça part au même endroit que précédemment. Alors que les variable aurais du changer et prendre les valeurs de la deuxième ligne. Ca ne faisait pas ça quand str2lst était dans la boucle. Mon CSV en PJ Classeur1.zip
-
Merci (gile). Le truc c'est que si je sort la fonction str2lst de la boucle, ça ne marche plus. Il me déplace mes objets de chaque séquences aux coordonnées de la première ligne de mon fichier CSV. Voici le code modifié: (defun c:gpoi (/ fichier sep pos str lst num_pt xzp yzp zzp gis zp str2lst kw *error* sel pb ) ;;; ;;;gestion d'erreur (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (if fichier (close fichier) ) (princ) ) ;;; (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;;; (initget 1 "Oui Non") (setq kw (getkword "\nVoulez-vous utiliser un fichier csv? [Oui/Non]: " ) ) ;;; ;;; Boucle pour OUI (if (= "Oui" kw) (progn (setq fichier (open (getfiled "Fichier .CSV à ouvrir" "" "csv" 8) "r" ) ) ;;; (setq str (read-line fichier)) (while (setq lst (str2lst str ";")) (setq num_pt (car lst)) (setq xzp (atof (cadr lst))) (setq yzp (atof (caddr lst))) (setq zzp (atof (cadddr lst))) (setq gis (atof (car (cdr (cdr (cdr (cdr lst))))))) (setq zp (list xzp yzp zzp)) (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) ;;; ;;;Déplacement (command "_move" sel "" pb zp) (command "3DROTATION" sel "" "x" zp "300") (command "_rotate" sel "" zp gis) ) (close fichier) ) ) ;;; ;;; ;;; Boucle pour NON (if (= "Non" kw) (progn ;;; Entrée utilisateur (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) (setq zp (getpoint pb "\nSpécifier les coordonnées du ZP: ")) (setq gis (getreal "\nSpécifier la valeur du gisement: ")) ;;; ;;;Déplacement (command "_move" sel "" pb zp) (command "3DROTATION" sel "" "x" zp "300") (command "_rotate" sel "" zp gis) ;;; ) ) (princ) )
-
Non, je ne veux pas sélectionner les valeurs dans le fichier texte. Dans mon lisp, j'ai 2 options. Soit je rentre les valeurs de ZP et GIS manuellement, soit elles sont issue directement d'un fichier CSV. D'où la question: (initget 1 "Oui Non") (setq kw (getkword "\nVoulez-vous utiliser un fichier csv? [Oui/Non]: " Ce que je voudrais, c'est qu'en répondant oui à la question, j'ai la possibilité de modifier ces valeurs manuellement, mais en ayant par défaut les valeurs du listing. Sur Covadis, on a un peu ça quand on lance la commande de création de polyligne 3D (commande Covadis) et qu'on choisit l'option "Saisir l'altitude pour chaque point". Si on clic en accrochage objet un point en 3D, il va nous proposer la valeur de ce point 3D, mais on peut aussi la modifier. Exemple: http://img4.hostingpics.net/pics/734165Capture.jpg
-
Bonjour, Bon maintenant que CADXP est de retour, je vais pouvoir poser mes questions ;) La première, pourquoi dans certaines conditions d'ouverture de fichier, pas tout le temps, j'ai ce message après avoir sélectionné mon CSV. La deuxième, ans le cas d'une utilisation avec listing, je souhaite poser une question du genre: "Spécifier les coordonnées du ZP:" et "Spécifier la valeur du gisement:" mais avec une proposition de valeurs issus du listing. Genre: "Spécifier les coordonnées du ZP <821493.123,6302456.858,84.556>:" et "Spécifier la valeur du gisement <242.635>:". Ce qui permettrait de n'avoir qu'à valider. Mais je ne sais pas comment faire, et je n'ai rien trouvé. Merci. Voici mon code: (defun c:gpoi (/ fichier sep pos str lst num_pt xzp yzp zzp gis zp str2lst kw sel pb ) (command "_.undo" "_group") ;;; ;;;gestion d'erreur (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (if fichier (close fichier) ) (princ) ) ;;; (initget 1 "Oui Non") (setq kw (getkword "\nVoulez-vous utiliser un fichier csv? [Oui/Non]: " ) ) ;;; ;;; Boucle pour OUI (if (= "Oui" kw) (progn (setq fichier (open (getfiled "Fichier .CSV à ouvrir" "" "csv" 8) "r" ) ) ;;; (while (setq str (read-line fichier)) (defun str2lst (str sep / pos) (setq sep ";") (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (setq lst (str2lst str sep)) (setq num_pt (car lst)) (setq xzp (atof (cadr lst))) (setq yzp (atof (caddr lst))) (setq zzp (atof (cadddr lst))) (setq gis (atof (car (cdr (cdr (cdr (cdr lst))))))) (setq zp (list xzp yzp zzp)) (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) ;;; ;;;Déplacement (command "_move" sel "" pb zp) (command "3DROTATION" sel "" "x" zp "300") (command "_rotate" sel "" zp gis) ) (close fichier) ) ) ;;; ;;; ;;; Boucle pour NON (if (= "Non" kw) (progn ;;; Entrée utilisateur (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) (setq zp (getpoint pb "\nSpécifier les coordonnées du ZP: ")) (setq gis (getreal "\nSpécifier la valeur du gisement: ")) ;;; ;;;Déplacement (command "_move" sel "" pb zp) (command "3DROTATION" sel "" "x" zp "300") (command "_rotate" sel "" zp gis) ;;; ) ) (command "_.undo" "_end") (princ) ) PS: Didier, je ne t'ai pas oublié ;)
-
Merci à toute l'équipe
-
Bonjour Thierry, je reviens sur ce sujet, car avec la commande Covadis, je trouve qu'il y a un truc qui ressemble fortement à un bug (ou pas...). Voilà, j'ai une tranché avec 3 fourreaux, et donc je veux mettre en 3D cette ensemble pour rendre les choses plus visuelle. Voici mon profil type: http://pimg.imagesia.com/fichiers/1bb/capture_imagesia-com_1bb8p_large.JPG Quand je suis en ligne droite, tout va bien: http://pimg.imagesia.com/fichiers/1bb/capture_imagesia-com_1bb8s_large.JPG http://pimg.imagesia.com/fichiers/1bb/capture_imagesia-com_1bb8r_large.JPG Par contre après avoir fait un coude à 90° environ, tout par en c.... J'ai mes fourreaux qui se retrouve plus dans la configuration de départ: http://pimg.imagesia.com/fichiers/1bb/capture_imagesia-com_1bb8t_large.JPG http://pimg.imagesia.com/fichiers/1bb/capture_imagesia-com_1bb8u_large.JPG Je pense qu'il y a une mauvaise interprétation des décalages dans les variations d'angles de l'axe qui se cumulent pour finir par avoir une mauvaise représentation. Pour palier à ça, je suis obliger de définir: - Soit 3 chemins distincts. - Soit de passer par les commandes natives Autocad d'extrusion d'objets, et là, pas de soucis. C'est cette manip qui me fais dire qu'il y a un bug dans la commande Covadis. Une idée? Mauvaise utilisation de ma part, ou commande pas faite pour ça, ou bug? Merci
-
Bonjour Patrick, Effectivement, je n'avais fait attention à sortir la fonction de (gile) de la boucle. En y réfléchissant, c'est logique. Pour plusieurs ligne je compte sur le while. Pour l'instant, mon deuxième bout de code traite toutes les lignes du fichier, mais ne retient que la dernière ligne car justement je suis dans la boucle while. La prochaine étape est d'intégrer (en le modifiant) le premier bout de code dans la boucle while du deuxième bout de code. Ainsi je traiterais chaque ligne différemment avec pour chaque ligne une nouvelle valeur de variable pb, et une nouvelle sélection d'objets sel. Ensuite, je m'attaquerais à la gestion d'erreur, comme: - l'annulation de la recherche du fichier csv - interruption de la commande en cours d'utilisation, - etc. Je souhaite également pouvoir laisser à l'utilisateur le choix du mode de saisi des arguments zp et gis en proposant à l'utilisateur une saisie clavier, un clic ou une valeur par défaut issue de la lecture du fichier .csv utilisable par simple validation parla touche "Entrée". Merci pour les encouragements
-
Je suis bien preneur de vos conseils et remarques Quand à ne pas mettre la barre trop haut je suis d'accord. Le truc c'est qu'à l'heure actuel, si je monte pas la barre, je peux dire que j'ai atteint mon objectif avec ce code: ;; Met en 3D un profil en travers dessiné (defun c:gpoi ();/ sel pb zp gis) (command "_.undo" "_group") ;; Entrée utilisateur (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) (setq zp (getpoint pb "\nSpécifier les coordonnées du ZP: ")) (setq gis (getreal "\nSpécifier la valeur du gisement: ")) ; ;;Calcul (command "_move" sel "" pb zp) (command "3DROTATION" sel "" "x" zp "300") (command "_rotate" sel "" zp gis) ; (command "_.undo" "_end") (princ ) ) Maintenant, les valeurs des arguments zp et gis sont disponible dans un fichier Excel. pour l'instant hors de question d'aller chercher des données dans un xls. Par contre il m'est très facile de convertir cet .xls en .csv avec un séparateur ";" Du coup, avec le tuto de (gile) je m'en sort. Alors j'ai créai un deuxième bout de code pour extraire les données: (defun c:gpoi ();/ fichier sep pos str lst num_pt xzp yzp zzp gis zp) (setq fichier (open (getfiled "Fichier .CSV à ouvrir" "" "csv" 8) "r")) (while (setq str (read-line fichier)) (defun str2lst (str sep / pos) (setq sep ";") (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (setq lst (str2lst str sep)) (setq num_pt(car lst)) (setq xzp (atoi (cadr lst))) (setq yzp (atoi (caddr lst))) (setq zzp (atoi (cadddr lst))) (setq gis (atoi (car (cdr (cdr (cdr (cdr lst))))))) (setq zp (list xzp yzp zzp)) ) (close fichier) ) A ce point, il me reste à combiner les 2 codes. Les points encore en suspend et à comprendre, c'est pourquoi cette erreur et surtout la partie récursive de ce bout de code. Je comprend l'ensemble des fonctions la composant (vl-string-search, cons, substr, strlen), je comprend le principe de fonctionnement qui consiste à aller chercher des éléments de la chaine d'un point de début à un point de fin, puis de transformer ces éléments en une nouvelle chaine, puis de reconstruire/compléter une liste a partir de cette chaine et bis-répétita jusqu'à ce qu'il n'y ait plus d'éléments dans la chaine initiale. Maintenant c'est comment articuler les choses ensemble que j'ai du mal.
-
Bon je patauge, je patauge. (defun c:gpoi ();/ fichier str lst) (setq fichier (open (getfiled "Fichier .CSV à ouvrir" "" "csv" 8) "r")) (setq str (read-line fichier)) (print str) (close fichier) ) Pourquoi ce bout de code (que j'ai simplifié) marche sur un fichier tout neuf, mais pas sur d'autre. Cela me renvoi: Déjà que c'est compliqué pour moi, mais alors en plus si le fonctionnement est aléatoire :(
-
Merci Patrick, J'avais bien trouvé dans le tuto de (gile) un petit bout de code pour faire ça, mais je n'ai pas réussi à correctement le décortiquer et ainsi arriver à le comprendre complètement. Seul le principe j'ai compris. Du coup, j'ai réfléchi à faire quelque chose moi-même et je pense avoir trouvé, mais cela me ferai écrire des 10aines de lignes pour extraire une à une chaque données pour ensuite convertir chaque extrait en liste. Donc je vais voir. Soi je réutilise le bout de code de (gile) en l'ayant partiellement compris, soit je m'attèle à écrire des 10aines de lignes pour en définitive arriver au même résultat..... Merci.
-
Merci pour ces info Denis. Mais avant d'utiliser un xls, je vais commencer par utiliser un .csv. Alors, voici ou j'en suis. J'arrive à lire le csv et à en extraire une chaine sous la forme: "PT-1;815679.200;6299727.790;78.056;292.310" Et à la convertir en: "PT-1 815679.200 6299727.790 78.056 292.310" Le truc, c'est que c'est une chaine et pas une liste. Du coup, je n'arrive pas à en extraire chacun des éléments. Voici ce que j'ai fait pour l'instant: (setq fichier (open (getfiled "Fichier .CSV à ouvrir" "" "csv" 8) "r")) ;(while (setq ligne (read-line fichier)) (setq ligne2 (vl-string-translate ";" " " ligne)) ; ) (close fichier) ) Avez-vous une idée de la démarche à suivre?
-
Je te remercie Denis, Je regarderai tout ça en début de semaine. Tout en m'efforçant de ne pas faire de copier coller. Mon but étant d'en apprendre au maximum. En fait, mes données de base viendront d'Excel, et donc je ferais un export en .csv ce qui me permet d'avoir les données avec un séparateur c pour ensuite transformer chaque ligne en chaine avec séparateur, pour enfin en extraire une liste de chaines. Je voyais le lisp comme une montagne à gravir, mais avec du courage et un peu d'aide, ça se passe pas trop mal. Merci
-
Bon pour lire un fichier, j'ai trouver dans le tuto de (gile) une section pour ouvrir les fichiers via boite de dialogue: GETFILED Et ça aussi: ;; str2lst © Gilles Chanteau ;; Transforme un chaîne avec séparateur en liste de chaînes ;; ;; Arguments ;; str : la chaîne à transformer en liste ;; sep : le séparateur (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Je devrais pouvoir y arriver...
-
Et donc ça donne ça.... ;; Met en 3D un profil en travers dessiné (defun c:gpoi (/ sel pb zp1 gis) (command "_.undo" "_group") ;; Entrée utilisateur (setq sel (ssget)) (setq pb (getpoint "\nPoint de base du déplacement: ")) (setq zp1 (getpoint pb "\nSpécifier les coordonnées du ZP: ")) (setq gis (getreal "\nSpécifier la valeur du gisement: ")) ; ;;Déplacement (command "_move" sel "" pb zp1) (command "3DROTATION" sel "" "x" zp1 "300") (command "_rotate" sel "" zp1 gis) ; (command "_.undo" "_end") (princ ) ) Pfeuu... La journée pour sortir 15 lignes de code Mais bon pour l'instant, je suis obliger de saisir les valeurs du Zp et du Gisement manuellement. L'étape d'après c'est aller lire un XLS (EDIT: ou txt).
-
Hello Didier, Oui, je suis sur ça, mais c'est surtout un support car pour moi le lisp c'est vvvvvvieux, alors c'est histoire de mieux comprendre ce que je vous demande depuis longtemps. Et pour l'instant c'est très basique comme programmation: déplacement, rotation3D et rotation suivant le gisement.
-
Bon j'ai trouvé: (command "_move" sel "" pb zp1)
-
Ma deuxième question. J'ai réussi à créer un jeu de sélection via SSGET, mais maintenant je voudrais l'utiliser, donc j'ai cette ligne dans mon prog qui est sensé déplace ma sélection sel de pb en zp1: (command "_move" sel pb zp1) Le truc, c'est qu'il ne me valide pas mon jeu de sélection, il attend encore de continuier la sélection. J'ai pas mal cherché, mais je n'ai pas trouver...
-
Merci Denis, c'est ce que j'ai vu après.
-
Merci (gile), J'ai saisi la différence entre ce qui est en mémoire et ce qui est affiché. Donc pour l'instant mon début de routine marche. Mais juste pour aller plus loin, ce que je ne comprend pas c'est: 1- Chez moi LUPREC est définit à 3, donc je devrais avoir 3 chiffres après la virgule lorsque j'interroge mon argument, non?
-
Bonjour, Après 20ans d'absence de programmation lisp, je m’essaie à ré-apprendre. Alors bien sur je me dépatouille sur des lisp existants et des souvenirs arrives à remonter, mais c'est loin..... Alors je me sers du tuto de (gile), bien fait mais parfois je bloc. Du coup, j'ouvre ce poste pour poser mes questions qui viendrons aux fur et à mesure que je suis bloquer sur la routine que j'essaie de développer.... PREMIERE QUESTION: Pourquoi GETPOINT ne me sort que des coordonnées sans décimales? Commande: (getpoint) (815649.0 6.29971e+006 0.0) Commande: (setq P1 (getpoint "\nPremier point : ")) Premier point : (815656.0 6.2997e+006 0.0) Commande: !p1 (815656.0 6.2997e+006 0.0)
-
Merci, là on chipote... :P Ta commande, est une conversion, l'anneau est une création direct. Mais c'est vrai que dans certains cas ça peut être pratique, notamment si ce n'est pas moi qui créais le profil. Merci.
-
Vous êtes trop fort..... C'est 2 trucs m'abstienne l'étape de rotation 3D de mon profil sur lequel je galérais un peu. Patrice: Ta routine est bien, mais point négatif, ne permet pas de choisir le point de base du profil, du coup c'est par défaut le centre de l'objet (cercle, polygone, etc...). Point positif, elle prend tout type d'objets (cercle, polyligne, ligne, poly 3D) Thierry: La commande est top. A l'inverse de la commande de Patrice, le point négatif c'est qu'on ne peut utiliser que des polylignes (pour les cercle, il faudra passer par un anneau). Et point positif, on peut choisir le point de base du profil. Vraiment c'est top. Merci.
-
Effectivement, mais comme indiqué plus haut, la solution avec hachure est la bonne si tu n'as pas de quantitatif à sortir. Et, si tu a un quantitatif à faire, je pense que la solution de réseau + XDELIM doit être pas mal.
-
Bonjour Thierry, En attendant une réponse, c'est ce que j'ai fait. Et à vrai dire, ce ne prend pas énormément de temps. Merci.
