VtKp
Membres-
Compteur de contenus
88 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par VtKp
-
Bonjour Voici un petit bout de code qui peut te servir je pense. Il n'est certes pas parfait mais ca marche sur Acad2010. (defun c:imp1 (/ i file pt) (princ "\nEXPORTATION DE POINTS D'IMPLANTATION") (setvar "CMDECHO" 0) (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) (command "SCU" "G") (setvar "INSUNITS" 0) (setvar "OSMODE" 65) (setvar "PDSIZE" 0.5) (setvar "PDMODE" 3) (if (not (tblsearch "LAYER" "PT_IMP")) (command "_layer" "_N" "PT_IMP" "_CO" "3" "PT_IMP" "")) (if (not (tblsearch "LAYER" "NUM_IMP")) (command "_layer" "_N" "NUM_IMP" "_CO" "2" "NUM_IMP" "")) (if (not (tblsearch "STYLE" "Garamond")) (command "-style" "Garamond" "Garamond" 0 1 0 "N" "N")) (setvar "TEXTSTYLE" "Garamond") (setvar "CLAYER" "PT_IMP") (setvar "CECOLOR" "DUCALQUE") (if (not (tblsearch "BLOCK" "PT_IMP")) (progn (entmake '((0 . "BLOCK") (2 . "PT_IMP") (70 . 2) (10 0.0 0.0 0.0))) (entmake '((0 . "ATTDEF") (67 . 0) (8 . "NUM_IMP") (10 1 1 0.0) (40 . 2) (1 . "") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Garamond") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (3 . "Matricule") (2 . "MAT") (70 . 0) (73 . 0) (74 . 0) ) ) (entmake '((0 . "POINT") (67 . 0) (8 . "PT_IMP") (10 0.0 0.0 0.0) (50 . 0.0) (210 0.0 0.0 1.0) ) ) (entmake '((0 . "ENDBLK"))) ) ) (setq file (open "C:\\TMP\\IMPLANTATION.txt" "w")) (princ "\nChoisissez les points d'implantation à exporter") (setq i 1) (while (setq pt (getpoint "\nIndiquer le point à implanter <Entrée pour terminer> : ")) (setvar "OSMODE" 0) (command "_.insert" "PT_IMP" pt 1 1 0 (strcat "P" (rtos i 2 0))) (write-line (strcat "P" (rtos i 2 0) "," (rtos (car pt) 2 5) "," (rtos (cadr pt) 2 5) "," (rtos (caddr pt) 2 5)) file) (setq i (1+ i)) (setvar "OSMODE" 65) ) (close file) (command "_.shell" "start notepad C:\\TMP\\IMPLANTATION.txt") (princ (strcat "\n" (itoa (1- i)) " objets exportés")) (setvar "CMDECHO" 1) (prin1) )
-
Bonjour à tous, Voilà, j'ai pensé à ce bout de code pour améliorer la saisie de fin de tronçon de mon lisp principal. (defun c:pol2 (/ pol ldxf_10 i pth) (setq pol (car (entsel "\nSélectionner la polyligne à traiter : "))) (setq ldxf_10 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget pol)))) (setq i 3) ;; pour exemple pour commencer par le tronçon Est et voir si ca marche (setq pth (sais_tr ldxf_10 i)) (princ pth) (prin1) ) (defun sais_tr (l_pol i / ptn l_tro dl_tro s) (setq l_tro (list "Nord" "Nord-Est" "Est" "Sud-Est" "Sud" "Sud-Ouest" "Ouest" "Nord-Ouest")) (cond ((= i 1) (setq dl_tro "Nord")) ((= i 2) (setq dl_tro "Nord-Est")) ((= i 3) (setq dl_tro "Est")) ((= i 4) (setq dl_tro "Sud-Est")) ((= i 5) (setq dl_tro "Sud")) ((= i 6) (setq dl_tro "Sud-Ouest")) ((= i 7) (setq dl_tro "Ouest")) ((= i 8) (setq dl_tro "Nord-Ouest")) ) (while (/= (car l_tro) dl_tro) (setq l_tro (car2last l_tro)) ) (setq s 0) (while (or (and (setq ptn (getpoint (strcat "\nIndiquer la fin du tronçon " (nth s l_tro) " <ou Suivant> : "))) (not (member (list (car ptn) (cadr ptn)) l_pol)) ) ) (if (= s 8) (setq s 0) (setq s (1+ s))) ) ) (defun car2last (lst) (reverse (cons (car lst) (reverse (cdr lst)))) ) Mais ca ne marche pas comme je veux, En fait, je voudrais pouvoir faire défiler la ligne (setq ptn (getpoint (strcat "\nIndiquer la fin du tronçon " (nth s l_tro) " <ou Suivant> : "))) avec un entrée si la saisie ne correspond pas à l'orientation voulue et avec un contrôle pour savoir si le point sélectionné est ou non sur la polyligne à traiter. Merci par avance de votre aide avant de cloturer ce post..... John
-
Pas de problème Didier Merci
-
Bonjour Didier, Merci pour ta réponse, j'ai testé mon lisp sous acad2004, 2008 et 2010. Ca marche très bien Ouvre un nouveau dessin dans Autocad, fais glisser le lisp et lance la commande mitoy et tout se fera normalement si tout va bien. La seule partie de mon code qu'il faudrait je pense modifier correspond à la partie du cond qui permet la sélection de fin de chaque tronçon. Au final, ce sont des coordonnées que je veux comme le fait mon lisp. Le but c'est de comparer des listing de coordonnées sous un autre programme après, voilà tout Merci encore de votre aide. John
-
Bonjour à tous, Avec un peu de mal et de maux de têtes, voici le lisp qui correspond à ce que je veux faire (à tester dans un dessin vierge et pensez à créer un répertoire intitulé TMP sous C: avant de lancer le lisp) (defun c:mitoy (/ pol ldxf_10 file pti ptd ptn i nb_d nb_f leng pt_ints pt_ind d) (command "_pline" (list 320.36 89.3179) (list 343.404 74.7689) (list 332.727 57.856) (list 314.1233 69.6008) (list 312.485 76.8448) "_c" ) (command "zoom" "et") (setvar "OSMODE" 65) (setq pol (car (entsel "\nChoix de la parcelle à traiter : "))) (setq ldxf_10 (remove-doubles (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget pol))))) (if (not (zerop (logand 1 (cdr (assoc 70 (entget pol)))))) (setq ldxf_10 (append ldxf_10 (list (car ldxf_10)))) ); si poly close, j'ajoute un point (setq file (open "C:/TMP/lim_mitoyenne.txt" "w")) (setq pti (getpoint "\nSélectionner le point de départ : ")) (setq ptd pti) (setq ptn (list (1+ (car pti)) (cadr pti) 0.0)) (setq i 1) (while (and (/= (distance pti ptn) 0) (cond ((= i 1) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 2) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 3) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 4) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 5) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 6) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 7) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ((= i 8) (or (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) (setq i 8)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq i 1)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq i 2)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq i 3)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq i 4)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq i 5)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq i 6)) (and (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq i 7)) (and (progn (prompt "\nSaisie non valide") (exit))) ) ) ) ) (setq nb_d (vl-position (reverse (cdr (reverse ptd))) ldxf_10)) (setq nb_f (vl-position (reverse (cdr (reverse ptn))) ldxf_10)) (setq leng (- nb_f nb_d)) (setq pt_ints (sublst ldxf_10 (1+ nb_d) (1+ leng))) (cond ((= i 1) (write-line "Tronçon Nord : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 2) (write-line "Tronçon Nord-Est : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 3) (write-line "Tronçon Est : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 4) (write-line "Tronçon Sud-Est : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 5) (write-line "Tronçon Sud : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 6) (write-line "Tronçon Sud-Ouest : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 7) (write-line "Tronçon Ouest : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ((= i 8) (write-line "Tronçon Nord-Ouest : " file) (setq d 0) (repeat (length pt_ints) (setq pt_ind (nth d pt_ints)) (write-line (strcat "Point " (itoa (1+ (vl-position pt_ind ldxf_10))) "\t" "-" "\t" (rtos (car pt_ind) 2 2) "\t" (rtos (cadr pt_ind) 2 2)) file) (setq d (1+ d)) ) ) ) (write-line "\n" file) (setq ptd ptn) (setq i (1+ i)) ) (close file) (if (= (distance pti ptn) 0) (command "_.shell" "start notepad C:\\TMP\\lim_mitoyenne.txt") ) (prin1) ) (defun remove-doubles (lst / lst2) (while (car lst) (setq lst2 (cons (car lst) lst2) lst (vl-remove (car lst) lst) ) ) (reverse lst2) ) (defun sublst (lst start leng / rslt) (if (not (<= 1 leng (- (length lst) start))) (setq leng (- (length lst) (1- start))) ) (repeat leng (setq rslt (cons (nth (1- start) lst) rslt) start (1+ start) ) ) (reverse rslt) ) le cond qui permet la sélection de fin de chaque tronçon correspond à la partie que je souhaiterais simplifier car elle me semble trop longue et pas adéquat. Si vous avez des idées sinon c'est pas grave. Merci encore de votre aide. John
-
Bonjour Didier, Bonuscad Didier, il s'agit en fait d'identifier des points communs sur une limite mitoyenne entre deux parcelles. dans le cadre d'un document d'arpentage sur Mayotte. Bonuscad, je ne vois pas bien l'interêt d'une telle commande si ce n'est enfin pour ma part l'utilisation de grdraw. Merci encore pour votre aide. John
-
oK Pas de problème pour le message. Pour mon problème, le tronçon Nord correspond à un ou plusieurs segments de la polyligne 2D fermée orienté au Nord quand tu mets le curseur Autocad au centre de la parcelle. Tu prends le cas d'un carré par exemple, tu as bien si tu mets ton curseur au centre de ce carré en tournant dans le sens horaire 4 orientations, une au Nord, une à l'est, une au Sud et une à l'Ouest. Dans mon cas si tu prends ce même carré, je voudrais faire une boucle qui à partir d'un point sélectionné (point en haut à gauche dans cet exemple) le lisp demande à l'utilisateur la fin du tronçon Nord (l'utilisateur sélectionnerait le point haut droit et on aurait une liste l_onr du type Nord - (les coordonnées du point haut gauche) (coordonnées des points intermédiaires s'il y en a) (coordonnées du point haut droit) , puis on continue avec la fin du tronçon Est, Est - (les coordonnées du point haut droit) (coordonnées des points intermédiaires s'il y en a) (coordonnées du point bas droit) , puis on continue avec la fin du tronçon Sud, Sud - (les coordonnées du point bas droit) (coordonnées des points intermédiaires s'il y en a) (coordonnées du point bas gauche) , puis on continue avec la fin du tronçon Ouest, Ouest - (les coordonnées du point bas gauche) (coordonnées des points intermédiaires s'il y en a) (coordonnées du point haut gauche) Et comme le point de fin du tronçon Ouest correspond au point de début du tronçon Nord, la boucle s'arrête. D'ou la necessité de sélectionner un point de départ et de terminer la boucle sur ce même point départ quand l'utlisation clique le même point. La liste l_onr contiendrait ainsi 4 tronçons avec tous les coordonnées des sommets chaque orientation. Par contre, si au lieu des coordonnées des points de début, intermédiaires et de fin de chaque tronçon on pourrait stocker les listes des segments obtenues avec la fonction getPolySegs, c'est mieux sinon avec les coordonnées, je pourrais m'en sortir. Et de même si on pourrait intégrer dans le choix de sélection des tronçons des intermédiaires comme Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est ce serait super mais bon je verrais cela après .... Merci encore de ton aide. John
-
Bonjour Tramber Merci de ta réponse et désolé de "polluer" ce post ou ce forum. Tu peux changer ce post de sous forum si tu le désires, pas de problème. J'ai testé ton bout de code et je n'arrive pas à ce que je veux. Le but est d'écrire dans un fichier texte suivant les différentes orientations choisies par l'utilisateur les coordonnées des sommets d'un ou de plusieurs segments d'un tronçon Nord, Sud, ou encore Nord-Ouest comme indiqué ici dans cet exemple ;; Début de la boucle à réaliser ;; L'utilisateur indique le premier point du tronçon Nord, ;; Avec la liste l_seg, on sauvegarde dans une liste le segment ou la continuite de deux segments correspondant au Nord. ;; Dans notre cas, on aurait une liste du type (que pour l'orientation Nord) ;; l_onr (("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0))))) ;; Ensuite sélection de la fin du tronçon Est, on aurait donc une liste du type ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ) ;; Ensuite sélection de la fin du tronçon Sud, on aurait donc une liste du type ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ("Sud" (((125.0 125.0) 0.0 (135.0 120.0)) ((135.0 120.0) 0.0 (150.0 130.0)))) ;; ) ;; Et pour finir, sélection de la fin du tronçon Ouest et la boucle doit se terminer car le point sélectionné au départ et le même que celui d'arrivée ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ("Sud" (((125.0 125.0) 0.0 (135.0 120.0)) ((135.0 120.0) 0.0 (150.0 130.0)))) ;; ("Ouest" ((125.0 158.0) 0.0 (125.0 125.0))) ;; ) Et en utilisant si possible cette méthode de saisie (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) En récapitulant après la saisie du point de départ, l'utilisateur doit indiquer la fin du tronçon Nord et toutes les coordonnées des sommets du tronçon Nord doivent être ajoutés à la liste l_onr, Ensuite le lisp continue avec la saisie de la fin du tronçon Est, toutes les coordonnées des sommets du tronçon Est doivent être ajoutés à la liste l_onr, ... ETC jusqu'à arrivé au tronçon Nord-Ouest La boucle s'arrête si l'utilisateur sélectionne un point d'arrivée qui est le même que le point de départ défini comme pti Après la sélection de la fin d'un tronçon (par exemple Nord) , mon problème vient du fait que je ne sais comment proposer à l'utilisateur de reprendre la sélection avec la fin du tronçon Est par exemple et non pas de reprendre la boucle depuis le début. Je pense qu'il faut utiliser les fonctions grread et grdraw mais j'ai du mal à les comprendre. J'espère que mes explications t'auront éclairé. Merci encore de ton aide. John les coor
-
Voici à peu près ce que j'aimerais faire Bout de code à mettre à la suite de (setq pti (getpoint "\nSélectionner le point de départ : ")) (setq l_onr nil) (while (and (or (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Est")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Sud-Ouest")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Ouest")) (setq ptn (getpoint "\nIndiquer la fin du tronçon Nord-Ouest")) ) (/= (distance pti ptn) 0) ) ;; Il faudrait là enregistrer les segments dans la liste l_onr et reprendre la définition des orientations depuis la dernière arreté et non pas depuis le début. ;; Par exemple si on clique sur le 3ième sommet de la parcelle, reprendre à la fin du Tronçon Sud et non pas au Nord ;; mais je patine avec le peu de connaissances que j'ai (command "_pline" pti ptn "") (setq ptn pti) ) Merci par avance de votre aide John
-
Bonjour, Voici un lisp explicite je pense de ma demande A tester dans un dessin vierge (defun c:pol1 (/ file pol ldxf_10 lseg) ;; Création d'une parcelle exemple (setvar "CECOLOR" "1") (command "_pline" (list 125 125 0) (list 135 120 0) (list 150 130 0) (list 150 150 0) (list 135 145 0) (list 125 158 0) "c" ) (setvar "CECOLOR" "DUCALQUE") ;; Zoom centré (command "zoom" "et") ;; Création du fichier Export (setq file (open "C:\\Export_poly.txt" "w")) (setq pol (car (entsel "\nChoix de la parcelle à traiter : "))) (setq ldxf_10 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget pol)))) (setq lseg (GetPolySegs pol)) (setq pti (getpoint "\nSélectionner le point de départ : ")) (setq ptn (getpoint "\nIndiquer la fin du tronçon - Point suivant : ")) ;; Début de la boucle à réaliser ;; L'utilisateur indique le premier point du tronçon Nord, ;; Avec la liste l_seg, on sauvegarde dans une liste le segment ou la continuite de deux segments correspondant au Nord. ;; Dans notre cas, on aurait une liste du type (que pour l'orientation Nord) ;; l_onr (("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0))))) ;; Ensuite sélection de la fin du tronçon Est, on aurait donc une liste du type ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ) ;; Ensuite sélection de la fin du tronçon Sud, on aurait donc une liste du type ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ("Sud" (((125.0 125.0) 0.0 (135.0 120.0)) ((135.0 120.0) 0.0 (150.0 130.0)))) ;; ) ;; Et pour finir, sélection de la fin du tronçon Ouest et la boucle doit se terminer car le point sélectionné au départ et le même que celui d'arrivée ;; l_onr ( ;; ("Nord" (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))) ;; ("Est" ((150.0 130.0) 0.0 (150.0 150.0))) ;; ("Sud" (((125.0 125.0) 0.0 (135.0 120.0)) ((135.0 120.0) 0.0 (150.0 130.0)))) ;; ("Ouest" ((125.0 158.0) 0.0 (125.0 125.0))) ;; ) ;; Voici un début de boucle mais incomplet à mon sens, il doit manquer certaines conditions ;; et surtout je ne vois pas comment indiquer dans une boucle de ce type le choix entre une orientation Nord, Est, Sud et Ouest ;;(while (/= (distance (pti ptn)) 0)) (write-line "Au Nord : (((150.0 150.0) 0.0 (135.0 145.0)) ((135.0 145.0) 0.0 (125.0 158.0)))" file) (close file) (command "_.shell" "start notepad C:\\Export_poly.txt") (princ ldxf_10) (prin1) ) ;;(cond ;;(x_alpha ;;(entmod (subst (cons 50 x_alpha) (assoc 50 dxf_txt) dxf_txt)) ;;(princ "\n<Espace> ou [Click+gauche] pour tourner de 90°/<Entrée> ou [Click+droit] pour finir!.") ;;(while (and (not (member (setq key (grread nil 4 0)) '((2 13)))) (/= (car key) 25)) ;;(setq x_alpha (+ (/ pi 2.0) x_alpha)) ;;(entmod (subst (cons 50 x_alpha) (assoc 50 dxf_txt) dxf_txt)) ;;) ;;(redraw) ;;) ;;) (defun getPolySegs (ent / entl p1 pt bulge seg ptlst) (cond (ent (setq entl (entget ent)) ;; save start point if polyline is closed (if (= (logand (cdr (assoc 70 entl)) 1) 1) (setq p1 (cdr (assoc 10 entl))) ) ;; run thru entity list to collect list of segments (while (setq entl (member (assoc 10 entl) entl)) ;; if segment then add to list (if (and pt bulge) (setq seg (list pt bulge)) ) ;; save next point and bulge (setq pt (cdr (assoc 10 entl)) bulge (cdr (assoc 42 entl)) ) ;; if segment is build then add last point to segment ;; and add segment to list (if seg (setq seg (append seg (list pt)) ptlst (cons seg ptlst)) ) ;; reduce list and clear temporary segment (setq entl (cdr entl) seg nil ) ) ) ) ;; if polyline is closed then add closing segment to list (if p1 (setq ptlst (cons (list pt bulge p1) ptlst))) ;; reverse and return list of segments (reverse ptlst) ) (defun getArcInfo (segment / a p1 bulge p2 c p3 p4 p r s result) ;; assigner variables avec les valeurs de l'argument (mapcar 'set '(p1 bulge p2) segment) (if (not (zerop bulge)) (progn ;; trouver la corde (setq c (distance p1 p2)) ;; trouver la flèche (setq s (* (/ c 2.0) (abs bulge))) ;; trouver le rayon par Pythagore (setq r (/ (+ (expt s 2.0) (expt (/ c 2.0) 2.0)) (* 2.0 s))) ;; distance au centre (setq a (- r s)) ;; coordonnées du milieu de p1 et P2 (setq P4 (polar P1 (angle P1 P2) (/ c 2.0))) ;; coordonnées du centre (setq p (if (>= bulge 0) (polar p4 (+ (angle p1 p2) (/ pi 2.0)) a) (polar p4 (- (angle p1 p2) (/ pi 2.0)) a) ) ) ;; coordonnées de P3 (setq p3 (if (>= bulge 0) (polar p4 (- (angle p1 p2) (/ pi 2.0)) s) (polar p4 (+ (angle p1 p2) (/ pi 2.0)) s) ) ) (setq result (list p r c)) ) (setq result nil) ) result ) (defun clockwise-p (p1 p2 p3) (< (sin (- (angle p1 p3) (angle p1 p2))) -1e-14) ) (defun remove-doubles (lst / lst2) (while (car lst) (setq lst2 (cons (car lst) lst2) lst (vl-remove (car lst) lst) ) ) (reverse lst2) ) (defun ang2d (p1 p2 p3 / base ang) (setq base (getvar "ANGBASE")) (setq ang (abs (- (angle p2 p1) (angle p2 p3)))) (if (< (+ pi 1e-9) ang) (setq ang (- (* 2 pi) ang)) ) (if (zerop (getvar "ANGDIR")) (+ base ang) (- base ang) ) ) (prin1)
-
Désolé de ne pas avoir répondu plus tôt mais j'étais en déplacement Merci Patrick pour tes réponses, j'ai pu m'en sortir. Je pense que l'on peut cloturer ce post Merci encore à vous tous John
-
Bonjour à tous, Avant de cloturer ce post, dernière petite question Comment fait-on pour centré du texte ou bien le placer à gauche ou à droite de la page Word ? J'ai recherché dans tous les fonctions Font, Border et Style avec (vlax-dump-object wsel) ou encore (vlax-dump-object wtxt) mais je n'ai rien trouvé. Merci par avance de votre aide John
-
Ok Merci sérieusement pour votre aide à tous John
-
Bonjour à tous, Je dois faire pour me simplifier la saisie manuelle une routine lisp qui permet d'écrire des données Autocad dans un document Word. J'ai trouvé mon besoin avec des commandes comme ;; récupérer un nom de fichier (setq filename (getfiled "Créer un fichier Word" "" "doc" 1)) ;; obtenir ou créer une intance de l'application (setq wapp (vlax-get-or-create-object "Word.Application")) ;; obtenir les documents (setq wdocs (vlax-get-property wapp 'Documents)) ;; créer un nouveau document (setq wdoc (vlax-invoke-method wdocs 'Add)) ;; obtenir la sélection (ou le curseur) (setq wsel (vlax-get-property wapp 'Selection)) ;; Entrer du texte (vlax-invoke-method wsel 'TypeText "Ceci est un test") ;; sauver le fichier (vlax-invoke-method wdoc 'SaveAs filename) ;; fermer le document (vlax-invoke-method wdoc 'Close) ;; quitter l'application (vlax-invoke-method wapp 'Quit) ;; supprimer l'instance et nettoyer la mémoire (indispensable) (vlax-release-object wapp) (gc) Il ne manque seulement que des lignes de codes pour paramétrer le style de texte et l'écriture en gras en italique, et la hauteur de texte Je sais qu'avec les composants VBA COM, ca peut se faire mais je cherche depuis 3 jours en vain avec par exemple pour mettre en gras (vlax-get-property wsel 'Font.Bold 1) (vlax-put-property wsel 'Font.Bold True) Si quelqu'un pourrait m'aider, Merci par avance. John
-
Merci Tramber pour ton aide. Ca marche très bien John
-
Merci Tramber pour ton aide. En réponse à tes questions, le code doit traiter les points ayant un suffixe de code égal à 3 ou à 8 Et oui, les points dans le bon ordre le traitement A demain John
-
Bonjour Didider Tramber Merci de vous pencher sur mon problème. Voici un bout de code de ce que je veux exactement faire. Relier des points entre eux par une polyligne 3D et la fermé si le suffixe du code est un 8 (setq cpol '(("1" "748.508" "749.573" "31.362" "740") ("2" "747.758" "749.56" "31.028" "780") ("3" "747.162" "752.98" "31.083" "786") ("4" "748.025" "753.042" "31.464" "743") ("5" "747.212" "757.872" "31.657" "743") ("6" "746.384" "757.796" "31.234" "780") ("7" "745.738" "761.566" "31.345" "786") ("8" "746.639" "761.686" "31.74" "746") ("20" "740.952" "786.986" "31.772" "4010") ("21" "740.575" "786.391" "31.818" "4016") ("22" "740.955" "786.738" "31.845" "3920") ("23" "740.498" "786.353" "31.817" "3926") ("31" "744.11" "783.727" "31.979" "930") ("32" "742.181" "783.418" "31.942" "933") ("33" "741.756" "786.621" "32.026" "933") ("34" "743.499" "786.977" "32.015" "938") ("36" "742.774" "791.674" "32.012" "900") ("37" "743.795" "786.223" "31.943" "903") ("38" "744.837" "780.736" "31.901" "903") ("39" "745.959" "774.738" "31.853" "903") ("40" "747.14" "768.723" "31.788" "903") ("41" "748.16" "763.341" "31.727" "903") ("44" "749.241" "757.617" "31.649" "906"))) ;;Traitement des polylignes 3D (setq lsth nil) (if (/= cpol nil) (progn (setq lsth (append lsth cpol)) ;; boucle principale : tant que lsth n'est pas nil (while lsth ;; initialisation des données (setq loop T ; balise pour la boucle secondaire cnt 0 ; conmpteur dans la liste start (car lsth) ; premier élément pref (substr (nth 4 start) 1 (1- (strlen (nth 4 start)))) ; préfixe du code pts (list (list (atof (cadr start)) ; liste de points (atof (caddr start)) (atof (cadddr start)) ) ) lsth (cdr lsth) ; la liste sans son premier élément ) ;; boucle secondaire : tant que loop, lst et start ne sont pas nil (while (and loop lsth (setq start (nth cnt lsth))) ;; évalue si start a le même préfixe de code (if (or (= (nth 4 start) (strcat pref "3")) (= (nth 4 start) (strcat pref "6")) (= (nth 4 start) (strcat pref "8")) ) (progn ;; si oui : ;; ajout du point à la liste pts et suppression de l'élément de la liste (setq pts (cons (list (atof (cadr start)) (atof (caddr start)) (atof (cadddr start))) pts) lsth (vl-remove start lsth)) (if (= (nth 4 start) (strcat pref "6")) (progn ;; dessiner la poly (command "_.3dpoly") (foreach p (reverse pts) (command "_non" p) ) (command) ;; terminer la boucle secondaire (setq loop nil) ) ) (if (= (nth 4 start) (strcat pref "8")) (progn ;; dessiner la poly (command "_.3dpoly") (foreach p (reverse pts) (command "_non" p) ) (command "_c") (command) ;; terminer la boucle secondaire (setq loop nil) ) ) ) (setq cnt (1+ cnt)) ) ) ) ) ) Tramber, ton code semble correct mais si par exemple tu as dans ta liste plusieurs code 740, tous les codes 743 se mettent à la suite alors que je voudrais que dès que le programme rencontre un code avec un suffixe 0, il recommence une autre ligne. Tu peux t'en apercevoir avec cette liste (setq l_entree '(("1" "748.508" "749.573" "31.362" "740") ("2" "747.758" "749.56" "31.028" "780") ("3" "747.162" "752.98" "31.083" "783") ("4" "748.025" "753.042" "31.464" "743") ("5" "747.212" "757.872" "31.657" "740") ("6" "746.384" "757.796" "31.234" "780") ("7" "745.738" "761.566" "31.345" "783") ("8" "746.639" "761.686" "31.74" "743") ("20" "740.952" "786.986" "31.772" "4010") ("21" "740.575" "786.391" "31.818" "4013") ("22" "740.955" "786.738" "31.845" "3920") ("23" "740.498" "786.353" "31.817" "3923") ("31" "744.11" "783.727" "31.979" "930") ("32" "742.181" "783.418" "31.942" "933") ("33" "741.756" "786.621" "32.026" "933") ("34" "743.499" "786.977" "32.015" "938") ("36" "742.774" "791.674" "32.012" "900") ("37" "743.795" "786.223" "31.943" "903") ("38" "744.837" "780.736" "31.901" "903") ("39" "745.959" "774.738" "31.853" "903") ("40" "747.14" "768.723" "31.788" "903") ("41" "748.16" "763.341" "31.727" "903") ("44" "749.241" "757.617" "31.649" "903")) ) Ton lisp ajoute le point 8 à la suite du pont 1 et 4 alors que dans ce cas, il faudrait deux listes une avec seulement les points 1 et 4 et une autre avec les points 5 et 8 par exemple quoi. Bon, je crois avec simplifier le problème avec l'ajout du suffixe du code 6 dans mon code exemple. Le problème, c'est qu'en réalité, ce suffixe de code n'existe pas, on ne codifie pas comme çà sur le terrain. Il faudrait je pense mais là ca dépasse un peu mais compétence qu'au dernier point avec un suffixe de code 3, il le remplace par un 6 Un exemple est souvent plus parlant Voici ma liste de départ (setq cpol '(("1" "748.508" "749.573" "31.362" "740") ("2" "747.758" "749.56" "31.028" "780") ("3" "747.162" "752.98" "31.083" "783") ("4" "748.025" "753.042" "31.464" "743") ("5" "747.212" "757.872" "31.657" "740") ("6" "746.384" "757.796" "31.234" "780") ("7" "745.738" "761.566" "31.345" "783") ("8" "746.639" "761.686" "31.74" "743") ("20" "740.952" "786.986" "31.772" "4010") ("21" "740.575" "786.391" "31.818" "4013") ("22" "740.955" "786.738" "31.845" "3920") ("23" "740.498" "786.353" "31.817" "3923") ("31" "744.11" "783.727" "31.979" "930") ("32" "742.181" "783.418" "31.942" "933") ("33" "741.756" "786.621" "32.026" "933") ("34" "743.499" "786.977" "32.015" "938") ("36" "742.774" "791.674" "32.012" "900") ("37" "743.795" "786.223" "31.943" "903") ("38" "744.837" "780.736" "31.901" "903") ("39" "745.959" "774.738" "31.853" "903") ("40" "747.14" "768.723" "31.788" "903") ("41" "748.16" "763.341" "31.727" "903") ("44" "749.241" "757.617" "31.649" "903"))) Et voici la liste qu'il faudrait à créer en remplacant le dernier point d'un suffixe de code 3 par un suffixe de code 6 avant un nouveau suffixe du même code 0. Un petit coup d'oeil sur ces deux listes permet de comprendre le principe, je pense, Non ??? Avec le point 44 ou le point 8 ou encore le point 4. Les suffixes de code de ces points ne sont pas les mêmes que la liste précédente. (setq cpol '(("1" "748.508" "749.573" "31.362" "740") ("2" "747.758" "749.56" "31.028" "780") ("3" "747.162" "752.98" "31.083" "786") ("4" "748.025" "753.042" "31.464" "746") ("5" "747.212" "757.872" "31.657" "740") ("6" "746.384" "757.796" "31.234" "780") ("7" "745.738" "761.566" "31.345" "786") ("8" "746.639" "761.686" "31.74" "746") ("20" "740.952" "786.986" "31.772" "4010") ("21" "740.575" "786.391" "31.818" "4016") ("22" "740.955" "786.738" "31.845" "3920") ("23" "740.498" "786.353" "31.817" "3926") ("31" "744.11" "783.727" "31.979" "930") ("32" "742.181" "783.418" "31.942" "933") ("33" "741.756" "786.621" "32.026" "933") ("34" "743.499" "786.977" "32.015" "938") ("36" "742.774" "791.674" "32.012" "900") ("37" "743.795" "786.223" "31.943" "903") ("38" "744.837" "780.736" "31.901" "903") ("39" "745.959" "774.738" "31.853" "903") ("40" "747.14" "768.723" "31.788" "903") ("41" "748.16" "763.341" "31.727" "903") ("44" "749.241" "757.617" "31.649" "906"))) Merci encore de votre aide. John
-
Personne ne peut donc m'aider sur ce problème. le sujet et l'explication n'est pas assez claire ? John
-
Bonjour à tous, Je n'ai plus Internet chez moi depuis 3 mois pour cause de déménagement d'où mes rares interventions ces derniers temps mais je suis quand même l'actu de cadxp de temps à autre Voici mon problème J'ai une liste de points comme suit : (("1" "748.508" "749.573" "31.362" "740") ("2" "747.758" "749.56" "31.028" "780") ("3" "747.162" "752.98" "31.083" "783") ("4" "748.025" "753.042" "31.464" "743") ("5" "747.212" "757.872" "31.657" "743") ("6" "746.384" "757.796" "31.234" "780") ("7" "745.738" "761.566" "31.345" "783") ("8" "746.639" "761.686" "31.74" "743") ("20" "740.952" "786.986" "31.772" "4010") ("21" "740.575" "786.391" "31.818" "4013") ("22" "740.955" "786.738" "31.845" "3920") ("23" "740.498" "786.353" "31.817" "3923") ("31" "744.11" "783.727" "31.979" "930") ("32" "742.181" "783.418" "31.942" "933") ("33" "741.756" "786.621" "32.026" "933") ("34" "743.499" "786.977" "32.015" "938") ("36" "742.774" "791.674" "32.012" "900") ("37" "743.795" "786.223" "31.943" "903") ("38" "744.837" "780.736" "31.901" "903") ("39" "745.959" "774.738" "31.853" "903") ("40" "747.14" "768.723" "31.788" "903") ("41" "748.16" "763.341" "31.727" "903") ("44" "749.241" "757.617" "31.649" "903")) Le but étant de pouvoir tracer des polylignes 3D liant les points contenant les mêmes codes. Il s'agit d'une liste de points où le 4ième élement de chaque point est un identifiant. Tous les points contenant le même préfixe d'un identifiant doivent être reliés par une polyligne 3D. Exemple, une polyligne 3D doit être tracer et passer par les points 36 à 44. De même, une autre polyligne 3D doit passer par les points 2 à 3. Par contre, l'identifiant du point 2 est le même que celui du point 6. Il faut par conséquent deux polylignes différentes. Pour chaque point, l'identifiant est un préfixe correspond au 4ième élement de chaque point moins un caractères. Un identifiant peut être composé de plusieurs caractères, que des nombres mais ce n'est pas limité. Ce qui compte est le suffixe de chaque identifiant Le suffixe 0 est un point de début de polyligne 3D. Le suffixe 3 est un point intermédiaire de polyligne 3D. Le suffixe 8 est un point de fermeture de polyligne 3D. Ainsi par exemple, tant qu'il y a un identifiant égal à 743, la polyligne 3D doit passer par le point 1, 4, 5, 8 mais si un identifiant 740 apparait, il faut redemarrer la création d'une liste de points comme indiqué ci-dessous. Gile à l'époque m'avait quelque chose qui marchait très bien mais les identifiants n'étaient pas strucutres de la même manière. J'ai essayé de modifié le bout de code d'origine mais je bloque toujours. Voici le code en question : ;;Traitement des polylignes 3D (setq lsth nil) (if (/= cpol nil) (progn (setq lsth (append lsth cpol)) ;; boucle principale : tant que lst n'est pas nil (while lsth ;; initialisation des données (setq loop T ; balise pour la boucle secondaire cnt 0 ; conmpteur dans la liste start (car lsth) ; premier élément pref (substr (nth 4 start) 1 3) ; préfixe du code pts (list (list (atof (cadr start)) ; liste de points (atof (caddr start)) (atof (cadddr start)) ) ) lsth (cdr lsth) ; la liste sans son premier élément ) ;; boucle secondaire : tant que loop, lst et start ne sont pas nil (while (and loop lsth (setq start (nth cnt lsth))) ;; évalue si start a le même préfixe de code (if (= (substr (nth 4 start) 1 3) pref) ;; si oui : (progn ;; ajout du point à la liste pts et suppression de l'élément de la liste (setq pts (cons (list (atof (cadr start)) (atof (caddr start)) (atof (cadddr start))) pts) lsth (vl-remove start lsth)) ;; évalue si le suffixe du code = 3 (if (= (substr (nth 4 start) 5) "3") ;; si oui (progn ;; dessiner la poly (command "_.3dpoly") (foreach p (reverse pts) (command "_non" p) ) (command) ;; terminer la boucle secondaire (setq loop nil) ) ) ;; évalue si le suffixe du code = 4 (if (= (substr (nth 4 start) 5) "4") ;; si oui (progn ;; dessiner la poly (command "_.3dpoly") (foreach p (reverse pts) (command "_non" p) ) (command "_c") (command) ;; terminer la boucle secondaire (setq loop nil) ) ) ) ; si non, passer à l'élément suivant dans la liste (setq cnt (1+ cnt)) ) ) ) ) ) Et voici un bout de code que j'ai modifié ;;Traitement des polylignes 3D (setq lsth nil) (if (/= cpol nil) (progn (setq lsth (append lsth cpol)) ;; boucle principale : tant que lsth n'est pas nil (while lsth ;; initialisation des données (setq loop T ; balise pour la boucle secondaire cnt 0 ; conmpteur dans la liste start (car lsth) ; premier élément pref (substr (nth 4 start) 1 (1- (strlen (nth 4 start)))) ; préfixe du code pts (list (list (atof (cadr start)) ; liste de points (atof (caddr start)) (atof (cadddr start)) ) ) lsth (cdr lsth) ; la liste sans son premier élément ) ;; boucle secondaire : tant que loop, lst et start ne sont pas nil (while (and loop lsth (setq start (nth cnt lsth))) ;; évalue si start a le même préfixe de code (if (and (= (substr (nth 4 start) 1 (1- (strlen (nth 4 start)))) pref) (/= (substr (nth 4 start) (strlen (nth 4 start))) 0) ) (progn ;; si oui : ;; ajout du point à la liste pts et suppression de l'élément de la liste (setq pts (cons (list (atof (cadr start)) (atof (caddr start)) (atof (cadddr start))) pts) lsth (vl-remove start lsth)) (if (or (= (length lsth) 0) (/= (substr (nth 4 (cadr lsth)) 1 (1- (strlen (nth 4 (cadr lsth))))) pref) ) (progn ;; dessiner la poly (command "_.3dpoly") (foreach p (reverse pts) (command "_non" p) ) (command) ;; terminer la boucle secondaire (setq loop nil) ) ) ) (setq cnt (1+ cnt)) ) ) ) ) ) Si quelqu'un pouvait y jeter un oeil, Merci par avance de votre aide. John
-
Bonjour Patrick Merci pour ta réponse. Oui en effet j'arrive déjà avec çà à accéder au document Word en question (setq WordApp (vlax-get-or-create-object "Word.Application")) (setq wks1 (vlax-invoke-method (vlax-get-property WordApp 'Documents) 'Open "C:\\TMP\\SAMPLE.doc")) (setq she1 (vlax-get-property WordApp "ActiveDocument")) Pour le quitter, je pense uitliser (vlax-release-object WordApp) (gc) (gc) Mais entre ces lignes de code, j'ai essayé (vlax-invoke-method (vlax-get-property WordApp "ActiveDocument") "Fields.Update") mais je n'arrive à accéder au champ pour lui faire modifier ou lui attribuer une valeur. Il s'agit de champs type Champfusion, j'ai essayé d'en trouver plus sur le net avec ca mais ca ne marche qu'avec des signets et c'est en vba appword.Documents(nom_fichier).CustomDocumentProperties(nom_signet).Value = ma_nouvelle valeur ou encore ActiveDocument.Bookmarks(nom_signet).Select. text = "mavaleur" Ou alors j'utilise des signets et non des champsfusion dans Word pour ce lisp, le but étant de pouvoir les modifier facilement et d'enregistrer ensuite le fichier via (vlax-invoke-method (vlax-get-property WordApp "ActiveDocument") "SaveAs" [surligneur] .....[/surligneur]) Est ce qu'avec le chemin complet du fichier ca peut s'enregistrer car pour moi ca ne marche pas Je bloque sur deux trois lignes mais j'y suis presque je pense Merci par avance de ton aide John
-
Bonjour à tous, Voila je dois faire une centaine de fichier Word en récupérant des infos depuis AutoCAD, longueur de segments, longueur arc etc...... Coordonnées de bloc ;;;;;; Ma question est la suivante (vu que les données sotn pratiquement toutes du même type) Existe t-il un moyen de mettre à jour des champs prédéfinies dans Word via un Lisp qui récupererait les informations depuis un fichier Autocad ? Je sais vu que je m'en sers pas mal qu'on peut facilement lié un fichier Excel à un fichier Autocad pour lire ou écrire des valeurs mais avec Word, je n'ai jamais essayé ni vu d'exemple sur CadXp ;;;; Merci par avance de vos réponses. John
-
Merci pour tes reponses Gile. J'ai Lu vite fait les liens Donne Mais ce n'est apparemment pas simple Le vb net Si on pourrait au moins programmer vb net sous AutoCAD comme Le lisp ou Le Vba ca serait pas mal. Tu as parle de IDE d'ou ma question precedente. Je vais me pencher sur Le vb.net plus en detail. Merci encore de tes reponses. John
-
Donc, on peut dans Autocad développer une appli en .NET. Pas besoin de Visual Studio alors non ??? ou alors j'ai mal compris ? Merci encore de ton aide précieuse.
-
Merci Gile pour cette réponse. Même si Il faut donc du moins c'est conseillé que je migre toutes mes appli vers le vb.net Et quel logiciel utilisé pour développer des appli sous AutoCAD ? J'ai entendu parler de Visual Studio,ou encore Visual Express Studio, Est ce bien çà ? Merci par avance de tes réponses. John
-
Up !!! Je crois Que person a Vu ce message non ???
