Aller au contenu

doy

Membres
  • Compteur de contenus

    20
  • Inscription

  • Dernière visite

Tout ce qui a été posté par doy

  1. Salut Patrick_35, je pensais justement que détailler mon message serait utile. mais bon !!!!!!!!!!!!! des liens dans quels buts ??????? je veux juste dans un premier tremps que l'on me dise si j'ai bien associé les bonnes variables de ma boîte de dialogue et du programme. car quand je veux lancer mon programme celui ci bloque au niveau de la boîte de dialogue. that all, you understand !!!!!!!!!! à + doy et merci de ton intérêt.
  2. Bonjour, désolé mais je crois que j'ai copié deux fois le même programme. j'ai écris un peu trop vite le message précédent. petit historique !!!! le programme consiste à générer automatiquement des contours fermés juxtaposés les uns à coté des autres ceux ci sont numéroté au fur et à mesure de leur création. ce programme s'active par une boîte de dialogue que j'ai créé où l'on entre les valeurs voulues de distances c'est à dire largeur et longueur de la boîte ( contour ), hauteur du texte ..... . j'ai donc écris une boîte de dialogue que voici : *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** boite_de_dialogue_Boites_Numerotees: dialog { // le label est la chaîne de caractères correspondant au titre // de la boîte de dialogue ici Corridor et numérotation des boîtes // Définition de la boîte de dialogue label = "Boîtes Numérotées du corridor"; // Titre de la boîte de dialogue : image { // Image insérée dans la boîte de dialogue height = 10; // Hauteur en nombre de caractères de l'image width = 40; // Largeur en nombre de caractères de l'image color = 0; // Couleur de fond ici 0 pour la couleur noir key = "vignettecorridor"; // Clé d'action référencée dans le programme } : boxed_row {label="Inversion du sens de la trajectoire";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=inverse0; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=inverse1; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } //................................................................................................................................................... : boxed_row {label="Numérotation des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition spacer_0;// création d'un espacement : column { : column { spacer_0;// création d'un espacement : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=num0; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=num1; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="Entrez le numéro de la première boîte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Entrez le numéro de la 1er boîte' edit_limit=5; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 5 caractères seulement key=inc; // la clé d'action s'applique à la référence 'inc' dans le programme lisp 'corridor' } } spacer_0; // création d'un espacement : column { spacer_0; // création d'un espacement :edit_box {label="Spécifiez la hauteur du texte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Spécifiez la hauteur du texte' edit_limit=7; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 7 caractères seulement key=ht; // la clé d'action s'applique à la référence 'ht' dans le programme lisp 'corridor' } } } spacer_0;// création d'un espacement } //................................................................................................................................................... : boxed_row {label="Dimensions des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="largeur du corridor en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'largeur du corridor en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=larg; // la clé d'action s'applique à la référence 'larg' dans le programme lisp 'corridor' } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement :edit_box {label="Longueur des boîtes en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Longueur des boîtes en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=long; // la clé d'action s'applique à la référence 'long' dans le programme lisp 'corridor' } } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // :boxed_row {label="longueur de boîte fixée :"; // :radio_row{ // spacer_0; // :radio_button {label="1Km"; key=cas0; value="1";} // :radio_button {label="5Km"; key=cas1; value="0";} // } // } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } } spacer_1;// création d'un espacement : row {// rangée du bouton 'OK' et 'Annuler' : button {key = "accept"; label = " OK "; is_default = true; } : button { key = "cancel"; label = " Annuler "; is_default = false; is_cancel = true; } } } *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** que je souhaiterai associer au programme de génération des boîtes du corridor, seulement je ne parviens pas à associer correctement les diférents éléments du programme avec la boîte de dialogue que j'ai écris. Quelqu'un peut il m'aider à corriger les erreurs que j'ai fais ???? voici le programme : *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** ;;; ; CORRIDOR.LSP ;;; ; ;;; ; Création des boîtes le long de la Trajectoire de vol de l'hélicoptère. ;;; ; Ces boîtes correspondent aux limites du Perimètre du Corridor. ;;; ; Ces limites sont composées de boîtes juxtaposées toujours perpendiculaires à la trajectoire, ;;; ; dont les paramètres de longueur des boîtes et de largeur du corridor sont réglables, ;;; ; par une simple entrée au clavier dans la boîte de dialogue du programme. ;;; ; Après chargement, l'exécution de la fonction "CORRIDOR" est obtenu par : ;;; ; -> commande : (corridor) ;;; ; sélection polyligne, coordonnées des sommet & calcul longueur ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boite DCL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:corridor () ;;; (setq dcl_id (load_dialog "Boite de dialogue Boîtes Numérotées.dcl")) ;;; (if ;;; (not (new_dialog "boite_de_dialogue_Boîtes_Numérotées" dcl_id)) ;;; (exit) ;;; ) ;;; ;si il n'y a pas de boite de dialogue alors on lance le programme sans elle ;;; ;;; ;;; ;image en .sld ;;; ;;; (setq x1 (dimx_tile "vignettecorridor") ;coordonnées x du coin inférieur droit de l'image nom de l'image que l'on donne dans la boite de dialogue ;;; y1 (dimy_tile "vignettecorridor")) ;coordonnées y du coin inférieur droit de l'image ;;; (start_image "vignettecorridor") ;Début du traitement d'un controle image ;;; (fill_image 0 0 (dimx_tile "vignettecorridor") (dimy_tile "vignettecorridor") 0) ;;; (slide_image 0 0 x1 y1 "corridor_image") ;centrage de la diapo ;;; (end_image) ;;; ;;; ;inversion du sens de la trajectoire ;;; (action_tile "inverse0" "(setq inverse \"0\")"); affecte donc l'action inverse = 2 à évaluer lorsque nous sélectionnons la variable inverse2 . ;;; (action_tile "inverse1" "(setq inverse \"1\")"); affecte donc l'action inverse = 3 à évaluer lorsque nous sélectionnons la variable inverse3 . ;;; ;;; ;;; ;;; ;nuréroté les boîtes ;;; (action_tile "Cas0" "(setq cas \"0\")"); affecte donc l'action cas = 0 à évaluer lorsque nous sélectionnons la variable Cas0 . ;;; (action_tile "Cas1" "(setq cas \"1\")"); affecte donc l'action cas = 1 à évaluer lorsque nous sélectionnons la variable Cas1 . ;;; ;;; ;;; ;; initialiser les variables ;;; ;;;(if (not largeur_corridor) (setq largeur_corridor "1500")). ;;; ;;;;;;(if (not cas) (setq cas "cas0")) ;;; ;;;(if (not position_liste) (setq position_liste "0")). ;;; ;;; ;;; ;;;;; initialiser la boite de dialogue. ;;; ;;;(set_tile "larg_corridor" largeur_corridor). ;;; ;;;(set_tile "cas" cas). ;;; ;;;(set_tile "bloc" position_liste). ;;; ;;; ;;; ;largeur de la boite du corridor. ;;; ;permet d'écrire la valeur de la largeur de la boite du corridor par une entrée numérique ;;; (action_tile "larg" "(setq larg $value)") ;;; ; " action_tile " affecte l'action " largeur_boite " à évaluer lorsque nous sélectionnons le composant " larg ". ;;; ;;; ;;; ;longueur de la boite du corridor. ;;; ;permet d'écrire la valeur de la longueur de la boite du corridor par une entrée numérique ;;; (action_tile "long" "(setq long $value)") ;;; ; " action_tile " affecte l'action " longueur_boite " à évaluer lorsque nous sélectionnons le composant " long ". ;;; ;;; ;;; ;premier numero de la boite du corridor. ;;; ;permet d'écrire la valeur des numeros dans les boites du corridor par une entrée numérique ;;; (action_tile "inc" "(setq inc $value)") ;;; ; " action_tile " affecte l'action " le premier numero de la boite " à évaluer lorsque nous sélectionnons le composant " inc ". ;;; ;;; ;;; ;hauteur du texte dans les boites du corridor. ;;; ;permet d'écrire la valeur de la hauteur du texte dans les boites du corridor par une entrée numérique ;;; (action_tile "ht" "(setq ht $value)") ;;; ; " action_tile " affecte l'action " hauteur du texte " à évaluer lorsque nous sélectionnons le composant " ht ". ;;; ;;; ;;; ;;; ;;; (action_tile "accept" "(done_dialog 1)") ;1 pour OK ; ;;; (action_tile "cancel" "(done_dialog 0)") ;o pour Cancel ; ;;; ;;; (setq what_next (start_dialog)); démarre la boîte de dialogue. ;;; (unload_dialog dcl_id) ;;; ;;; (if ;;; (= what_next 1) ;; ok ;;; (progn ;;; ;;; (setq bloc_largeur (nth (atoi position_liste) liste_bloc)); " atoi " convertit la chaîne de caractère " position_liste " en un nombre entier. ;;; ;;;(alert (strcat "Largeur corridor : " largeur_corridor)) ;;; ;;;(alert (strcat "Cas : " (itoa cas))) ;;; ;;;(alert (strcat "Largeur bloc : " bloc_largeur)) ;;; ;;; ) ;;; ) ;;; (corridor) ; on lance le programme boite ;;; ;;; (princ) ;;; ;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;;(defun boite () ;;; ;;; ;;; (setvar "attdia" 0) ;Détermine si la commande INSERT utilise une boîte de dialogue ;;; ;pour la saisie de la valeur d'attribut. Voir la section "INSERT, ligne de commande",. ;;; ;Variables système ;;; ;0 Affiche les messages sur la ligne de commande ;;; ;1 Utilise une boîte de dialogue ;;; ;;; (setvar "osmode" 0) ;gère l'accrochage aux objets ici mode 0 donc désactivé. ;;; (setvar "cmdecho" 0) ;gère le mode d'écho des commandes dans l'environnement d'AutoCAD, ici mode 0 donc désactivé. ;;; ;;; (setq largeur_corridor (atoi largeur_corridor)); " atoi " convertit la chaîne de caractère " largeur_corridor " en un nombre entier. ;;; (setq cas (atoi cas)) ;;; (setq inverse (atoi inverse)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PARTIE DE PROGRAMME QUI MARCHE INDEPENDAMMENT DE LA PREMIERE PARTIE ; SUR LA INVERSION DE LA TRAJECTOIRE QUI MARCHE AUSSI INDEPENDAMMENT ; MAIS QUE JE NE PARVIENS PAS A LIER AVEC LE RESTE. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; version du programme de génération des boîtes avec numérotation incrémentée. ;;; (defun c:corridor (/ erreur JoinPlines AcDoc Space inc ;;;ht ent long larg pl0 nor pl1 ;;;pl2 ps1 ps2 nb n pt0 pa0 ;;;pt1 pt2 cut1 cut2 txt ;;;) (vl-load-com) ;; Redéfintion de *error* (fermeture du groupe d'annulation) (defun erreur (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)) ) (setq *error* m:err m:err nil ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;inversion du sens de la trajectoire fonction reverse LWPOLYLINE" ;;; ;;; (if ;;; (= inverse 3) ;;; (progn ;;; ;;; R_PLINE Fonction d'appel (initget "Oui Non") (if (/= "Non" (getkword "\nInversez le sens de la trajectoire ? [Oui/Non] < Oui >: ") ) (defun r_pline (/ ent) (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length trajectoire)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n trajectoire))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n trajectoire))) (setq liste (cons (cdr (nth n trajectoire)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (while (not (setq ent (car (entsel))))) (if (or (= (cdr (assoc 0 (entget ent))) "corridor" "num") (and (= (cdr (assoc 0 (entget ent))) "corridor" "num") (zerop (logand 240 (cdr (assoc 70 (entget ent))))) ) ) (reverse_pline ent) (prompt "\nEntité non valide") ) (princ) (defun reverse_pline (ent / e_lst vtx v_lst p_lst l_vtx) (setq e_lst (entget ent)) (cond ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq vtx (entnext ent)) (while (= (cdr (assoc 0 (entget vtx))) "VERTEX") (setq v_lst (cons (entget vtx) v_lst) vtx (entnext vtx) ) ) ) ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq p_lst (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42)) ) e_lst ) e_lst (vl-remove-if '(lambda (x) (member x p_lst) ) e_lst ) ) (while p_lst (setq v_lst (cons (list (car p_lst) (cadr p_lst) (caddr p_lst) (cadddr p_lst)) v_lst ) p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst)) ) ) ) ) (setq l_vtx (last v_lst) l_vtx (subst (cons 40 (cdr (assoc 41 (car v_lst)))) (assoc 40 l_vtx) l_vtx ) l_vtx (subst (cons 41 (cdr (assoc 40 (car v_lst)))) (assoc 41 l_vtx) l_vtx ) l_vtx (subst (cons 42 (- (cdr (assoc 42 (car v_lst))))) (assoc 42 l_vtx) l_vtx ) ) (setq v_lst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) x) x (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) x) x (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x) ) ) v_lst (cdr v_lst) ) ) (if (= (logand 1 (cdr (assoc 70 e_lst))) 1) (setq v_lst (append (list l_vtx) v_lst)) (setq v_lst (append v_lst (list l_vtx))) ) (cond ((= (cdr (assoc 0 e_lst)) "corridor" "num") (mapcar 'entmake (append (list e_lst) v_lst (list (entget vtx))) ) (entdel ent) ) ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq e_lst (append e_lst (apply 'append v_lst))) (entmod e_lst) ) (if (/= "Non" (getkword "\nNuméroter les boites ? [Oui/Non] < Oui >: ") ) (progn (command reverse_inc "corridor" "num") (if (setq inc (getint (strcat "\nEntrez le numéro de la première boîte ? <" (itoa (vlax-ldata-get "corridor" "num")) ">: " ) ) ) (vlax-ldata-put "corridor" "num" inc) (setq inc (vlax-ldata-get "corridor" "num")) ) (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte <" (rtos (getvar "TEXTSIZE")) ">: " ) ) ) (setvar "TEXTSIZE" ht) (setq ht (getvar "TEXTSIZE") ) ) ) ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Joint deux polylignes en une polyligne fermée (defun JoinPlines (p1 p2 / v1 v2 i lst pl) (command "-calque" "e" "corridor" "co" "jaune" "corridor" "tl" "CONTINUOUS" "corridor" "") (setq v1 (fix (vlax-curve-getEndParam p1)) v2 (fix (vlax-curve-getEndParam p2)) i 0 ) (repeat v1 (setq lst (cons (cons i (vla-getBulge p1 i)) lst) i (1+ i) ) ) (setq i (1+ i)) (repeat v2 (setq lst (cons (cons i (- (vla-GetBulge p2 (setq v2 (1- v2))))) lst) i (1+ i) ) ) (setq pl (vlax-invoke Space 'addLightWeightPolyline (append (vlax-get p1 'Coordinates) (apply 'append (reverse (split-list (vlax-get p2 'Coordinates) 2)) ) ) ) ) (vla-put-Closed pl :vlax-true) (mapcar '(lambda (x) (vla-SetBulge pl (car x) (cdr x))) lst) (vla-put-Normal pl (vla-get-Normal p1)) (vla-put-Elevation pl (vla-get-Elevation p1)) (vla-delete p1) (vla-delete p2) pl ) ;;; Fonction principale ;;; (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) m:err *error* *error* erreur ) (or (vlax-ldata-get "corridor" "long") (vlax-ldata-put "corridor" "long" 1000.0) ) (or (vlax-ldata-get "corridor" "larg") (vlax-ldata-put "corridor" "larg" 600.0) ) (or (vlax-ldata-get "corridor" "num") (vlax-ldata-put "corridor" "num" 1) ) (initget "Oui Non") (if (/= "Non" (getkword "\nNuméroter les boites ? [Oui/Non] < Oui >: ") ) (progn (if (setq inc (getint (strcat "\nEntrez le numéro de la première boîte ? <" (itoa (vlax-ldata-get "corridor" "num")) ">: " ) ) ) (vlax-ldata-put "corridor" "num" inc) (setq inc (vlax-ldata-get "corridor" "num")) ) (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte <" (rtos (getvar "TEXTSIZE")) ">: " ) ) ) (setvar "TEXTSIZE" ht) (setq ht (getvar "TEXTSIZE") ) ) ) ) (while (not (setq ent (car (entsel "\nSélectionner une polyligne: "))) ) ) (initget 6) (if (setq long (getdist (strcat "\nLongueur des boites <" (rtos (vlax-ldata-get "corridor" "long")) ">: " ) ) ) (vlax-ldata-put "corridor" "long" long) (setq long (vlax-ldata-get "corridor" "long")) ) (initget 6) (if (setq larg (getdist (strcat "\nLargeur des boites <" (rtos (vlax-ldata-get "corridor" "larg")) ">: " ) ) ) (vlax-ldata-put "corridor" "larg" larg) (setq larg (vlax-ldata-get "corridor" "larg")) ) (vla-StartUndoMark AcDoc) (setq pl0 (vlax-ename->vla-object ent) nor (vlax-get pl0 'Normal) pl1 (car (vlax-invoke pl0 'Offset (/ larg 2.0))) pl2 (car (vlax-invoke pl0 'Offset (/ larg -2.0))) ps1 (trans (vlax-curve-getPointAtParam pl1 0) 0 nor) ps2 (trans (vlax-curve-getPointAtParam pl2 0) 0 nor) nb (fix (/ (vlax-curve-getDistAtParam pl0 (vlax-curve-getEndParam pl0) ) long ) ) n 1 ) (progn (command "-calque" "e" "LIMITE" "co" "bleu" "LIMITE" "tl" "CONTINUOUS" "LIMITE" "") ) (princ) (repeat nb (setq pt0 (vlax-curve-getPointAtDist pl0 (* n long)) pa0 (vlax-curve-getParamatpoint pl0 pt0) ) (if (equal pa0 (fix pa0) 1e-9) (setq pt1 (vlax-curve-getPointatParam pl1 1) pt2 (vlax-curve-getPointatParam pl2 1) ) (setq pt1 (vlax-curve-getClosestPointTo pl1 pt0) pt2 (vlax-curve-getClosestPointTo pl2 pt0) ) ) (setq cut1 (CutPlineAtPoint pl1 pt1) cut2 (CutPlineAtPoint pl2 pt2) ) (cond ((not (car cut1)) (vlax-put pl2 'Coordinates (append (vlax-get pl2 'Coordinates) (reverse (cdr (reverse (trans pt1 0 nor)))) ) ) (vla-put-Closed pl2 :vlax-true) (vla-put-Layer pl2 (getvar "CLAYER")) ) ((not (car cut2)) (vlax-put pl1 'Coordinates (append (vlax-get pl1 'Coordinates) (reverse (cdr (reverse (trans pt2 0 nor)))) ) ) (vla-put-Closed pl1 :vlax-true) (vla-put-Layer pl1 (getvar "CLAYER")) ) (T (JoinPlines (car cut1) (car cut2))) ) (progn ;;; définition du calque de la numérotation des boîtes ;;; (command "-calque" "e" "txt" "co" "vert" "txt" "tl" "CONTINUOUS" "txt" "") ) (princ) ;;; fin attribution des caractéristiques de la numérotation ;;; (setq txt (vla-addText Space (itoa inc) (vlax-3d-point '(0 0 0)) ht ) ) (vla-put-Normal txt (vlax-3d-point nor)) (vla-put-Alignment txt 10) (vla-put-TextAlignmentPoint txt (vlax-3d-point (vlax-curve-getPointAtDist pl0 (- (* n long) (/ long 2))) ) ) (setq n (1+ n) inc (1+ inc) pl1 (cadr cut1) pl2 (cadr cut2) ) ) (cond ((not pl1) (vlax-put pl2 'Coordinates (append (vlax-get pl2 'Coordinates) (list (car ps1) (cadr ps1) ) ) ) (vla-put-Closed pl2 :vlax-true) (vla-put-Layer pl2 (getvar "CLAYER")) ) ((not pl2) (vlax-put pl1 'Coordinates (append (vlax-get pl1 'Coordinates) (list (car ps2) (cadr ps2)) ) ) (vla-put-Closed pl1 :vlax-true) (vla-put-Layer pl1 (getvar "CLAYER")) ) (T (JoinPlines pl1 pl2)) ) (setq txt (vla-addText Space (itoa inc) (vlax-3d-point '(0 0 0)) ht ) ) (vla-put-Normal txt (vlax-3d-point nor)) (vla-put-Alignment txt 10) (vla-put-TextAlignmentPoint txt (vlax-3d-point (vlax-curve-getPointAtDist pl0 (/ (+ (vlax-curve-getDistatPoint pl0 pt0) (vlax-curve-getDistAtParam pl0 (vlax-curve-getEndParam pl0) ) ) 2.0 ) ) ) ) (vlax-ldata-put "corridor" "num" inc) (vla-EndUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) ) ;;; fin du programme principal ;;; ;;;************************* SOUS ROUTINES *************************;;; ;;; Angle2Bulge ;;; Retourne le bulge correspondant à un angle (defun Angle2Bulge (a) (/ (sin (/ a 4.0)) (cos (/ a 4.0))) ) ;;; ArcCenterBy3Points ;;; Retourne le centre de l'arc décrit par 3 points (defun ArcCenterBy3Points (p1 p2 p3) ((lambda (mid1 mid2) (inters mid1 (polar mid1 (+ (angle p1 p2) (/ pi 2)) 1.0) mid2 (polar mid2 (+ (angle p2 p3) (/ pi 2)) 1.0) nil ) ) (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p1 p2) (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p2 p3) ) ) ;;; SUBLST Retourne une sous-liste ;;; Premier élément : 1 ;;; (sublst '(1 2 3 4 5 6) 3 2) -> (3 4) ;;; (sublst '(1 2 3 4 5 6) 3 -1) -> (3 4 5 6) ;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6) ;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6) (defun sublst (lst start leng / rslt) (or (<= 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) ) ;; SPLIT-LIST Retourne une liste de sous-listes ;; Arguments ;; - lst : la liste à fractionner ;; - num : un entier, le nombre d'éléments des sous listes ;; Exemples : ;; (split-list '(1 2 3 4 5 6 7 8) 2) -> ((1 2) (3 4) (5 6) (7 8)) ;; (split-list '(1 2 3 4 5 6 7 8) 3) -> ((1 2 3) (4 5 6) (7 8)) (defun split-list (lst n) (if lst (cons (sublst lst 1 n) (split-list (sublst lst (1+ n) nil) n) ) ) ) ;;; CutPlineAtPoint ;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés ;;; (ename ou vla-object selon le type de l'argument pl) ;;; ;;; Arguments ;;; pl : la polyligne à couper (ename ou vla-object) ;;; pt : le point de coupure sur la polyligne (coordonnées SCG) (defun CutPlineAtPoint (pl pt / ec vl lst) (and (= (type pl) 'VLA-OBJECT) (setq pl (vlax-vla-object->ename pl) vl T ) ) (cond ((equal pt (vlax-curve-getEndPoint pl) 1e-9) (setq lst (list pl nil)) ) ((equal pt (vlax-curve-getStartPoint pl) 1e-9) (setq lst (list nil pl)) ) ((null (vlax-curve-getParamAtPoint pl pt)) (setq lst (list pl nil)) ) (T (setq ec (getvar "cmdecho")) (setvar "cmdecho" 0) (vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@") (setvar "cmdecho" ec) (setq lst (list pl (entlast))) ) ) (if vl (mapcar '(lambda (x) (if x (vlax-ename->vla-object x) ) ) lst ) lst ) ) *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** D'autre part dans le programme j'y ai rajouté des commandes d'attribution de calque une pour le texte de la numérotation automatique des boîtes et une autre pour les caractéristiques des contours. Cependant l'attribution du calque ;;; définition du calque de la numérotation des boîtes ;;; (command "-calque" "e" "txt" "co" "vert" "txt" "tl" "CONTINUOUS" "txt" "") fonctionne bien sauf pour le dernier élément numéroté que conserve toujours son calque d'origine. je ne sais pas comment placer ma ligne de commande pour qu'elle s'applique bien à toutes les boîtes. Autre petit soucis mon image plus exactement le cliché de ma boîte de dialogue ne s'affiche pas et quand il veut bien s'afficher celui ci ne correspond en rien au dessin de départ du cliché que j'ai créé. je dois surment faire une erreur dans la procédure de création ou de chargement. Peut on m'indiquer le processus de création pour que je vois ou est le problème. et enfin dernier accros je ne suis pas parvenu à enchainer la premiere partie concernant la fonction d'inversion de la polyligne '' trajectoire '' et la suite du programme concernant la génération des boîtes, bien que ces deux routines fonctionnent indépendamment l'une de l'autre. par avance merci. PS : j'espère que j'ai été assez clair dans mes explication.
  3. Bonjour à tous, grâce à l'aide précieuse de quelque un d'entre vous j'ai un formidable programme de génération de boîte ( contour formé d'une polyligne fermée ) qui fonctionne a merveille sur toutes les versions d'autocacad. j'en profite pour remercier ceux qui m'ont apporter leurs lumières et expériences de la programmation. maintenat que ce programme marche j'ai essayé d'y ajouter une boîte de dialogue permettant à l'ouverture du programme de demander les valeurs necessaire à son executer. cependant je ne parviens pas à lier ma boîte de dialogue avec mon programme. Peut on m'aider et corriger les erreurs que j'ai fais ? D'autre part j'ai introduit dans le programme des changement et attribution de calque et de couleur seulement pour le calque concernant le changement de couleur et de calque du texte de la numérotation automatique j'ai un petit soucis car la dernière valeur n'est jamais affecté au calque correspondant à la numérotation. je ne parviens pas à définir la bonne place pour la ligne de commande affectant les caractéristique du nouveau calque. voici mon programme boite_de_dialogue_Boites_Numerotees: dialog { // le label est la chaîne de caractères correspondant au titre // de la boîte de dialogue ici Corridor et numérotation des boîtes // Définition de la boîte de dialogue label = "Boîtes Numérotées du corridor"; // Titre de la boîte de dialogue : image { // Image insérée dans la boîte de dialogue height = 10; // Hauteur en nombre de caractères de l'image width = 40; // Largeur en nombre de caractères de l'image color = 0; // Couleur de fond ici 0 pour la couleur noir key = "vignettecorridor"; // Clé d'action référencée dans le programme } : boxed_row {label="Inversion du sens de la trajectoire";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=inverse0; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=inverse1; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } //................................................................................................................................................... : boxed_row {label="Numérotation des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition spacer_0;// création d'un espacement : column { : column { spacer_0;// création d'un espacement : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=num0; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=num1; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="Entrez le numéro de la première boîte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Entrez le numéro de la 1er boîte' edit_limit=5; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 5 caractères seulement key=inc; // la clé d'action s'applique à la référence 'inc' dans le programme lisp 'corridor' } } spacer_0; // création d'un espacement : column { spacer_0; // création d'un espacement :edit_box {label="Spécifiez la hauteur du texte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Spécifiez la hauteur du texte' edit_limit=7; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 7 caractères seulement key=ht; // la clé d'action s'applique à la référence 'ht' dans le programme lisp 'corridor' } } } spacer_0;// création d'un espacement } //................................................................................................................................................... : boxed_row {label="Dimensions des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="largeur du corridor en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'largeur du corridor en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=larg; // la clé d'action s'applique à la référence 'larg' dans le programme lisp 'corridor' } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement :edit_box {label="Longueur des boîtes en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Longueur des boîtes en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=long; // la clé d'action s'applique à la référence 'long' dans le programme lisp 'corridor' } } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // :boxed_row {label="longueur de boîte fixée :"; // :radio_row{ // spacer_0; // :radio_button {label="1Km"; key=cas0; value="1";} // :radio_button {label="5Km"; key=cas1; value="0";} // } // } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } } spacer_1;// création d'un espacement : row {// rangée du bouton 'OK' et 'Annuler' : button {key = "accept"; label = " OK "; is_default = true; } : button { key = "cancel"; label = " Annuler "; is_default = false; is_cancel = true; } } } boite_de_dialogue_Boites_Numerotees: dialog { // le label est la chaîne de caractères correspondant au titre // de la boîte de dialogue ici Corridor et numérotation des boîtes // Définition de la boîte de dialogue label = "Boîtes Numérotées du corridor"; // Titre de la boîte de dialogue : image { // Image insérée dans la boîte de dialogue height = 10; // Hauteur en nombre de caractères de l'image width = 40; // Largeur en nombre de caractères de l'image color = 0; // Couleur de fond ici 0 pour la couleur noir key = "vignettecorridor"; // Clé d'action référencée dans le programme } : boxed_row {label="Inversion du sens de la trajectoire";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=inverse0; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=inverse1; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action inverse le sens de la polyligne // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } //................................................................................................................................................... : boxed_row {label="Numérotation des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition spacer_0;// création d'un espacement : column { : column { spacer_0;// création d'un espacement : radio_row {// ligne de bouton 'radio' spacer_0;// création d'un espacement : radio_button {label="NON"; key=num0; value="0";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'NON'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché : radio_button {label="OUI"; key=num1; value="1";}// création d'un bouton radio 'radio_button';dont le Nom du bouton label = 'OUI'; // clé d'action Numérotation des boîtes // si 'value = 1' alors le bouton est coché; // si 'value = 0' alors le bouton est non coché } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="Entrez le numéro de la première boîte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Entrez le numéro de la 1er boîte' edit_limit=5; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 5 caractères seulement key=inc; // la clé d'action s'applique à la référence 'inc' dans le programme lisp 'corridor' } } spacer_0; // création d'un espacement : column { spacer_0; // création d'un espacement :edit_box {label="Spécifiez la hauteur du texte :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Spécifiez la hauteur du texte' edit_limit=7; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 7 caractères seulement key=ht; // la clé d'action s'applique à la référence 'ht' dans le programme lisp 'corridor' } } } spacer_0;// création d'un espacement } //................................................................................................................................................... : boxed_row {label="Dimensions des boîtes";// 'boxed_row permet de présenter la question sous la forme // d'une 'rangée encadrée'dans la boîte d'édition : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement :edit_box {label="largeur du corridor en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'largeur du corridor en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=larg; // la clé d'action s'applique à la référence 'larg' dans le programme lisp 'corridor' } } spacer_0;// création d'un espacement : column { spacer_0;// création d'un espacement spacer_0;// création d'un espacement :edit_box {label="Longueur des boîtes en m :";// 'edit_box' est la boîte d'édition dans la boîte de dialogue, // son nom est définit par le label 'Longueur des boîtes en m' edit_limit=4; // son attribut 'edit_limit' définis le nombre de caractère inscrisptible edit_width=4; // l'attribut 'edit_width' définis la largeur en nombre de caractères // ici nous pouvons écrire 4 caractères seulement key=long; // la clé d'action s'applique à la référence 'long' dans le programme lisp 'corridor' } } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // :boxed_row {label="longueur de boîte fixée :"; // :radio_row{ // spacer_0; // :radio_button {label="1Km"; key=cas0; value="1";} // :radio_button {label="5Km"; key=cas1; value="0";} // } // } // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } } spacer_1;// création d'un espacement : row {// rangée du bouton 'OK' et 'Annuler' : button {key = "accept"; label = " OK "; is_default = true; } : button { key = "cancel"; label = " Annuler "; is_default = false; is_cancel = true; } } } ;;; ; CORRIDOR.LSP ;;; ; ;;; ; Création des boîtes le long de la Trajectoire de vol de l'hélicoptère. ;;; ; Ces boîtes correspondent aux limites du Perimètre du Corridor. ;;; ; Ces limites sont composées de boîtes juxtaposées toujours perpendiculaires à la trajectoire, ;;; ; dont les paramètres de longueur des boîtes et de largeur du corridor sont réglables, ;;; ; par une simple entrée au clavier dans la boîte de dialogue du programme. ;;; ; Après chargement, l'exécution de la fonction "CORRIDOR" est obtenu par : ;;; ; -> commande : (corridor) ;;; ; sélection polyligne, coordonnées des sommet & calcul longueur ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boite DCL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:corridor () ;;; (setq dcl_id (load_dialog "Boite de dialogue Boîtes Numérotées.dcl")) ;;; (if ;;; (not (new_dialog "boite_de_dialogue_Boîtes_Numérotées" dcl_id)) ;;; (exit) ;;; ) ;;; ;si il n'y a pas de boite de dialogue alors on lance le programme sans elle ;;; ;;; ;;; ;image en .sld ;;; ;;; (setq x1 (dimx_tile "vignettecorridor") ;coordonnées x du coin inférieur droit de l'image nom de l'image que l'on donne dans la boite de dialogue ;;; y1 (dimy_tile "vignettecorridor")) ;coordonnées y du coin inférieur droit de l'image ;;; (start_image "vignettecorridor") ;Début du traitement d'un controle image ;;; (fill_image 0 0 (dimx_tile "vignettecorridor") (dimy_tile "vignettecorridor") 0) ;;; (slide_image 0 0 x1 y1 "corridor_image") ;centrage de la diapo ;;; (end_image) ;;; ;;; ;inversion du sens de la trajectoire ;;; (action_tile "inverse0" "(setq inverse \"0\")"); affecte donc l'action inverse = 2 à évaluer lorsque nous sélectionnons la variable inverse2 . ;;; (action_tile "inverse1" "(setq inverse \"1\")"); affecte donc l'action inverse = 3 à évaluer lorsque nous sélectionnons la variable inverse3 . ;;; ;;; ;;; ;;; ;nuréroté les boîtes ;;; (action_tile "Cas0" "(setq cas \"0\")"); affecte donc l'action cas = 0 à évaluer lorsque nous sélectionnons la variable Cas0 . ;;; (action_tile "Cas1" "(setq cas \"1\")"); affecte donc l'action cas = 1 à évaluer lorsque nous sélectionnons la variable Cas1 . ;;; ;;; ;;; ;; initialiser les variables ;;; ;;;(if (not largeur_corridor) (setq largeur_corridor "1500")). ;;; ;;;;;;(if (not cas) (setq cas "cas0")) ;;; ;;;(if (not position_liste) (setq position_liste "0")). ;;; ;;; ;;; ;;;;; initialiser la boite de dialogue. ;;; ;;;(set_tile "larg_corridor" largeur_corridor). ;;; ;;;(set_tile "cas" cas). ;;; ;;;(set_tile "bloc" position_liste). ;;; ;;; ;;; ;largeur de la boite du corridor. ;;; ;permet d'écrire la valeur de la largeur de la boite du corridor par une entrée numérique ;;; (action_tile "larg" "(setq larg $value)") ;;; ; " action_tile " affecte l'action " largeur_boite " à évaluer lorsque nous sélectionnons le composant " larg ". ;;; ;;; ;;; ;longueur de la boite du corridor. ;;; ;permet d'écrire la valeur de la longueur de la boite du corridor par une entrée numérique ;;; (action_tile "long" "(setq long $value)") ;;; ; " action_tile " affecte l'action " longueur_boite " à évaluer lorsque nous sélectionnons le composant " long ". ;;; ;;; ;;; ;premier numero de la boite du corridor. ;;; ;permet d'écrire la valeur des numeros dans les boites du corridor par une entrée numérique ;;; (action_tile "inc" "(setq inc $value)") ;;; ; " action_tile " affecte l'action " le premier numero de la boite " à évaluer lorsque nous sélectionnons le composant " inc ". ;;; ;;; ;;; ;hauteur du texte dans les boites du corridor. ;;; ;permet d'écrire la valeur de la hauteur du texte dans les boites du corridor par une entrée numérique ;;; (action_tile "ht" "(setq ht $value)") ;;; ; " action_tile " affecte l'action " hauteur du texte " à évaluer lorsque nous sélectionnons le composant " ht ". ;;; ;;; ;;; ;;; ;;; (action_tile "accept" "(done_dialog 1)") ;1 pour OK ; ;;; (action_tile "cancel" "(done_dialog 0)") ;o pour Cancel ; ;;; ;;; (setq what_next (start_dialog)); démarre la boîte de dialogue. ;;; (unload_dialog dcl_id) ;;; ;;; (if ;;; (= what_next 1) ;; ok ;;; (progn ;;; ;;; (setq bloc_largeur (nth (atoi position_liste) liste_bloc)); " atoi " convertit la chaîne de caractère " position_liste " en un nombre entier. ;;; ;;;(alert (strcat "Largeur corridor : " largeur_corridor)) ;;; ;;;(alert (strcat "Cas : " (itoa cas))) ;;; ;;;(alert (strcat "Largeur bloc : " bloc_largeur)) ;;; ;;; ) ;;; ) ;;; (corridor) ; on lance le programme boite ;;; ;;; (princ) ;;; ;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;;(defun boite () ;;; ;;; ;;; (setvar "attdia" 0) ;Détermine si la commande INSERT utilise une boîte de dialogue ;;; ;pour la saisie de la valeur d'attribut. Voir la section "INSERT, ligne de commande",. ;;; ;Variables système ;;; ;0 Affiche les messages sur la ligne de commande ;;; ;1 Utilise une boîte de dialogue ;;; ;;; (setvar "osmode" 0) ;gère l'accrochage aux objets ici mode 0 donc désactivé. ;;; (setvar "cmdecho" 0) ;gère le mode d'écho des commandes dans l'environnement d'AutoCAD, ici mode 0 donc désactivé. ;;; ;;; (setq largeur_corridor (atoi largeur_corridor)); " atoi " convertit la chaîne de caractère " largeur_corridor " en un nombre entier. ;;; (setq cas (atoi cas)) ;;; (setq inverse (atoi inverse)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PARTIE DE PROGRAMME QUI MARCHE INDEPENDAMMENT DE LA PREMIERE PARTIE ; SUR LA INVERSION DE LA TRAJECTOIRE QUI MARCHE AUSSI INDEPENDAMMENT ; MAIS QUE JE NE PARVIENS PAS A LIER AVEC LE RESTE. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; version du programme de génération des boîtes avec numérotation incrémentée. ;;; (defun c:corridor (/ erreur JoinPlines AcDoc Space inc ;;;ht ent long larg pl0 nor pl1 ;;;pl2 ps1 ps2 nb n pt0 pa0 ;;;pt1 pt2 cut1 cut2 txt ;;;) (vl-load-com) ;; Redéfintion de *error* (fermeture du groupe d'annulation) (defun erreur (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)) ) (setq *error* m:err m:err nil ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;inversion du sens de la trajectoire fonction reverse LWPOLYLINE" ;;; ;;; (if ;;; (= inverse 3) ;;; (progn ;;; ;;; R_PLINE Fonction d'appel (initget "Oui Non") (if (/= "Non" (getkword "\nInversez le sens de la trajectoire ? [Oui/Non] < Oui >: ") ) (defun r_pline (/ ent) (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length trajectoire)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n trajectoire))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n trajectoire))) (setq liste (cons (cdr (nth n trajectoire)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (while (not (setq ent (car (entsel))))) (if (or (= (cdr (assoc 0 (entget ent))) "corridor" "num") (and (= (cdr (assoc 0 (entget ent))) "corridor" "num") (zerop (logand 240 (cdr (assoc 70 (entget ent))))) ) ) (reverse_pline ent) (prompt "\nEntité non valide") ) (princ) (defun reverse_pline (ent / e_lst vtx v_lst p_lst l_vtx) (setq e_lst (entget ent)) (cond ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq vtx (entnext ent)) (while (= (cdr (assoc 0 (entget vtx))) "VERTEX") (setq v_lst (cons (entget vtx) v_lst) vtx (entnext vtx) ) ) ) ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq p_lst (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42)) ) e_lst ) e_lst (vl-remove-if '(lambda (x) (member x p_lst) ) e_lst ) ) (while p_lst (setq v_lst (cons (list (car p_lst) (cadr p_lst) (caddr p_lst) (cadddr p_lst)) v_lst ) p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst)) ) ) ) ) (setq l_vtx (last v_lst) l_vtx (subst (cons 40 (cdr (assoc 41 (car v_lst)))) (assoc 40 l_vtx) l_vtx ) l_vtx (subst (cons 41 (cdr (assoc 40 (car v_lst)))) (assoc 41 l_vtx) l_vtx ) l_vtx (subst (cons 42 (- (cdr (assoc 42 (car v_lst))))) (assoc 42 l_vtx) l_vtx ) ) (setq v_lst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) x) x (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) x) x (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x) ) ) v_lst (cdr v_lst) ) ) (if (= (logand 1 (cdr (assoc 70 e_lst))) 1) (setq v_lst (append (list l_vtx) v_lst)) (setq v_lst (append v_lst (list l_vtx))) ) (cond ((= (cdr (assoc 0 e_lst)) "corridor" "num") (mapcar 'entmake (append (list e_lst) v_lst (list (entget vtx))) ) (entdel ent) ) ((= (cdr (assoc 0 e_lst)) "corridor" "num") (setq e_lst (append e_lst (apply 'append v_lst))) (entmod e_lst) ) (if (/= "Non" (getkword "\nNuméroter les boites ? [Oui/Non] < Oui >: ") ) (progn (command reverse_inc "corridor" "num") (if (setq inc (getint (strcat "\nEntrez le numéro de la première boîte ? <" (itoa (vlax-ldata-get "corridor" "num")) ">: " ) ) ) (vlax-ldata-put "corridor" "num" inc) (setq inc (vlax-ldata-get "corridor" "num")) ) (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte <" (rtos (getvar "TEXTSIZE")) ">: " ) ) ) (setvar "TEXTSIZE" ht) (setq ht (getvar "TEXTSIZE") ) ) ) ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Joint deux polylignes en une polyligne fermée (defun JoinPlines (p1 p2 / v1 v2 i lst pl) (command "-calque" "e" "corridor" "co" "jaune" "corridor" "tl" "CONTINUOUS" "corridor" "") (setq v1 (fix (vlax-curve-getEndParam p1)) v2 (fix (vlax-curve-getEndParam p2)) i 0 ) (repeat v1 (setq lst (cons (cons i (vla-getBulge p1 i)) lst) i (1+ i) ) ) (setq i (1+ i)) (repeat v2 (setq lst (cons (cons i (- (vla-GetBulge p2 (setq v2 (1- v2))))) lst) i (1+ i) ) ) (setq pl (vlax-invoke Space 'addLightWeightPolyline (append (vlax-get p1 'Coordinates) (apply 'append (reverse (split-list (vlax-get p2 'Coordinates) 2)) ) ) ) ) (vla-put-Closed pl :vlax-true) (mapcar '(lambda (x) (vla-SetBulge pl (car x) (cdr x))) lst) (vla-put-Normal pl (vla-get-Normal p1)) (vla-put-Elevation pl (vla-get-Elevation p1)) (vla-delete p1) (vla-delete p2) pl ) ;;; Fonction principale ;;; (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) m:err *error* *error* erreur ) (or (vlax-ldata-get "corridor" "long") (vlax-ldata-put "corridor" "long" 1000.0) ) (or (vlax-ldata-get "corridor" "larg") (vlax-ldata-put "corridor" "larg" 600.0) ) (or (vlax-ldata-get "corridor" "num") (vlax-ldata-put "corridor" "num" 1) ) (initget "Oui Non") (if (/= "Non" (getkword "\nNuméroter les boites ? [Oui/Non] < Oui >: ") ) (progn (if (setq inc (getint (strcat "\nEntrez le numéro de la première boîte ? <" (itoa (vlax-ldata-get "corridor" "num")) ">: " ) ) ) (vlax-ldata-put "corridor" "num" inc) (setq inc (vlax-ldata-get "corridor" "num")) ) (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte <" (rtos (getvar "TEXTSIZE")) ">: " ) ) ) (setvar "TEXTSIZE" ht) (setq ht (getvar "TEXTSIZE") ) ) ) ) (while (not (setq ent (car (entsel "\nSélectionner une polyligne: "))) ) ) (initget 6) (if (setq long (getdist (strcat "\nLongueur des boites <" (rtos (vlax-ldata-get "corridor" "long")) ">: " ) ) ) (vlax-ldata-put "corridor" "long" long) (setq long (vlax-ldata-get "corridor" "long")) ) (initget 6) (if (setq larg (getdist (strcat "\nLargeur des boites <" (rtos (vlax-ldata-get "corridor" "larg")) ">: " ) ) ) (vlax-ldata-put "corridor" "larg" larg) (setq larg (vlax-ldata-get "corridor" "larg")) ) (vla-StartUndoMark AcDoc) (setq pl0 (vlax-ename->vla-object ent) nor (vlax-get pl0 'Normal) pl1 (car (vlax-invoke pl0 'Offset (/ larg 2.0))) pl2 (car (vlax-invoke pl0 'Offset (/ larg -2.0))) ps1 (trans (vlax-curve-getPointAtParam pl1 0) 0 nor) ps2 (trans (vlax-curve-getPointAtParam pl2 0) 0 nor) nb (fix (/ (vlax-curve-getDistAtParam pl0 (vlax-curve-getEndParam pl0) ) long ) ) n 1 ) (progn (command "-calque" "e" "LIMITE" "co" "bleu" "LIMITE" "tl" "CONTINUOUS" "LIMITE" "") ) (princ) (repeat nb (setq pt0 (vlax-curve-getPointAtDist pl0 (* n long)) pa0 (vlax-curve-getParamatpoint pl0 pt0) ) (if (equal pa0 (fix pa0) 1e-9) (setq pt1 (vlax-curve-getPointatParam pl1 1) pt2 (vlax-curve-getPointatParam pl2 1) ) (setq pt1 (vlax-curve-getClosestPointTo pl1 pt0) pt2 (vlax-curve-getClosestPointTo pl2 pt0) ) ) (setq cut1 (CutPlineAtPoint pl1 pt1) cut2 (CutPlineAtPoint pl2 pt2) ) (cond ((not (car cut1)) (vlax-put pl2 'Coordinates (append (vlax-get pl2 'Coordinates) (reverse (cdr (reverse (trans pt1 0 nor)))) ) ) (vla-put-Closed pl2 :vlax-true) (vla-put-Layer pl2 (getvar "CLAYER")) ) ((not (car cut2)) (vlax-put pl1 'Coordinates (append (vlax-get pl1 'Coordinates) (reverse (cdr (reverse (trans pt2 0 nor)))) ) ) (vla-put-Closed pl1 :vlax-true) (vla-put-Layer pl1 (getvar "CLAYER")) ) (T (JoinPlines (car cut1) (car cut2))) ) (progn ;;; définition du calque de la numérotation des boîtes ;;; (command "-calque" "e" "txt" "co" "vert" "txt" "tl" "CONTINUOUS" "txt" "") ) (princ) ;;; fin attribution des caractéristiques de la numérotation ;;; (setq txt (vla-addText Space (itoa inc) (vlax-3d-point '(0 0 0)) ht ) ) (vla-put-Normal txt (vlax-3d-point nor)) (vla-put-Alignment txt 10) (vla-put-TextAlignmentPoint txt (vlax-3d-point (vlax-curve-getPointAtDist pl0 (- (* n long) (/ long 2))) ) ) (setq n (1+ n) inc (1+ inc) pl1 (cadr cut1) pl2 (cadr cut2) ) ) (cond ((not pl1) (vlax-put pl2 'Coordinates (append (vlax-get pl2 'Coordinates) (list (car ps1) (cadr ps1) ) ) ) (vla-put-Closed pl2 :vlax-true) (vla-put-Layer pl2 (getvar "CLAYER")) ) ((not pl2) (vlax-put pl1 'Coordinates (append (vlax-get pl1 'Coordinates) (list (car ps2) (cadr ps2)) ) ) (vla-put-Closed pl1 :vlax-true) (vla-put-Layer pl1 (getvar "CLAYER")) ) (T (JoinPlines pl1 pl2)) ) (setq txt (vla-addText Space (itoa inc) (vlax-3d-point '(0 0 0)) ht ) ) (vla-put-Normal txt (vlax-3d-point nor)) (vla-put-Alignment txt 10) (vla-put-TextAlignmentPoint txt (vlax-3d-point (vlax-curve-getPointAtDist pl0 (/ (+ (vlax-curve-getDistatPoint pl0 pt0) (vlax-curve-getDistAtParam pl0 (vlax-curve-getEndParam pl0) ) ) 2.0 ) ) ) ) (vlax-ldata-put "corridor" "num" inc) (vla-EndUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) ) ;;; fin du programme principal ;;; ;;;************************* SOUS ROUTINES *************************;;; ;;; Angle2Bulge ;;; Retourne le bulge correspondant à un angle (defun Angle2Bulge (a) (/ (sin (/ a 4.0)) (cos (/ a 4.0))) ) ;;; ArcCenterBy3Points ;;; Retourne le centre de l'arc décrit par 3 points (defun ArcCenterBy3Points (p1 p2 p3) ((lambda (mid1 mid2) (inters mid1 (polar mid1 (+ (angle p1 p2) (/ pi 2)) 1.0) mid2 (polar mid2 (+ (angle p2 p3) (/ pi 2)) 1.0) nil ) ) (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p1 p2) (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p2 p3) ) ) ;;; SUBLST Retourne une sous-liste ;;; Premier élément : 1 ;;; (sublst '(1 2 3 4 5 6) 3 2) -> (3 4) ;;; (sublst '(1 2 3 4 5 6) 3 -1) -> (3 4 5 6) ;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6) ;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6) (defun sublst (lst start leng / rslt) (or (<= 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) ) ;; SPLIT-LIST Retourne une liste de sous-listes ;; Arguments ;; - lst : la liste à fractionner ;; - num : un entier, le nombre d'éléments des sous listes ;; Exemples : ;; (split-list '(1 2 3 4 5 6 7 8) 2) -> ((1 2) (3 4) (5 6) (7 8)) ;; (split-list '(1 2 3 4 5 6 7 8) 3) -> ((1 2 3) (4 5 6) (7 8)) (defun split-list (lst n) (if lst (cons (sublst lst 1 n) (split-list (sublst lst (1+ n) nil) n) ) ) ) ;;; CutPlineAtPoint ;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés ;;; (ename ou vla-object selon le type de l'argument pl) ;;; ;;; Arguments ;;; pl : la polyligne à couper (ename ou vla-object) ;;; pt : le point de coupure sur la polyligne (coordonnées SCG) (defun CutPlineAtPoint (pl pt / ec vl lst) (and (= (type pl) 'VLA-OBJECT) (setq pl (vlax-vla-object->ename pl) vl T ) ) (cond ((equal pt (vlax-curve-getEndPoint pl) 1e-9) (setq lst (list pl nil)) ) ((equal pt (vlax-curve-getStartPoint pl) 1e-9) (setq lst (list nil pl)) ) ((null (vlax-curve-getParamAtPoint pl pt)) (setq lst (list pl nil)) ) (T (setq ec (getvar "cmdecho")) (setvar "cmdecho" 0) (vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@") (setvar "cmdecho" ec) (setq lst (list pl (entlast))) ) ) (if vl (mapcar '(lambda (x) (if x (vlax-ename->vla-object x) ) ) lst ) lst ) ) merci à +
  4. Bonjour à tous et merci gile pour tes conseils et explications. j'ai essayé le programme et formidable il fonctionne à merveille j'ai changer les couleurs et attributions des calques pour les boites et les textes ça marche à peu près mais j'ai toujours un petit soucis car le dernier chiffre reste dans sa couleur et calque d'origine. j'essais de faire une boîte de dialogue mais comme je ne comprend pas tourjours tous dans ton programme il me manque des explications sur par exemple ce que définis exactement "num" ai je bien compris s'agit il de l'abréviation de numérotation ou est ce autre chose. en tout cas il fonctionne et ça s'est super encore merci. à + doy.
  5. salut à tous, un petit tour sur le site et quelle suprise !!!!!!!! merci gile pour la rapidité de ta réponse. je le télécharge et j'essaye ça. à + doy et encore merci, cela fait plaisir de ne pas se sentir seul devant un problème quand on débute et de ne plus avoir un écran vide de sens. ( ps : un petit mot pour charlie69 qui ne donne plus de nouvelle).
  6. de nouveau sur la brèche salut pour mon programme de création des boîtes, ne pourrait on pas me dire si l'on peut l'améliorer et si pour le continuer aprés la décomposition des blocs poursuivre par l'insertion de points par la commande mesurer avec un certain retrait ( par exemple de la moitié de la distance que j'ai utilisé vpour inserer mes blocs et donc utiliser ces points comme référence pour générer les contours dans la zone qui entoure le point. j'espère que j'ai été assez clair. à bientôt et merci.
  7. salut gile effectivement je ne parviens pas à executer les routines correctement et en plus pour ton super programme sur les boîtes je ne comprends pas le début qui dit je cite : redefinition de error................. mais je continue à l'étudier car il m'apprend plein de choses que je connaissais pas. à + doy
  8. Salut gile, et merci pour les infos concernant les cours sur le lisp je viens d'y jeter un rapide coup d'oeil il ne me reste plus qu'a le traduire mais j'y entrevois déjà de nombreuses possibilités intéressantes. encore merci pour tous les conseils avisés, je commence à apprécier le langage lisp et a en entrevoir les formidables débouchés. à + denis.
  9. salut, je viens juste de l'essayer aussi sur différent poste de travail et il me renvois toujours le même message d'erreur. en plus je ne comprend pas certaine chose : le " vla-endundomark......." le " setq *error* m:err......." le " vla-getBulge ..............." Peux tu m'indiquer un livre ou un site @ où je puisse trouver les informations et un complément de cours sur le langage Lisp et ses fonctions. Par avance merci à + doy.
  10. Bonjour à tous, Je viens de télécharger vos deux réponses. Je suis actuellement en phase d'essai et de comprehension de vos proses. à ce sujet dans le programme de gile, je ne comprend pas l'utilisation de "" unwind "" en plus quand je lance ce programme pour le tester il me retourne ce message : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 5 feuilles chargé à partir de # _$ (c:bcorridor) ; erreur: une exception s'est produite: 0xC0000005 (Violation d'accès) ; avertissement: fonction unwind ignorée erreur inconnue _$ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; que signifit ceci ??????? je continue à étudier le reste et encore merci pour ces réponces riche en informations. à + doy
  11. Bonjour à tous, Quelle n'a pas été ma surprise en consultant mes emails de voir autant de sollicitude pour mon programme. avant toute chose je tient a remercier tout particulièrement et pour ne citer qu'eux "patrick_35", "PHILPHIL", "Bred", et "Didier-AD", "et les autres ........" pour leur intérêt et leur aide. Effectivement au vue du dessin que tu m'a envoyé il correspond tout à fait semble t il à mes besoins. je dois pouvoir générer automatiquement des contours fermés et indépendant les uns des autres. à + doy. PS : je suis impatient de voir la suite.
  12. rebonjour, Pour vous répondre voici quelques explications. je dois construire des boîtes qui se suivent et qui soient indépandente les une des autres, afin de pouvoir selectionner ses boîtes ( contours ) pour y charger un semis de points topographiques. Ce semis de points topo est volumineux se qui nous oblige à fragmenter ce semis de points en plusieurs tronçons que nous appelons boites. ces boîtes sont composées des deux lignes ( blocs décomposés ) aux extrémités de notre boite et des deux morceaux de limites du corridor pour le dessin j'aimerais bien mais je ne sais pas comment on fait sur ce forum pour insérer ou copier ou mettre en pièce jointe un dessin. à + et merci de m'avoir répondu.
  13. Salut Patrick_35, j'ai bien reçu ton message, mais est se de l'humour !!!!!!!!! je ne comprends pas ce que tu veux me dire. à + doy.
  14. Bonjour à tous, Je développe toujours mon programme de création des boîtes suivant une trajectoire. j'ai réussi à sélectionner mes blocs et à les décomposer mais maintenant je bloque. je me retouve avec mes blocs décomposés et mes limites de corridor, ces deux éléments étant respectivement dans des calques différents. je me pose la question de savoir si je dois reselectionner les divers éléments pour les mettre dans un même calque ou si je peux les laisser dans des calques différents, le but tant à partir de ces entités " blocs" et "polyligne = limites corridor" de créer des boîtes. ces boîtes doivent être des contours ( polylignes ) fermés que l'on pourra par la suite extraire séparément. SEULEMENT je ne sais pas comment écrire tous ceci en langage lisp !!!!!!! Par avance un grand merci à tous ceux qui m'ont aidé. à + doy. je joins le programme que j'ai déjà écris. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ; CORRIDOR.LSP ;;; ; ;;; ; Création des boîtes le long de la Trajectoire de vol de l'hélicoptère. ;;; ; Ces boîtes correspondent aux limites du Perimètre du Corridor. ;;; ; Ces limites sont composées de boîtes juxtaposées toujours perpendiculaires à la trajectoire, ;;; ; dont les paramètres de longueur des boîtes et de largeur du corridor sont réglables, ;;; ; par une simple entrée au clavier dans la ligne de commande d'AutoCAD. ;;; ; Après chargement, l'exécution de la fonction "boite" est obtenu par : ;;; ; -> commande : (boite) ;;; ; selection polyligne, coordonnées des sommet & calcul longueur ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boite DCL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:corridor () (setq dcl_id (load_dialog "Boite de dialogue corridor.dcl")) (if (not (new_dialog "boite_de_dialogue_corridor" dcl_id)) (exit) ) ;si il n'y a pas de boite de dialogue alors on lance le programme sans elle ;image en .sld (setq x1 (dimx_tile "img1") ;coordonnées x du coin inférieur droit de l'image nom de l'image que l'on donne dans la boite de dialogue y1 (dimy_tile "img1")) ;coordonnées y du coin inférieur droit de l'image (start_image "img1") ;Début du traitement d'un controle image (fill_image 0 0 (dimx_tile "img1") (dimy_tile "img1") 0) (slide_image 0 0 x1 y1 "corridor_image") ;centrage de la diapo (end_image) (action_tile "inverse0" "(setq inverse \"0\")"); affecte donc l'action inverse = 2 à évaluer lorsque nous sélectionnons la variable inverse2 . (action_tile "inverse1" "(setq inverse \"1\")"); affecte donc l'action inverse = 3 à évaluer lorsque nous sélectionnons la variable inverse3 . ;j'établit la liste des blocs qui seront insérés dans les listes déroulantes (setq liste_bloc '("b600" "b600 1" "li3" "lib")) ;; initialiser les variables ;;;(if (not largeur_corridor) (setq largeur_corridor "1500")). ;;;;;;(if (not cas) (setq cas "cas0")) ;;;(if (not position_liste) (setq position_liste "0")). ;;; ;;;;; initialiser la boite de dialogue. ;;;(set_tile "larg_corridor" largeur_corridor). ;;;(set_tile "cas" cas). ;;;(set_tile "bloc" position_liste). ;largeur du corridor. (action_tile "larg_corridor" "(setq largeur_corridor $value)") ; " action_tile " affecte l'action " larg_corridor " à évaluer lorsque nous sélectionnons le composant " largeur_corridor ". ;largeur des boites. (action_tile "cas0" "(setq cas \"0\")"); affecte donc l'action cas = 0 à évaluer lorsque nous sélectionnons la variable cas0 . (action_tile "cas1" "(setq cas \"1\")"); affecte donc l'action cas = 1 à évaluer lorsque nous sélectionnons la variable cas1 . (start_list "bloc"); lance la création d'une liste " bloc " dans la zone de liste. (mapcar 'add_list liste_bloc); mapcar renvoie la liste " liste_bloc " en résultat de l'execution de la fonction " add_list ". ; la fonction " add_list "ajoute et modifie dans la liste de la boîte de dialogue les éléments de " liste_bloc ". (end_list); met fin au traitement de la liste de la boîte de dialogue courante. (action_tile "bloc" "(setq position_liste $value)"); affecte l'action " cas " à évaluer lorsque nous sélectionnons le composant " cas ". (action_tile "accept" "(done_dialog 1)") ;1 pour OK ; (action_tile "cancel" "(done_dialog 0)") ;o pour Cancel ; (setq what_next (start_dialog)); démarre la boîte de dialogue. (unload_dialog dcl_id) (if (= what_next 1) ;; ok (progn (setq bloc_largeur (nth (atoi position_liste) liste_bloc)); " atoi " convertit la chaîne de caractère " position_liste " en un nombre entier. ;;;(alert (strcat "Largeur corridor : " largeur_corridor)) ;;;(alert (strcat "Cas : " (itoa cas))) ;;;(alert (strcat "Largeur bloc : " bloc_largeur)) ) ) (boite) ; on lance le programme boite (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun boite () (setvar "attdia" 0) ;Détermine si la commande INSERT utilise une boîte de dialogue ;pour la saisie de la valeur d'attribut. Voir la section "INSERT, ligne de commande",. ;Variables système ;0 Affiche les messages sur la ligne de commande ;1 Utilise une boîte de dialogue (setvar "osmode" 0) ;gère l'accrochage aux objets ici mode 0 donc désactivé. (setvar "cmdecho" 0) ;gère le mode d'écho des commandes dans l'environnement d'AutoCAD, ici mode 0 donc désactivé. (setq largeur_corridor (atoi largeur_corridor)); " atoi " convertit la chaîne de caractère " largeur_corridor " en un nombre entier. (setq cas (atoi cas)) (setq inverse (atoi inverse)) (command "-calque" "e" "LIMITE" "co" "bleu" "LIMITE" ""); définit les paramètres du calque " LIMITE ". (command "-calque" "e" "pk" "co" "magenta" "pk" "ch" "pk" ""); définit les paramètres du calque " Pk ". ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;inversion du sens de la trajectoire fonction reverse LWPOLYLINE" (if (= inverse 3) (progn ;;; R_PLINE Fonction d'appel ;;; (defun r_pline (/ ent) (while (not (setq ent (car (entsel))))) (if (or (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") (and (= (cdr (assoc 0 (entget ent))) "POLYLINE") (zerop (logand 240 (cdr (assoc 70 (entget ent))))) ) ) (reverse_pline ent) (prompt "\nEntité non valide") ) (princ) ;;; ) (defun reverse_pline (ent / e_lst vtx v_lst p_lst l_vtx) (setq e_lst (entget ent)) (cond ((= (cdr (assoc 0 e_lst)) "POLYLINE") (setq vtx (entnext ent)) (while (= (cdr (assoc 0 (entget vtx))) "VERTEX") (setq v_lst (cons (entget vtx) v_lst) vtx (entnext vtx) ) ) ) ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE") (setq p_lst (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42)) ) e_lst ) e_lst (vl-remove-if '(lambda (x) (member x p_lst) ) e_lst ) ) (while p_lst (setq v_lst (cons (list (car p_lst) (cadr p_lst) (caddr p_lst) (cadddr p_lst)) v_lst ) p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst)) ) ) ) ) (setq l_vtx (last v_lst) l_vtx (subst (cons 40 (cdr (assoc 41 (car v_lst)))) (assoc 40 l_vtx) l_vtx ) l_vtx (subst (cons 41 (cdr (assoc 40 (car v_lst)))) (assoc 41 l_vtx) l_vtx ) l_vtx (subst (cons 42 (- (cdr (assoc 42 (car v_lst))))) (assoc 42 l_vtx) l_vtx ) ) (setq v_lst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) x) x (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) x) x (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x) ) ) v_lst (cdr v_lst) ) ) (if (= (logand 1 (cdr (assoc 70 e_lst))) 1) (setq v_lst (append (list l_vtx) v_lst)) (setq v_lst (append v_lst (list l_vtx))) ) (cond ((= (cdr (assoc 0 e_lst)) "POLYLINE") (mapcar 'entmake (append (list e_lst) v_lst (list (entget vtx))) ) (entdel ent) ) ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE") (setq e_lst (append e_lst (apply 'append v_lst))) (entmod e_lst) ) ) ) (command "-calque" "ch" "LIMITE" ""); Choix du calque " LIMITE ". ; double décalage à gauche et à droite. ;(attribut du double décalage (ddllpp) (/ Vdist entité1 pt1 pt2 entitépoints anglepl PtGauche PtDroite) ; la largeur du corridor = distance de decalage. (setq trajectoire (entget (car (entsel "Selectionner la ligne ou la polyligne représentant la trajectoire:")); demande de sélectionner l'objet " trajectoire " ; en spécifiant un point. ) ) (if (eq (cdr (assoc 0 trajectoire)) "LINE"); " assoc " recherche l'élément " trajectoire " dans la liste d'association " LINE " ou " entitétrajectoire " ; et renvoie l'entrée correspondante. ;;; determine si l'objet est ligne ou polyligne. (progn (Setq P1 (cdr (assoc 10 trajectoire))) (setq P2 (cdr (assoc 11 trajectoire))) ) (progn (setq entitétrajectoire (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) trajectoire) ); " mapcar " permet l'application de la fonction " lambda " [ qui elle même définis une fonction sans nom ; ( pour éviter d'encombrer la mémoire ) et lambda retourne la valeur de sa dernière expression " entitétrajectoire "] ; aux éléments successifs de la liste " trajectoire " de " P1 " à " P2 " qu'elle fournies comme arguments à la fonction " lambda ". ) (progn (progn (setq P1 (car entitétrajectoire))); " car " renvoie le premier élément de la liste " entitétrajectoire ". (progn (setq P2 (cadr entitétrajectoire))); " cadr " renvoie le deuxième élément de la liste " entitétrajectoire ". ) ) ) (setq anglepl (angle P1 P2)); définis l'angle entre les points P1 et p2. (setq PtGauche (polar P1 (+ anglepl (/ pi 2)) largeur_corridor)); détermine le coté gauche de décalage par rapport à la trajectoire par le ptGauche. (setq PtDroite (polar P1 (- anglepl (/ pi 2)) largeur_corridor)); détermine le coté droit de décalage par rapport à la trajectoire par le ptDroite. ;;; commande appelant la fonction " decaler ". (command "_offset" (/ largeur_corridor 2) P1 PtGauche ""); commande de décalage à gauche de la polyligne par rapport à la polyligne trajectoire. (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" ""); définition des paramètres du calque de destination de la polyligne décalée. (command "_offset" (/ largeur_corridor 2) P1 PtDroite ""); commande de décalage à droite de la polyligne par rapport à la polyligne trajectoire. (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" ""); définition des paramètres du calque de destination de la polyligne décalée. ;;; (princ) ; fin de la fonction de double décalage. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; selection des limites. ;;; (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length trajectoire)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n trajectoire))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n trajectoire))) (setq liste (cons (cdr (nth n trajectoire)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (command "-calque" "ch" "pk" "") (setq point_fin_trajectoire (car (reverse entitétrajectoire))) ;;;(setq point_fin (car liste1)) (cond ((= cas 0) (command "mesurer" pause "b" bloc_largeur "o" 1000 "")) ((= cas 1) (command "mesurer" pause "b" bloc_largeur "o" 5000 "")) ) (setq limite1 (entget (car (entsel "Selectionner la polyligne de la limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite1)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P3 (cdr (assoc 10 limite1))) (setq P4 (cdr (assoc 11 limite1))) ) (progn (setq entitélimite1 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite1) ) ) (progn (progn (setq P3 (car entitélimite1))) (progn (setq P4 (cadr entitélimite1))) ) ) ) (setq point_fin_limite1 (car (reverse entitélimite1))) (setq limite2 (entget (car (entsel "Selectionner la polyligne de l'autre limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite2)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P5 (cdr (assoc 10 limite2))) (setq P6 (cdr (assoc 11 limite2))) ) (progn (setq entitélimite2 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite2) ) ) (progn (progn (setq P5 (car entitélimite2))) (progn (setq P6 (cadr entitélimite2))) ) ) ) (setq point_fin_limite2 (car (reverse entitélimite2))) (setq angle_debut (angle P2 P3)) (setq angle_fin (angle point_fin_trajectoire point_fin_limite1)) (command "ligne" P3 P5 "") (command "ligne" point_fin_limite2 point_fin_limite1 "") ; (nom de la commande / retour à covadis / b pour bloc / position orthogonale / grandeur numérique de la longueur de la boîte. (princ) ) ;Fin si OUI (progn (command "-calque" "ch" "LIMITE" ""); Choix du calque " LIMITE ". ; double décalage à gauche et à droite. ;(attribut du double décalage (ddllpp) (/ Vdist entité1 pt1 pt2 entitépoints anglepl PtGauche PtDroite) ; la largeur du corridor = distance de decalage. (setq trajectoire (entget (car (entsel "Selectionner la trajectoire:")); demande de sélectionner l'objet " trajectoire " ; en spécifiant un point. ) ) (if (eq (cdr (assoc 0 trajectoire)) "LINE"); " assoc " recherche l'élément " trajectoire " dans la liste d'association " LINE " ou " entitétrajectoire " ; et renvoie l'entrée correspondante. ;;; determine si l'objet est ligne ou polyligne. (progn (Setq P1 (cdr (assoc 10 trajectoire))) (setq P2 (cdr (assoc 11 trajectoire))) ) (progn (setq entitétrajectoire (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) trajectoire) ); " mapcar " permet l'application de la fonction " lambda " [ qui elle même définis une fonction sans nom ; ( pour éviter d'encombrer la mémoire ) et lambda retourne la valeur de sa dernière expression " entitétrajectoire "] ; aux éléments successifs de la liste " trajectoire " de " P1 " à " P2 " qu'elle fournies comme arguments à la fonction " lambda ". ) (progn (progn (setq P1 (car entitétrajectoire))); " car " renvoie le premier élément de la liste " entitétrajectoire ". (progn (setq P2 (cadr entitétrajectoire))); " cadr " renvoie le deuxième élément de la liste " entitétrajectoire ". ) ) ) (setq anglepl (angle P1 P2)); définis l'angle entre les points P1 et p2. (setq PtGauche (polar P1 (+ anglepl (/ pi 2)) largeur_corridor)); détermine le coté gauche de décalage par rapport à la trajectoire par le ptGauche. (setq PtDroite (polar P1 (- anglepl (/ pi 2)) largeur_corridor)); détermine le coté droit de décalage par rapport à la trajectoire par le ptDroite. ;;; commande appelant la fonction " decaler ". (command "_offset" (/ largeur_corridor 2) P1 PtGauche ""); commande de décalage à gauche de la polyligne par rapport à la polyligne trajectoire. (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" ""); définition des paramètres du calque de destination de la polyligne décalée. (command "_offset" (/ largeur_corridor 2) P1 PtDroite ""); commande de décalage à droite de la polyligne par rapport à la polyligne trajectoire. (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" ""); définition des paramètres du calque de destination de la polyligne décalée. (princ) ; fin de la fonction de double décalage. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; selection des limites. ;;; (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length trajectoire)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n trajectoire))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n trajectoire))) (setq liste (cons (cdr (nth n trajectoire)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (command "-calque" "ch" "pk" "") (setq point_fin_trajectoire (car (reverse entitétrajectoire))) ;;;(setq point_fin (car liste1)) (cond ((= cas 0) (command "mesurer" pause "b" bloc_largeur "o" 1000 "")) ((= cas 1) (command "mesurer" pause "b" bloc_largeur "o" 5000 "")) ) (setq limite1 (entget (car (entsel "Selectionner la limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite1)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P3 (cdr (assoc 10 limite1))) (setq P4 (cdr (assoc 11 limite1))) ) (progn (setq entitélimite1 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite1) ) ) (progn (progn (setq P3 (car entitélimite1))) (progn (setq P4 (cadr entitélimite1))) ) ) ) (setq point_fin_limite1 (car (reverse entitélimite1))) (setq limite2 (entget (car (entsel "Selectionner l'autre limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite2)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P5 (cdr (assoc 10 limite2))) (setq P6 (cdr (assoc 11 limite2))) ) (progn (setq entitélimite2 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite2) ) ) (progn (progn (setq P5 (car entitélimite2))) (progn (setq P6 (cadr entitélimite2))) ) ) ) (setq point_fin_limite2 (car (reverse entitélimite2))) (setq angle_debut (angle P2 P3)) (setq angle_fin (angle point_fin_trajectoire point_fin_limite1)) ;;;(command "-inserer" bloc_largeur P2 1 1 angle_debut "") ;;;(command "-inserer" bloc_largeur point_fin_trajectoire 1 1 angle_fin "") (command "ligne" P3 P5 "") (command "ligne" point_fin_limite2 point_fin_limite1 "") ; (nom de la commande / retour à covadis / b pour bloc / position orthogonale / grandeur numérique de la longueur de la boîte. (princ) ) ;Fin si NON ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Routine pour Sélectionner et Exploser tous les blocs. ; ; Permet d'exploser tous les blocs d'un dessin (même imbriqués) dans tout le dessin. ; (defun c:XB (/ layouts jeu n j i cmd) (progn (setq cmd (getvar "cmdecho")) (setvar "cmdecho" 0) (command "_.undo" "_group") (setq expl (getvar "explmode")) (setvar "explmode" 1) (setq ESP (getvar "CTAB")) (if (vl-position "Model" layouts) (setq layouts (cons "Model" (layoutlist))) ) (setq i 0) (foreach n layouts (while (setq jeu (ssget "x" (list (cons 0 "INSERT") (cons 410 n)))) (setq j 0) (command "_.layout" "_set" n) (while (ssname jeu j) (setq NB (sslength JEU)) (sssetfirst nil JEU) (setq j (+ NB j)) ) (setq i (+ i j)) ) ) (setvar "CTAB" ESP) (setvar "explmode" expl) (command "_.undo" "_end") (setvar "cmdecho" cmd) (prompt "\n ") (print i) (if (<= i 1) (prompt " bloc décomposé") (prompt " blocs décomposés") ) (prin1) ) ;fin de la routine de sélection et décomposition des blocs. (prompt "\nXB : tous les blocs ont été Exploser") (princ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fin temporaire du programme ;;;;;;;;;;;;;;;;; PS : j'y pense, comment puis je faire en sorte de numéroter ses boîtes sachant que j'ai une fonction d'inversion de sens de la polyligne trajectoire. je ne sais pas écrire la routine qui me permettrais de numéroter automatiquement mes boîtes. encore merci pour tous les conseil que l'on trouve sur ce forum.
  15. Bonjour à tous, je continue mon programme mais je ne comprend pas la commande " ( vlax-invoke obl1 list Intersectwith obj2 acExtendNone ) Par contre je voudrais sélectionner tous les blocs que j'ai inséré et seulement ces objets. Je pensais utiliser le calque qui contient ces blocs mais je ne suis pas sur. Je ne parviens pas à les sélectionner puis à les exploser. j'ai la commande explode mais je ne sais pas comment l'intégrer. merci et à +
  16. Bonjour à tous, je continue mon programme mais je ne comprend pas la commande " ( vlax-invoke obl1 list Intersectwith obj2 acExtendNone ) Par contre je voudrais sélectionner tous les blocs que j'ai inséré et seulement ces objets. Je pensais utiliser le calque qui contient ces blocs mais je ne suis pas sur. Je ne parviens pas à les sélectionner puis à les exploser. j'ai la commande explode mais je ne sais pas comment l'intégrer. merci et à +
  17. bonjour à tous, Urgent, très très urgent, je ne parviens pas à utiliser les commandes d'intersection et de reconstitution de contour. comment peut on récupperer les coordonnées des extrémités des lignes, polyligne et de blocs composé d'une ligne. @ + et encore merci pour les nombreuses informations que l'on trouve sur ce site.
  18. bonjour à tous, j'ai un petit problème avec ma boîte de dialogue qui marche un coup sur deux !!!! je ne parviens pas à insérer correctement mes blocs aux extrémités de ma polyligne " trajectoire ", ils ne sont jamais perpendiculaire à celle ci comme se devrait être le cas. je ne parviens toujours pas à créer mes intersections entre mes blocs décomposés et mes polylignes décalées qui correspondent aux limites exterieures de mon corridor. comme je ne pas créer mes boîtes (le contour de chaque boîte étant une polyligne fermés "" très très important "" ), je ne peus pas faire une numérotation automatique indexée sur chaque boîte suivant le sens de parcourt de la polyligne "trajectoire". comment récupérer les points sommets de mes boîtes pour insérer le blocs qui indiquera le numéro de chacune de ses boîtes. voici les lignes du programme déjà écrit. ;;; ; CORRIDOR.LSP ;;; ; ;;; ; Création des boîtes le long de la Trajectoire de vol de l'hélicoptère. ;;; ; Ces boîtes correspondent aux limites du Perimètre du Corridor. ;;; ; Ces limites sont composées de boîtes juxtaposées toujours perpendiculaires à la trajectoire, ;;; ; dont les paramètres de longueur des boîtes et de largeur du corridor sont réglables, ;;; ; par une simple entrée au clavier dans la ligne de commande d'AutoCAD. ;;; ; Après chargement, l'exécution de la fonction "boite" est obtenu par : ;;; ; -> commande : (boite) ;;; ; selection polyligne, coordonnées des sommet & calcul longueur ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boite DCL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:corridor () (setq dcl_id (load_dialog "Boite de dialogue corridor.dcl")) (if (not (new_dialog "boite_de_dialogue_corridor" dcl_id)) (exit) ) ;si il n'y a pas de boite de dialogue alors on lance le programme sans elle ;j'établit la liste des blocs qui seront insérés dans les listes déroulantes (setq liste_bloc '("b600" "li3" "lib")) ;; initialiser les variables ;;;(if (not largeur_corridor) (setq largeur_corridor "1500")) ;;;;;;(if (not cas) (setq cas "cas0")) ;;;(if (not position_liste) (setq position_liste "0")) ;;; ;;;;; initialiser la boite de dialogue ;;;(set_tile "larg_corridor" largeur_corridor) ;;;(set_tile "cas" cas) ;;;(set_tile "bloc" position_liste) ;largeur du corridor (action_tile "larg_corridor" "(setq largeur_corridor $value)") ;largeur des boites (action_tile "cas0" "(setq cas \"0\")") (action_tile "cas1" "(setq cas \"1\")") (start_list "bloc") (mapcar 'add_list liste_bloc) (end_list) (action_tile "bloc" "(setq position_liste $value)") (action_tile "accept" "(done_dialog 1)") ;1 pour OK ; (action_tile "cancel" "(done_dialog 0)") ;o pour Cancel ; (setq what_next (start_dialog)) (unload_dialog dcl_id) (if (= what_next 1) ;; ok (progn (setq bloc_largeur (nth (atoi position_liste) liste_bloc)) ;;;(alert (strcat "Largeur corridor : " largeur_corridor)) ;;;(alert (strcat "Cas : " (itoa cas))) ;;;(alert (strcat "Largeur bloc : " bloc_largeur)) ) ) (boite) ; on lance le programme boite (princ) ) (defun boite () (setvar "attdia" 0) ;Détermine si la commande INSERT utilise une boîte de dialogue ;pour la saisie de la valeur d'attribut. Voir la section "INSERT, ligne de commande",. ;Variables système ;0 Affiche les messages sur la ligne de commande ;1 Utilise une boîte de dialogue (setvar "osmode" 0) (setq largeur_corridor (atoi largeur_corridor)) (setq cas (atoi cas)) (command "-calque" "e" "LIMITE" "co" "bleu" "LIMITE" "") ; double décalage à gauche et à droite. ;(attribut du double décalage (ddllpp) (/ Vdist entité1 pt1 pt2 entitépoints anglepl PtGauche PtDroite) ; la largeur du corridor = distance de decalage. (setq trajectoire (entget (car (entsel "Selectionner la ligne ou la polyligne représentant la trajectoire:")) ) ) (if (eq (cdr (assoc 0 trajectoire)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P1 (cdr (assoc 10 trajectoire))) (setq P2 (cdr (assoc 11 trajectoire))) ) (progn (setq entitétrajectoire (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) trajectoire) ) ) (progn (progn (setq P1 (car entitétrajectoire))) (progn (setq P2 (cadr entitétrajectoire))) ) ) ) (setq anglepl (angle P1 P2)) (setq PtGauche (polar P1 (+ anglepl (/ pi 2)) largeur_corridor)) (setq PtDroite (polar P1 (- anglepl (/ pi 2)) largeur_corridor)) ;;; commande appelant la fonction " decaler ". (command "_offset" (/ largeur_corridor 2) P1 PtGauche "") (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" "") (command "_offset" (/ largeur_corridor 2) P1 PtDroite "") (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" "") (princ) ; fin de la fonction de double décalage. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; selection des limites. ;;; (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length trajectoire)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n trajectoire))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n trajectoire))) (setq liste (cons (cdr (nth n trajectoire)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (command "-calque" "e" "pk" "co" "magenta" "pk" "ch" "pk" "") (setq point_fin_trajectoire (car (reverse entitétrajectoire))) ;;;(setq point_fin (car liste1)) (cond ((= cas 0) (command "mesurer" pause "b" bloc_largeur "o" 1000 "")) ((= cas 1) (command "mesurer" pause "b" bloc_largeur "o" 5000 "")) ) (setq limite1 (entget (car (entsel "Selectionner la ligne ou la polyligne de la limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite1)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P3 (cdr (assoc 10 limite1))) (setq P4 (cdr (assoc 11 limite1))) ) (progn (setq entitélimite1 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite1) ) ) (progn (progn (setq P3 (car entitélimite1))) (progn (setq P4 (cadr entitélimite1))) ) ) ) (setq point_fin_limite1 (car (reverse entitélimite1))) (setq limite2 (entget (car (entsel "Selectionner la ligne ou la polyligne de l'autre limite du corridor:")) ) ) (if (eq (cdr (assoc 0 entitélimite2)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P5 (cdr (assoc 10 limite2))) (setq P6 (cdr (assoc 11 limite2))) ) (progn (setq entitélimite2 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) limite2) ) ) (progn (progn (setq P5 (car entitélimite2))) (progn (setq P6 (cadr entitélimite2))) ) ) ) (setq point_fin_limite2 (car (reverse entitélimite2))) (setq angle_debut (angle P2 P3)) (setq angle_fin (angle point_fin_trajectoire point_fin_limite1)) (command "-inserer" bloc_largeur P2 1 1 angle_debut "") (command "-inserer" bloc_largeur point_fin_trajectoire 1 1 angle_fin "") ;;;(command "-inserer" bloc_largeur point_fin_limite1 1 1 0 "") ;;;(defun Degrees->Radians (numberOfDegrees) ;;; (* pi (/ numberOfDegrees 180.0)) ;;;) ; (nom de la commande / retour à covadis / b pour bloc / position orthogonale / grandeur numérique de la longueur de la boîte. ) à + denis . et merci à tous ceux qui m'ont déjà répondu.
  19. Bonjour à tous, et surtout merci à ceux qui mon répondu, me permettant ainsi d'avancer grandement dans l'écriture de mon progrmme. je poursuis donc mon programme, celui ci doit permettre de générer des boîtes au final; la première étape était à partir d'une trajectoire représentée par une polyligne non rectiligne de tracer par un double décalage de part et d'autre de celle ci de constituer un corridor. la seconde étape réside dans l'insertion de bloc à intervalle régulier sur la trajectoire par la commande mesurer. ces blocs sont des segments correspondant à la largeur de notre corridor. il seront toujours insérés perpendiculairement à la trajectoire. Nous arrivons à mon soucis : en effet la commande mesurer insère bien mes blocs, seulement elle ne le fait pas sur les extrémités de la trajectoire. j'ai bien essayé de les insérer mais ils ne s'insèrent pas perpendiculairement à la trajectoire. la troisième étape de mon programme se décompose en 3 sous étapes : - sélectionner tous les blocs pour les décomposer seulement il faudrait que je puisse les remettre dans le bon calque et non pas dans le calque 0 comme par défaut. - puis par l'équivalent de la commande de covadis "" création des intersections "" dont je ne trouve pas les correspondances. _ 1°/ création des intersections paramètres: - choix des calques des objets : le calque contenant les (LIMITE), et le calque contenant les 2 polylignes précédemment décalées (CORRIDOR), _ 2°/ reconstitutions des contours paramètres: - objets constituant les limites : choix de l'objet référencé par le nom du calque le contenant les blocs décomposés et les polylignes de contour du corridor. - objets identifiants : sélection de chacun des barycentres des futures boîtes pour le choix du contour à créer. - Nouveaux contours créés : le nom du calque de destination. voilà en quelques lignes exposé le travail que je dois réaliser, cependant comme je début en lisp je me perds un peu dans l'enchainement et l'écriture des lignes de commande je joins la partie que j'ai déjà réalisé grâce aux trés bons conseils des uns et des autres que je remercie encore. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ; CORRIDOR.LSP ;;; ; ;;; ; Création des boîtes le long de la Trajectoire de vol de l'hélicoptère. ;;; ; Ces boîtes correspondent aux limites du Perimètre du Corridor. ;;; ; Ces limites sont composées de boîtes juxtaposées toujours perpendiculaires à la trajectoire, ;;; ; dont les paramètres de longueur des boîtes et de largeur du corridor sont réglables, ;;; ; par une simple entrée au clavier dans la ligne de commande d'AutoCAD. ;;; ; Après chargement, l'exécution de la fonction "boite" est obtenu par : ;;; ; -> commande : (boite) ;;; ; selection polyligne, coordonnées des sommet & calcul longueur ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boite DCL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:corridor () (setq dcl_id (load_dialog "Boite de dialogue corridor.dcl")) (if (not (new_dialog "boite_de_dialogue_corridor" dcl_id)) (exit) ) ;si il n'y a pas de boite de dialogue alors on lance le programme sans elle ;largeur du corridor (action_tile "larg_corridor" "(setq largeur_corridor $value)") ;armature de peau (action_tile "cas0" "(setq cas \"0\")") (action_tile "cas1" "(setq cas \"1\")") ;j'établit la liste des blocs qui seront insérés dans les listes déroulantes (setq liste_bloc '("li3" "lib" "b600")) (start_list "bloc") (mapcar 'add_list liste_bloc) (end_list) ;;; (action_tile "bloc" "(setq bloc_largeur (nth (atoi $value) liste_bloc))") ;aide autoLISP done_dialog (action_tile "accept" "(done_dialog 1)") ;1 pour OK ; (setq userclick T) (action_tile "cancel" "(done_dialog 0)") ;o pour Cancel ; (setq userclick nil) (start_dialog) (unload_dialog dcl_id) (setq ok (start_dialog)) (boite) ; on lance le programme boite (princ) ) (defun boite () (setq largeur_corridor (atoi largeur_corridor)) (setq cas (atoi cas)) (command "-calque" "e" "LIMITE" "co" "bleu" "LIMITE" "") ;;; (setq largeur_corridor (getdist "\n Donner la largeur du corridor ?:")) ; double décalage à gauche et à droite. ;(attribut du double décalage (ddllpp) (/ Vdist entité1 pt1 pt2 entitépoints anglepl PtGauche PtDroite) ; la largeur du corridor = distance de decalage. (setq entité1 (entget (car (entsel "Selectionner la ligne ou la polyligne:")) ) ) (if (eq (cdr (assoc 0 entité1)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P1 (cdr (assoc 10 entité1))) (setq P2 (cdr (assoc 11 entité1))) ) (progn (setq entitépoints (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) entité1) ) ) (progn (progn (setq P1 (car entitépoints))) (progn (setq P2 (cadr entitépoints))) ) ) ) (setq anglepl (angle P1 P2)) (setq PtGauche (polar P1 (+ anglepl (/ pi 2)) largeur_corridor)) (setq PtDroite (polar P1 (- anglepl (/ pi 2)) largeur_corridor)) ;;; commande appelant la fonction " decaler ". (command "_offset" (/ largeur_corridor 2) P1 PtGauche "") (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" "") (command "_offset" (/ largeur_corridor 2) P1 PtDroite "") (command "_.chprop" (entlast) "" "_layer" "LIMITE" "_color" "_blue" "") (princ) ; fin de la fonction de double décalage. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; selection des limites. ;;; (setq e (entget (car (entsel)))) ;......................................... obtenir la liste de l'entité (setq len (length entité1)) ;.................................................... longueur de la liste (setq n 0) (setq liste nil) ;......................................................... compteur à zero (repeat len ;.............................................................. repeter pour chaque element de la liste (setq e1 (car (nth n entité1))) ;.............................................. prendre chaque element de la liste et en retirer le code (1 er item) (if (= e1 10) ;.......................................................... tester le code 10 (progn ;............................................................... si c'est le groupe 10 alors faire (terpri) ;........................................................... nouvelle ligne (princ (cdr (nth n entité1))) (setq liste (cons (cdr (nth n entité1)) liste)) ;........................................................................... ecriture des coordonnées ;(princ (cadr (nth n e)));.................................................. ecrit les valeurs de X ;(princ (caddr (nth n e)));................................................. ecrit les valeurs de Y ;........................................................................... (nth n e) : sort l'element n de la liste e (n=0,1,2,...) ) ;.................................................................... fin de progn ) ;...................................................................... fin de if (setq n (+ n 1)) ;......................................................... incrementer le compteur ) ;........................................................................ fin repeat (setq nbsommets (length liste)) (setq long 0) (repeat (- nbsommets 1) (setq P1 (car liste)) (setq P2 (cadr liste)) (setq D (distance P1 P2)) (setq long (+ D long)) (setq liste (cdr liste)) ) (prin1 long) (princ) (command "-calque" "e" "pk" "co" "magenta" "pk" "ch" "pk" "") (setq point_debut (car liste)) (setq liste1 (reverse entitépoints)) (setq point_fin (car liste1)) (cond ((= cas 0) (command "mesurer" pause "b" "b600" "o" 1000 "")) ((= cas 1) (command "mesurer" pause "b" "b600" "o" 5000 "")) ) (command "-inserer" "b600" p2 1 1 0 "") (command "-inserer" "b600" point_fin 1 1 0 "") ; (nom de la commande / retour à covadis / b pour bloc / position orthogonale / grandeur numérique de la longueur de la boîte. ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fin temporaire du programme ;;;;;;;;;;;;;;;;;;; à + denis.
  20. Salut à tous, voici un programme qui permet de décaler une polyligne qui marche. je cherche à sa voir comment l'on peut faire pour sélectionner les deux poylignes précédemment décalées (et seulement celles là) et les placer dans un calque différent de celui de la polyligne d'origine. (defun c:boite () (setq largeur_corridor (getdist "\n Donner la largeur du corridor ?:") ) ; la largeur du corridor = distance de decalage. (setq entité1 (entget (car (entsel "Selectionner la ligne ou la polyligne:")) ) ) (if (eq (cdr (assoc 0 entité1)) "LINE") ;;; determine si l'objet est ligne ou polyligne (progn (Setq P1 (cdr (assoc 10 entité1))) (setq P2 (cdr (assoc 11 entité1))) ) (progn (setq entitépoints (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) entité1) ) ) (progn (progn (setq P1 (car entitépoints))) (progn (setq P2 (cadr entitépoints))) ) ) ) (setq anglepl (angle P1 P2)) (setq PtGauche (polar P1 (+ anglepl (/ pi 2)) largeur_corridor)) (setq PtDroite (polar P1 (- anglepl (/ pi 2)) largeur_corridor)) ;;; commande appelant la fonction " decaler ". (command "_offset" (/ largeur_corridor 2) P1 PtGauche "") (command "_offset" (/ largeur_corridor 2) P1 PtDroite "") (princ) ; fin de la fonction de double décalage. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Voila la partie du programme qui permet de sélectionner les deux polylignes et de les placer dans un autre calque mais je ne sais pas comment continuer. ; selection des limites. (setq limite (entsel " \nSélectionnez les polylignes des limites : ")) ;Sélectionnez les polylignes (ssget "L" ;(Prompt "\n Sélectionner les limites du corridor:") (command "-calque" "LIMITE" "co" "bleu" "") ) Je serai trés reconnaissant aux personnes qui pourraient m'aider. merci @+ Doy
×
×
  • 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é