Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

autolisp - lwpolyline - arc

9 RÉPONSES 9
Répondre
Message 1 sur 10
Anonymous
530 Visites, 9 Réponses

autolisp - lwpolyline - arc

Bonjour
j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses points
coordoonées (x,y) dans une liste, alors j'ai utilisé ce programme:
la polyligne est dans le layer lay_tmp_ext:

(setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))
(setq e (entget (ssname selec_pline_e 0)))
(setq len (length e))
(setq n 0)
(repeat len
(setq e1 (car (nth n e)))
(if (= e1 10)
(progn
(terpri)
(setq crd_xye1 (cdr (nth n e)))
(setq crd_xye2 (cons crd_xye1 crd_xye2))

ça marche pour une polyline constituée juste de segments, mais quand ça
concerne une polyligne avec des lignes et avec des arcs, là j'ai juste
le point début et point final de l'arc, comment récuperer le 2ème point
des arcs?

merci pour votre aide
9 RÉPONSES 9
Message 2 sur 10
Anonymous
en réponse à: Anonymous



UCQ,


  • Le code 42 annonce le type de segment : 0 pour un segment droit ; un nombre
    pour un reflement (donc un arc). Il faut le conserver.



  • Remplace (ssget "x") par (ssget "_x") pour compatibilité internationale



  • Pourquoi le (terpri)? terpri signifie Terminal Print et on l'utilise dans
    des menus (fichier mnu et mns) pour faire un retour chariot sur la ligne
    de commande car le caractère \ de (princ "\n") qu'on utilise en
    lisp serait plutôt considéré comme une pause.


Serge

UCQ wrote:

Bonjour

j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses points

coordoonées (x,y) dans une liste, alors j'ai utilisé
ce programme:

la polyligne est dans le layer lay_tmp_ext:

(setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))

(setq e (entget (ssname selec_pline_e 0)))

 (setq len (length e))

 (setq n 0)

 (repeat len

   (setq e1 (car (nth n e)))

   (if (= e1 10)

     (progn

  (terpri)

(setq crd_xye1 (cdr (nth n e)))

(setq crd_xye2 (cons crd_xye1 crd_xye2))

ça marche pour une polyline constituée juste de segments,
mais quand ça

concerne une polyligne avec des lignes et avec des arcs, là
j'ai juste

le point début et point final de l'arc, comment récuperer
le 2ème point

des arcs?

merci pour votre aide



--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 

Message 3 sur 10
Anonymous
en réponse à: Anonymous



Merci Serge pour ton explication, mais il reste la moitié du pb,
avec le code 42 je saurais si c'est une ligne ou un arc, mais comment trouver
le 3ème point de l'Arc?

Autre chose, le nombre qu'indique le code 42 lorsque c'est un arc,
c'est quoi exactement?

Merci

 

 

"Serge Camiré" a écrit :

UCQ,


  • Le code 42 annonce le type de segment : 0 pour un segment droit ; un nombre
    pour un reflement (donc un arc). Il faut le conserver.



  • Remplace (ssget "x") par (ssget "_x") pour compatibilité internationale



  • Pourquoi le (terpri)? terpri signifie Terminal Print et on l'utilise dans
    des menus (fichier mnu et mns) pour faire un retour chariot sur la ligne
    de commande car le caractère \ de (princ "\n") qu'on utilise en
    lisp serait plutôt considéré comme une pause.


Serge

UCQ wrote:

Bonjour

j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses points

coordoonées (x,y) dans une liste, alors j'ai utilisé
ce programme:

la polyligne est dans le layer lay_tmp_ext:

(setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))

(setq e (entget (ssname selec_pline_e 0)))

 (setq len (length e))

 (setq n 0)

 (repeat len

   (setq e1 (car (nth n e)))

   (if (= e1 10)

     (progn

  (terpri)

(setq crd_xye1 (cdr (nth n e)))

(setq crd_xye2 (cons crd_xye1 crd_xye2))

ça marche pour une polyline constituée juste de segments,
mais quand ça

concerne une polyligne avec des lignes et avec des arcs, là
j'ai juste

le point début et point final de l'arc, comment récuperer
le 2ème point

des arcs?

merci pour votre aide


--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 

Message 4 sur 10
Anonymous
en réponse à: Anonymous

Le code 42 est le facteur de courbure de l'arc (bulge factor)

tu peux trouver le 2e point de l'arc comme suit:

(setq ang (abs (* 4.0 (atan bulg)))
d (* 0.5 (distance ptd ptf))
rad (/ d (sin (/ ang 2.0)))
h (* rad (cos (/ ang 2.0)))
ang1 (angle ptd ptf)
p3 (polar ptd ang1 d)
)
(if (minusp bulg)
(setq cen (polar p3 (- ang1 (/ pi 2)) h))
(setq cen (polar p3 (+ ang1 (/ pi 2)) h))
)
(setq langle (+ (* 0.5 pi) (angle ptd ptf)))
(setq ptm (polar cen langle (distance ptd cen)))

où BULG est le code 42
PTD le point de départ de l'arc
PTF le point final de l'arc
PTM le point milieu que tu cherches

UCQ a écrit :

> Merci Serge pour ton explication, mais il reste la moitié du pb, avec
> le code 42 je saurais si c'est une ligne ou un arc, mais comment
> trouver le 3ème point de l'Arc?
> Autre chose, le nombre qu'indique le code 42 lorsque c'est un arc,
> c'est quoi exactement?
> Merci
>
>
>
> "Serge Camiré" a écrit :
>
>> UCQ,
>>
>> * Le code 42 annonce le type de segment : 0 pour un segment droit
>> ; un nombre pour un reflement (donc un arc). Il faut le
>> conserver.
>> * Remplace (ssget "x") par (ssget "_x") pour compatibilité
>> internationale
>> * Pourquoi le (terpri)? terpri signifie Terminal Print et on
>> l'utilise dans des menus (fichier mnu et mns) pour faire un
>> retour chariot sur la ligne de commande car le caractère \ de
>> (princ "\n") qu'on utilise en lisp serait plutôt considéré
>> comme une pause.
>>
>> Serge
>>
>> UCQ wrote:
>>
>> > Bonjour
>> > j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses points
>> > coordoonées (x,y) dans une liste, alors j'ai utilisé ce programme:
>> > la polyligne est dans le layer lay_tmp_ext:
>> >
>> > (setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))
>> > (setq e (entget (ssname selec_pline_e 0)))
>> > (setq len (length e))
>> > (setq n 0)
>> > (repeat len
>> > (setq e1 (car (nth n e)))
>> > (if (= e1 10)
>> > (progn
>> > (terpri)
>> > (setq crd_xye1 (cdr (nth n e)))
>> > (setq crd_xye2 (cons crd_xye1 crd_xye2))
>> >
>> > ça marche pour une polyline constituée juste de segments, mais
>> > quand ça
>> > concerne une polyligne avec des lignes et avec des arcs, là j'ai
>> > juste
>> > le point début et point final de l'arc, comment récuperer le 2ème
>> > point
>> > des arcs?
>> >
>> > merci pour votre aide
>>
>> --
>> Serge Camiré
>> CAD-Novation, division de Consultants Univers Inc.
>> http://www.cadnovation.com/fr
>> Éditions Univers inc. http://www.univers.qc.ca
>
Message 5 sur 10
Anonymous
en réponse à: Anonymous



Michel,

Ça répond bien. Il n'y a plus rien à dire. Si je
peux quand même ajouter quelque chose, ce serait ceci:

  
...


  
(setq polyline (ssname (ssget (list (cons 0 "lwpolyline"))) 0))


  
(setq polylineGet (entget polyline))


  
(setq points (reverse (cdr (member (assoc 39 polylineGet) polylineGet))))


  
(setq points (reverse (member (assoc 42 points) points)))


  
(setq isClosed (= 1 (boole 1 (cdr (assoc 70 polylineGet)) 1)))


  
(if isClosed


  
(progn


     
(setq ptStart (list (nth 0 points) (nth 1 points) (nth 2 points) (nth 3
points)))


     
(setq points (append points ptStart))


  
))


  
(setq i 0 n (/ (length points) 4) n-- (1- n))


  
(while (< i n--)


     
(setq ptd  (cdr (nth (+ (* i 4) 0) points)))


     
(setq bulg (cdr (nth (+ (* i 4) 3) points)))


     
(setq ptf  (cdr (nth (+ (* i 4) 4) points)))


     
(if (zerop bulg)


     
(progn              
;; Une droite


        
(setq ptm (polar ptd (angle ptd ptf) (* 0.5 (distance ptd ptf))))


        
;; Ajouter du code


   
)


     
(progn              
;; Un arc


        
(setq ang  (abs (* 4.0 (atan bulg)))    ; Angle ptStart
ptCenter ptEnd


              
d    (* 0.5 (distance ptd ptf))   ; Longueur demie-corde


              
rad  (/ d (sin (/ ang 2.0)))      ; Distance
ptStart ptCenter


              
h    (* rad (cos (/ ang 2.0)))    ; Distance
directe ptCenter corde


              
ang1 (angle ptd ptf)             
; Angle ptStart ptEnd par rapport à l'horizontal


              
p3   (polar ptd ang1 d)          
; Point au centre de la corde


        
)


        
(if (minusp bulg)


          
(setq cen (polar p3 (- ang1 (/ pi 2)) h))  ; Point centre de l'arc
si renflement anti-horaire


          
(setq cen (polar p3 (+ ang1 (/ pi 2)) h))  ; Point centre de l'arc
si renflement horaire


        
)


        
(setq langle (+ (* 0.5 pi) (angle ptd ptf))) ; Angle perpendiculaire à
la corde, direction extérieure


        
(setq radius (distance ptd cen))            
; Distance ptCenter ptStart


        
(setq ptm (polar cen langle radius))        
; Point milieu sur l'arc


        
;; ou


        
(setq percent 1.0)                          
; de 0 (départ) à 1 (fin)


        
(setq delta (- (angle cen ptf) (angle cen ptd)))


        
(setq angInBetween (+ (angle cen ptd) (* percent delta)))


        
(setq ptInBetween (polar cen angInBetween radius))


        
;; Ajouter du code


     
))


     
(setq i (1+ i))


  
)


  
...


 

Serge

Michel wrote:

Le code 42 est le facteur de courbure de l'arc (bulge
factor)

tu peux trouver le 2e point de l'arc comme suit:

(setq ang  (abs (* 4.0 (atan bulg)))

      d         
(* 0.5 (distance ptd ptf))

      rad  (/ d (sin (/ ang 2.0)))

      h         
(* rad (cos (/ ang 2.0)))

      ang1      
(angle ptd ptf)

      p3  (polar ptd ang1 d)

)

(if (minusp bulg)

  (setq cen (polar p3 (- ang1 (/ pi 2)) h))

  (setq cen (polar p3 (+ ang1 (/ pi 2)) h))

)

(setq langle (+ (* 0.5 pi) (angle ptd ptf)))

(setq ptm (polar cen langle (distance ptd cen)))

où BULG est le code 42

     PTD le point de départ de l'arc

     PTF le point final de l'arc

     PTM le point milieu que tu cherches

UCQ a écrit :

> Merci Serge pour ton explication, mais il reste la moitié du
pb, avec

> le code 42 je saurais si c'est une ligne ou un arc, mais comment

> trouver le 3ème point de l'Arc?

> Autre chose, le nombre qu'indique le code 42 lorsque c'est un arc,

> c'est quoi exactement?

> Merci

>

>

>

> "Serge Camiré" a écrit :

>

>> UCQ,

>>

>>    * Le code 42 annonce le type de segment : 0 pour
un segment droit

>>      ; un nombre pour un reflement (donc
un arc). Il faut le

>>      conserver.

>>    * Remplace (ssget "x") par (ssget "_x") pour compatibilité

>>      internationale

>>    * Pourquoi le (terpri)? terpri signifie Terminal
Print et on

>>      l'utilise dans des menus (fichier
mnu et mns) pour faire un

>>      retour chariot sur la ligne de commande
car le caractère \ de

>>      (princ "\n") qu'on utilise en lisp
serait plutôt considéré

>>      comme une pause.

>>

>> Serge

>>

>> UCQ wrote:

>>

>> > Bonjour

>> > j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses
points

>> > coordoonées (x,y) dans une liste, alors j'ai utilisé
ce programme:

>> > la polyligne est dans le layer lay_tmp_ext:

>> >

>> > (setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))

>> > (setq e (entget (ssname selec_pline_e 0)))

>> >  (setq len (length e))

>> >  (setq n 0)

>> >  (repeat len

>> >    (setq e1 (car (nth n e)))

>> >    (if (= e1 10)

>> >      (progn

>> >   (terpri)

>> > (setq crd_xye1 (cdr (nth n e)))

>> > (setq crd_xye2 (cons crd_xye1 crd_xye2))

>> >

>> > ça marche pour une polyline constituée juste de
segments, mais

>> > quand ça

>> > concerne une polyligne avec des lignes et avec des arcs, là
j'ai

>> > juste

>> > le point début et point final de l'arc, comment récuperer
le 2ème

>> > point

>> > des arcs?

>> >

>> > merci pour votre aide

>>

>> --

>> Serge Camiré

>> CAD-Novation, division de Consultants Univers Inc.

>> http://www.cadnovation.com/fr

>> Éditions Univers inc.  http://www.univers.qc.ca

>


--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 
Message 6 sur 10
Anonymous
en réponse à: Anonymous



À moi,

J'aurais dû avoir écrit

(setq percent 0.5) au lieu de (setq percent 1.0)

 

"Serge Camiré" wrote:

Michel,

Ça répond bien. Il n'y a plus rien à dire. Si je
peux quand même ajouter quelque chose, ce serait ceci:

  
...


  
(setq polyline (ssname (ssget (list (cons 0 "lwpolyline"))) 0))


  
(setq polylineGet (entget polyline))


  
(setq points (reverse (cdr (member (assoc 39 polylineGet) polylineGet))))


  
(setq points (reverse (member (assoc 42 points) points)))


  
(setq isClosed (= 1 (boole 1 (cdr (assoc 70 polylineGet)) 1)))


  
(if isClosed


  
(progn


     
(setq ptStart (list (nth 0 points) (nth 1 points) (nth 2 points) (nth 3
points)))


     
(setq points (append points ptStart))


  
))


  
(setq i 0 n (/ (length points) 4) n-- (1- n))


  
(while (< i n--)


     
(setq ptd  (cdr (nth (+ (* i 4) 0) points)))


     
(setq bulg (cdr (nth (+ (* i 4) 3) points)))


     
(setq ptf  (cdr (nth (+ (* i 4) 4) points)))


     
(if (zerop bulg)


     
(progn              
;; Une droite


        
(setq ptm (polar ptd (angle ptd ptf) (* 0.5 (distance ptd ptf))))


        
;; Ajouter du code


   
)


     
(progn              
;; Un arc


        
(setq ang  (abs (* 4.0 (atan bulg)))    ; Angle ptStart
ptCenter ptEnd


              
d    (* 0.5 (distance ptd ptf))   ; Longueur demie-corde


              
rad  (/ d (sin (/ ang 2.0)))      ; Distance
ptStart ptCenter


              
h    (* rad (cos (/ ang 2.0)))    ; Distance
directe ptCenter corde


              
ang1 (angle ptd ptf)             
; Angle ptStart ptEnd par rapport à l'horizontal


              
p3   (polar ptd ang1 d)          
; Point au centre de la corde


        
)


        
(if (minusp bulg)


          
(setq cen (polar p3 (- ang1 (/ pi 2)) h))  ; Point centre de l'arc
si renflement anti-horaire


          
(setq cen (polar p3 (+ ang1 (/ pi 2)) h))  ; Point centre de l'arc
si renflement horaire


        
)


        
(setq langle (+ (* 0.5 pi) (angle ptd ptf))) ; Angle perpendiculaire à
la corde, direction extérieure


        
(setq radius (distance ptd cen))            
; Distance ptCenter ptStart


        
(setq ptm (polar cen langle radius))        
; Point milieu sur l'arc


        
;; ou


        
(setq percent 1.0)                          
; de 0 (départ) à 1 (fin)


        
(setq delta (- (angle cen ptf) (angle cen ptd)))


        
(setq angInBetween (+ (angle cen ptd) (* percent delta)))


        
(setq ptInBetween (polar cen angInBetween radius))


        
;; Ajouter du code


     
))


     
(setq i (1+ i))


  
)


  
...


 

Serge

Michel wrote:

Le code 42 est le facteur de courbure de l'arc (bulge
factor)

tu peux trouver le 2e point de l'arc comme suit:

(setq ang  (abs (* 4.0 (atan bulg)))

      d         
(* 0.5 (distance ptd ptf))

      rad  (/ d (sin (/ ang 2.0)))

      h         
(* rad (cos (/ ang 2.0)))

      ang1      
(angle ptd ptf)

      p3  (polar ptd ang1 d)

)

(if (minusp bulg)

  (setq cen (polar p3 (- ang1 (/ pi 2)) h))

  (setq cen (polar p3 (+ ang1 (/ pi 2)) h))

)

(setq langle (+ (* 0.5 pi) (angle ptd ptf)))

(setq ptm (polar cen langle (distance ptd cen)))

où BULG est le code 42

     PTD le point de départ de l'arc

     PTF le point final de l'arc

     PTM le point milieu que tu cherches

UCQ a écrit :

> Merci Serge pour ton explication, mais il reste la moitié du
pb, avec

> le code 42 je saurais si c'est une ligne ou un arc, mais comment

> trouver le 3ème point de l'Arc?

> Autre chose, le nombre qu'indique le code 42 lorsque c'est un arc,

> c'est quoi exactement?

> Merci

>

>

>

> "Serge Camiré" a écrit :

>

>> UCQ,

>>

>>    * Le code 42 annonce le type de segment : 0 pour
un segment droit

>>      ; un nombre pour un reflement (donc
un arc). Il faut le

>>      conserver.

>>    * Remplace (ssget "x") par (ssget "_x") pour compatibilité

>>      internationale

>>    * Pourquoi le (terpri)? terpri signifie Terminal
Print et on

>>      l'utilise dans des menus (fichier
mnu et mns) pour faire un

>>      retour chariot sur la ligne de commande
car le caractère \ de

>>      (princ "\n") qu'on utilise en lisp
serait plutôt considéré

>>      comme une pause.

>>

>> Serge

>>

>> UCQ wrote:

>>

>> > Bonjour

>> > j'ai une Lwpolyligne, j'ai besoin de récuperer tous ses
points

>> > coordoonées (x,y) dans une liste, alors j'ai utilisé
ce programme:

>> > la polyligne est dans le layer lay_tmp_ext:

>> >

>> > (setq selec_pline_e (ssget "X" (list (cons 8 "lay_tmp_ext"))))

>> > (setq e (entget (ssname selec_pline_e 0)))

>> >  (setq len (length e))

>> >  (setq n 0)

>> >  (repeat len

>> >    (setq e1 (car (nth n e)))

>> >    (if (= e1 10)

>> >      (progn

>> >   (terpri)

>> > (setq crd_xye1 (cdr (nth n e)))

>> > (setq crd_xye2 (cons crd_xye1 crd_xye2))

>> >

>> > ça marche pour une polyline constituée juste de
segments, mais

>> > quand ça

>> > concerne une polyligne avec des lignes et avec des arcs, là
j'ai

>> > juste

>> > le point début et point final de l'arc, comment récuperer
le 2ème

>> > point

>> > des arcs?

>> >

>> > merci pour votre aide

>>

>> --

>> Serge Camiré

>> CAD-Novation, division de Consultants Univers Inc.

>> http://www.cadnovation.com/fr

>> Éditions Univers inc.  http://www.univers.qc.ca

>


--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 


--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 

Message 7 sur 10
Anonymous
en réponse à: Anonymous

C'est bien du Serge cela !

Je cite "Il n'y a plus rien à dire", mais j'en rajoute quand même.

Mais surtout, ne changes rien, nous sommes tous fervents de tes conseils.
Amicales salutations

Bernard
Message 8 sur 10
Anonymous
en réponse à: Anonymous



Bernard,

Je n'avais pas dit : il n'y a plus rien à écrire 🙂

Au lieu de prendre une autre voix, j'ai pris une autre voie.

PS je serai absent toute la semaine prochaine

Serge

Bernard Flavignard wrote:

C'est bien du Serge cela !

Je cite "Il n'y a plus rien à dire", mais j'en rajoute quand
même.

Mais surtout, ne changes rien, nous sommes tous fervents de tes conseils.

Amicales salutations

Bernard



--

Serge Camiré

CAD-Novation, division de Consultants Univers Inc.  http://www.cadnovation.com/fr

Éditions Univers inc.  http://www.univers.qc.ca

 

Message 9 sur 10
Anonymous
en réponse à: Anonymous

Merci beaucoup Michel.
Merci beaucoup Serge.
Vos réponses m'aideront beaucoup...

encore merci


"Serge Camiré" a écrit :

> Bernard,
>
> Je n'avais pas dit : il n'y a plus rien à écrire 🙂
> Au lieu de prendre une autre voix, j'ai pris une autre voie.
>
> PS je serai absent toute la semaine prochaine
>
> Serge
>
> Bernard Flavignard wrote:
>
>> C'est bien du Serge cela !
>>
>> Je cite "Il n'y a plus rien à dire", mais j'en rajoute quand même.
>>
>> Mais surtout, ne changes rien, nous sommes tous fervents de tes
>> conseils.
>> Amicales salutations
>>
>> Bernard
>
> --
> Serge Camiré
> CAD-Novation, division de Consultants Univers Inc.
> http://www.cadnovation.com/fr
> Éditions Univers inc. http://www.univers.qc.ca
>
Message 10 sur 10
mustlagz
en réponse à: Anonymous

vous trouverais la solution ici et +

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums