Aller au contenu

lien entre la boîte de dialogue et le programme.


Messages recommandés

Posté(e)

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 à +

 

 

 

Posté(e)

 

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.

 

 

 

 

 

 

 

 

 

Posté(e)

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.

 

 

 

 

Posté(e)

Salut

 

je pensais justement que détailler mon message serait utile.

Oui, mais de mettre aussi un lisp assez conséquent dans le message fait que ledit message devient vite rébarbatif à la lecture, d'où l'intérêt de faire des liens afin de ne pas nuire à la demande.

 

@+

Les Lisps de Patrick

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

Joseph Joubert, 1754-1824

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité