Aller au contenu

[Résolu] Recherche pour segment en parallèle


Messages recommandés

Posté(e)

Bonjour à tous.

 

Voilà, aujourd'hui, j'ai des réseaux aériens à dessiner. Ils se composent d'une ligne droite (en bleu) entre deux poteaux BT (basse tension) et une ligne "en parallèle" (en vert) le long de ce segment. Car j'en ai des centaines et à main levée, je ne trouve pas ça très joli...

post-6426-0-09002900-1475503023_thumb.jpg

Je cherche à automatiser le segment vert. Je ne sais pas comment m'y prendre.

 

Ce qui serait judicieux, ce serait de cliquer le segment bleu (pour ses extrémités) et cliquer le coté où placer la parallèle.

 

Si quelqu'un a déjà ça dans sa musette (ce qui ne m’étonnerait pas, car je ne dois pas être le seul à faire ça) ou un conseil, une astuce... Je suis preneur...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

(defun getpolySegs (ent / PTL I PTB SEG LSEG)
 (if (= (type ent) 'ENAME)
   (setq ent (vlax-ename->vla-object ent))
 )
 ;; collecter la liste des point sous la forme (x1 y1 x2 y2 ... xn yn)
 (setq PTL (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates ENT))))
 ;; collecter la liste des bulges
 (setq I 0) 
 (repeat (/ (length PTL) 2)
   (setq PTB (cons (vla-GetBulge ent I) PTB))
   (setq I (1+ I))
 )
 (setq PTB (reverse PTB))
 ;; polyligne fermée -> rajouter le premier point à la liste de points
 (if (= (vla-get-closed ent) :vlax-true)
   (setq PTL (append PTL (list (car PTL) (cadr PTL))))
 )
 ;; transformer en liste de segments
 (setq I 0)
 (repeat (- (/ (length PTL) 2) 1)
   (setq SEG
     (list
       (list (nth I PTL) (nth (+ I 1) PTL))
       (nth (/ I 2) PTB)
       (list (nth (+ I 2) PTL) (nth (+ I 3) PTL))
     )
   )
   (setq LSEG (cons SEG LSEG))
   (setq I (+ I 2))
 )
 (reverse LSEG)
)

(defun PTaDroiteObj (obj pt / PTN PM fder PT1DERIV)
 (if (= (type Obj) 'ENAME)
   (setq Obj (vlax-ename->vla-object Obj))
 )
 (setq PTN (vlax-curve-GetClosestPointTo obj PT))
 (setq PM (vlax-curve-GetParamAtPoint obj PTN))
 (setq fder (vlax-curve-getfirstderiv obj PM))
 (setq PT1DERIV (mapcar '+ PTN fder))
 (< (sin (- (angle PTN PT) (angle PTN PT1DERIV))) -1e-14)
)

(defun list->variantArray (ptsList / arraySpace sArray)
 ; allocate space for an array of 2d points stored as doubles
 (setq arraySpace
   (vlax-make-safearray
     vlax-vbdouble ; element type
     (cons 0
       (- (length ptsList) 1)
     ) ; array dimension
   )
 )
 (setq sArray (vlax-safearray-fill arraySpace ptsList))
 ; return array variant
 (vlax-make-variant sArray)
)


(defun c:OfPol (/ AcDoc Space temp e obj PT numseg lseg seg PTD BULGE PTF PTC ANG L PTDD PTFD pl)
 (vl-load-com)
 (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object))
       Space (if (= (getvar "CVPORT") 1)
               (vla-get-PaperSpace AcDoc)
               (vla-get-ModelSpace AcDoc) 
             )
 )
 ;; valeur du décalage
 (if (not od_ofpol) (setq od_ofpol 1.00))  ;; par défaut 1.00
 (if (setq TEMP (getdist (strcat "\nSpécifiez la distance de décalage ou <" (rtos od_ofpol) "> : ")))
   (setq od_ofpol temp)
 )
 ;; saisir la poyligne
   (setq e (entsel "\nSélectionner un segment de polyligne : "))

 (setq obj (vlax-ename->vla-object (car e)))
 (setq PT (trans (cadr e) 1 0))  ;; le point cliqué pour sélectionner en SCG
 
 ;; on est sur quel segemnt ?
 (setq numseg (fix (vlax-curve-GetParamAtPoint obj (vlax-curve-GetClosestPointTo obj PT))))
 (alert (strcat "on est sur le segment " (itoa numseg)))

 ;; trouver les points d'extrémité du segment
 (setq lseg (getpolysegs obj))		;; la liste des segments définis par leurs points d'extrémité et bulges
 (setq seg (nth numseg lseg))		;; le segment sélectionné
 (setq PTD (car seg))
 (setq BULGE (cadr seg))
 (setq PTF (caddr seg))
 (if (zerop bulge)
   (progn
     (setq PTC (getpoint "\nQuel côté ?"))
     (if (PtaDroiteObj obj (trans PTC 1 0))
       (progn (setq ANG (* 3 (/ pi 2))) (alert "à droite"))	;; on tourne à droite
       (progn (setq ANG (/ pi 2)) (alert "à gauche"))		;; on tourne à gauche
     )
     (setq PTDD (polar PTD (+ (angle PTD PTF) ANG) od_ofpol))	;; décaler les points d'extrémité de la distance od_ofpol
     (setq PTFD (polar PTF (+ (angle PTD PTF) ANG) od_ofpol))
     (setq L (distance PTD PTF))  ;; la longueur du segment
     (setq PTDD (polar PTDD (angle PTDD PTFD) (* L 0.2)))	;; donner la forme de bateau à la polyligne
     (setq PTFD (polar PTFD (angle PTFD PTDD) (* L 0.2)))	;; en décalant encore de 20% de la distance
     ;; dessiner la polyligne
     (setq pl (vla-addlightWeightPolyline space (list->variantArray (append PTD PTDD PTFD PTF))))
   )
   (alert "Segment courbe, pas prévu pour le moment")
 ) ;; fin if
 (princ)
)

 

quelque chose de ce style ?

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut Vincent, et merci de ton aide...

 

C'est nickel, exactement ce dont j'avais besoin...

 

Juste un petit truc... M'autorises-tu à publier une routine que je vais développer et partagerais en utilisant ton code...?

 

Bien sûr, je préciserais qu'il est de toi...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Re.

 

A bien y réfléchir, ton code est déjà très complet, je ne vois pas ce que je peux y ajouter... ;)

 

Oublis l'autorisation...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut Denis,

 

cela va de soi. Surtout que tout n'est pas de moi. En regardant bien, GetPolySegs par exemple, a été inspiré par quelque chose sur Afralisp et list->variantArray, je ne sais plus où je l'ai trouvé.

 

J'ai essayé de mettre beaucoup de commentaires, j'espère que la démarche est suffisamment compréhensible.

 

Si tu veux te coltiner le cas des segments courbes, il y a une fonction dont je me sers régulièrement et qui pourrait être utile. Elle vient d'Afralisp aussi et elle permet, à partir d'un segment retourné par GetPolySegs, de trouver les coordonnées du centre et la valeur du rayon et Afralisp m'a permis d'éclaircir le mystère du "bulge".

 

(defun getArcInfo (segment / a p1 bulge p2 c p3 p4 p r s result)
 ;; assigner variables avec les valeurs de l'argument
 (mapcar 'set '(p1 bulge p2) segment)
 (if (not (zerop bulge))
   (progn
     ;; trouver la corde
     (setq c (distance p1 p2))
     ;; trouver la flèche
     (setq s (* (/ c 2.0) (abs bulge)))
     ;; trouver le rayon par Pythagore
     (setq r (/ (+ (expt s 2.0) (expt (/ c 2.0) 2.0)) (* 2.0 s)))
     ;; distance au centre
     (setq a (- r s))
     ;; coordonnées du milieu de p1 et P2
     (setq P4 (polar P1 (angle P1 P2) (/ c 2.0)))
     ;; coordonnées du centre
     (setq p
       (if (>= bulge 0)
         (polar p4 (+ (angle p1 p2) (/ pi 2.0)) a)
         (polar p4 (- (angle p1 p2) (/ pi 2.0)) a)
       )  
     )
     ;; coordonnées de P3
     (setq p3
       (if (>= bulge 0)
         (polar p4 (- (angle p1 p2) (/ pi 2.0)) s)
         (polar p4 (+ (angle p1 p2) (/ pi 2.0)) s)
       )  
     )
     (setq result (list p r))
   )
   (setq result nil)
 )
 result
)

 

GetPolySegs et GetArcInfo sont deux fonctions que je trouve très pratiques dès qu'il s'agit d'exploiter des lwpolylines.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Re,

 

Merci pour ce complément, mais je fais, en ce moment, des études aériennes pour la fibre optique...

 

Je n'ai donc que des lignes droites... Mais je retiens le second LISP car je fais aussi des reports de détections souterraines, et là, il y a parfois des courbes...

 

Encore merci...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Re.

 

A bien y réfléchir, ton code est déjà très complet, je ne vois pas ce que je peux y ajouter... ;)

 

Oublis l'autorisation...

 

Ok, pas de souci. Mais l'exploitation des polylignes mérite qu'on s'y attarde et je t'invite à bien consulter les pages sur Afralisp qui en parlent (voir le lien dans le message précédent). C'est en anglais, mais c'est bien illustré et compréhensible même si le niveau d'anglais n'est que scolaire, ce qui est mon cas.

 

Bon, mon niveau de français est aussi scolaire, compte tenu que ce n'est pas ma langue maternelle, mais je crois que le verbe oublier est du 1er groupe. Donc, attention à tous ces verbes qui se terminent par "ier" à l'infinitif (publier, trier, crier...), qu'on a tendance à vouloir conjuguer comme des verbes du 2ème groupe et qui ont aussi la particularité de doubler le "i" à la première et deuxième personne du pluriel à l'imparfait de l'indicatif (nous oubliions, vous oubliiez).

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Tu dois aussi pouvoir t'inspirer de PolySegments.lsp sur cette page ou celle-là.

 

Bonjour (gile),

 

j'ai eu peur d'être hors sujet avec ma contribution, compte tenu que la question a été publiée dans "Débuter en LISP". Mais, l'exploitation des polylignes n'est pas une chose simple. Polysegments.lsp non plus, a fortiori.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonjour (gile),

 

j'ai eu peur d'être hors sujet avec ma contribution, compte tenu que la question a été publiée dans "Débuter en LISP". Mais, l'exploitation des polylignes n'est pas une chose simple. Polysegments.lsp non plus, a fortiori.

 

Amicalement

Vincent

 

Tu as raison... Ma démarche n'est pas très pédagogique.

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

Posté(e)

Bonjour à tous.

 

Effectivement, je publie souvent dans "Débuter en LISP" car, l'estimation de mon niveau en LISP est très "médiocre"...

 

Merci encore à vous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é