Aller au contenu

comment récuppérer des points sur des polylignes.


Messages recommandés

Posté(e)

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.

Posté(e)

Salut,

 

À mon avis, le plus simple pour ce que tu veux faire est d'utiliser les fonctions visual LISP vlax-curve*.

 

(vlax-curve-getStartPoint ent) retourne le point de départ (coordonnées SCG)

 

(vlax-curve-getEndPoint ent) retourne le point de fin (coordonnées SCG)

 

(vlax-curvegetPointAtDist ent dist) retourne les coordonnées du point (SCG) sur l'objet à la distance spécifiée

 

(vlax-curve-getSecondDeriv ent (vlax-curve-getStartParam ent)) retourne le vecteur de la dérivée seconde au point de départ (perpendiculaire à la tangente à ce point)

 

etc ...

 

Pour les intersections regarde avec (vlax-invoke obj1 'Intersectwith obj2 acExtendNone) qui retourne la liste des points aux intersections des objets obj1 et obj2. Regarde dans l'aide aux développeurs ActiveX and VBA Reference >> Method >> Intersectwith.

 

Pour ce qui est des coordonnées de la boite, il est plus simple de calculer d-après les points que tu as.

 

Tu trouveras un exemple d'utilisation de ces fonctions dans Diviser_Mesurer_3d et PolySolid, entre autres, en téléchargement sur cette page.

 

[Edité le 16/6/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é