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é" 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
Ç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
>
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
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
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.