Vous êtes sur le portail CADxp. Ce site est un peu le vôtre, n'hésitez pas à poster des articles, les commenter et participer aux forums. Pour avoir un accès complet au site, inscrivez-vous!
Bonjour, j'ai un problème qui me bloque ! C'est le récent constat de deux bugs: j'utilise un lisp qui génère un tableau sur Autocad, d'après les points constituants une polyligne sélectionnée.
Le hic:
- impossible d'avoir un segment arc en début de polyligne
- imopssible d'avoir une succession de 2 segments arc: le second est considéré comme segment ligne...
Je suis bloqué, j'ai pensé à la courbure code 42, mais j'arrive pas bien à trouver où ça coince...
Si quelqu'un peu m'aider... MErci d'avance !
Le code lisp que l'utilise( désolé c un peu long...):
; It makes a table with Route details from a picked POLYLINE (ROUTE).
; The polyline should by the original one, the one before converted
; by QUICKSURF. The program calculates centerpoints, radius,
; tangent points,intersection points, bearings and the length along
; the polyline.
; The program ask you to pick a polyline. After calculation the program
; ask for the insertion point for the table, an scalefactor for the
; coordinates,an offset value for the coordinates.After the tabel is
; drawn you vil be asked for a scale factor and rotations angel for
; the hole tabel.
; To load the program write at "command:" (load "rutetbl"),
; and start the program with command "TABEL".
; The program consider that the coordinate system has 0 degr. at
; 90 degr. in the WCS of Acad, and the angeles are clockwise.
;
; God Luck !!
(Defun RTD (Vin) (* 180.0 (/ vin pi))) ; Radian to Degees
(Defun DTR (vin) (* pi (/ vin 180.0))) ; Degees to Radian
; Included angle as calculated by bulge factor
(setq ang (* (atan (cdr (assoc 42 v1))) 4))
; Calculate angle opposite included angle.
(if (< (abs ang) pi)
(setq ang2 (/ (- pi (abs ang)) 2)) ;<180
(setq ang2 (/ (- pi (- (* 2 pi) (abs ang))) 2)) ;>180
) ;_ Fin de if
; Calculate radius of arc
(setq r (/ (* (sin ang2) dvv) (abs (sin ang))))
; Angle From V1 to Centre
(if (> ang 0)
; Condition for ccw arc
(if (< ang pi)
(setq aca (+ avv ang2)) ;arc < 180
(setq aca (- avv ang2)) ;arc > 180
) ;_ Fin de if
; Condition for cw arc
(if (< (abs ang) pi)
(setq aca (- avv ang2)) ;arc < 180
(setq aca (+ avv ang2)) ;arc < 180
) ;_ Fin de if
) ;_ Fin de if
; Calculate centre of arc
(setq vcen (polar (cdr (assoc 10 v1)) aca r))
) ;_ Fin de Defun
;*************************************************************************************************************************
;fonction principale
(DEFUN C:table_tracks ()
(starttbl);appel de la function starttlb
(setq PKtListe nil)
(setq TPteller 0
IPTeller 1
) ;_ Fin de setq
(alert "ENTREZ L'INTITULE DE LA COLONNE DE LA DISTANCE RELATIVE : 'K.P.' (Kilometric Point) ou 'C.P.L.' (Cumulative Projected Length) : ")
(setq kpoucpl (getstring "ENTREZ L'INTITULE DE LA COLONNE DE LA DISTANCE RELATIVE : 'K.P.' (Kilometric Point) ou 'C.P.L.' (Cumulative Projected Length) : "))
(Setq elem (car (EntSel "\nSelectionner une polyligne : ")))
(command "CONVERTpoly" "H" elem "" "_redraw")
(while (not (AND (/= elem nil)
(OR (= (cdr (Assoc 0 (entget elem))) "POLYLINE")
;(= (cdr (Assoc 0 (entget elem))) "LWPOLYLINE")
) ;_ Fin de OR
) ;_ Fin de OR
) ;_ Fin de not
(Setq elem (car (EntSel "\nSelectionner une polyligne : ")))
) ;_ Fin de while
(progn
(setq el (entget elem))
(setq elem (entnext elem))
(setq el (entget elem))
(setq v0 el
v1 el
) ;_ Fin de setq
(while (not (AND (/= elem nil)(= (cdr (Assoc 0 (entget elem))) "SEQEND")
;;; (OR (= (cdr (Assoc 0 (entget elem))) "POLYLINE")
;;; (= (cdr (Assoc 0 (entget elem))) "LWPOLYLINE")
;;; ) ;_ Fin de OR
) ;_ Fin de OR
) ;_ Fin de not
(If (/= (cdr (Assoc 42 el)) 0.0) ; teste si on est sur un arc ou une ligne clé 42 rayon de courbure du segment 0 -> segment droit
(progn;segment courbe
(Setq v1 el)
(setq elem (Entnext Elem))
(setq el (Entget elem))
(ArcSeg)
(setq pkten (cdr (assoc 10 v1)))
(if (= TPteller 0)
(setq TPnr "START UP")
(setq TPnr (Strcat "TP" (itoa TPteller)))
) ;_ Fin de if
(if (/= (Distance (cdr (Assoc 10 v1))
(cdr (assoc 10 el))
) ;_ Fin de Distance
0.0
) ;_ Fin de /=
(setq Dpkt (Distance (cdr (Assoc 10 v0))
(cdr (assoc 10 v1))
) ;_ Fin de Distance
) ;_ Fin de setq
(if (= TPteller 0)
(setq Dpkt 0.000)
(setq Dpkt nil)
) ;_ Fin de if
) ;_ Fin de if
(setq NyLinje
(List TPnr (Car pkten) (cadr pkten) Dpkt nil nil)
) ;_ Fin de setq
(if (= PktListe nil)
(setq PktListe (list NyLinje nil))
(setq PktListe (cons NyLinje pktListe))
) ;_ Fin de if
(setq el2 (polar (cdr (assoc 10 v1)) avv (/ dvv 2)))
(setq IP (inters (cdr (assoc 10 v0))
(cdr (assoc 10 v1))
vcen
el2
nil
) ;_ Fin de inters
) ;_ Fin de setq
(setq Tpnr (Strcat "IP" (ITOA IPteller)))
(setq NyLinje (List TPnr
(Car IP) ; IP + angel
(Cadr IP)
nil
(Rtd (angle (cdr (assoc 10 v0))
(cdr (assoc 10 v1))
) ;_ Fin de angle
) ;_ Fin de Rtd
nil
) ;_ Fin de List
) ;_ Fin de setq
(setq PktListe (cons NyLinje pktListe))
(setq Tpnr (Strcat "CP" (ITOA IPteller)))
(setq NyLinje (List Tpnr
(Car vcen) ;CP+R
(Cadr vcen)
nil
nil
r
) ;_ Fin de List
) ;_ Fin de setq
(setq PktListe (cons NyLinje pktListe))
(setq pkten (cdr (assoc 10 el)))
(setq TPteller (+ TPteller 1))
(setq TPnr (StrCat "TP" (itoa TPteller)))
(setq NyLinje (List TPnr
(Car pkten) ;TPb
(Cadr pkten)
(* (ABS Ang) r)
nil
nil
) ;_ Fin de List
) ;_ Fin de setq
(setq PktListe (cons NyLinje pktListe))
(setq v0 el
v1 el
) ;_ Fin de setq
(setq elem (Entnext Elem))
(if (/= elem nil)
(progn
(setq el (Entget elem))
(setq TPteller (+ TPteller 1))
(setq IPteller (+ IPteller 1))
) ;_ Fin de progn
) ;_ Fin de if
) ;_ Fin de progn
(progn;segment droit
(setq pkten (cdr (assoc 10 el)))
(if (= TPteller 0)
(setq TPnr "START UP")
(setq TPnr (Strcat "TP" (itoa TPteller)))
) ;_ Fin de if
(if (/= (Distance (cdr (Assoc 10 v1))
(cdr (assoc 10 el))
) ;_ Fin de Distance
0.0
) ;_ Fin de /=
(setq Dpkt (Distance (cdr (Assoc 10 v1))
(cdr (assoc 10 el))
) ;_ Fin de Distance
) ;_ Fin de setq
(if (= TPteller 0)
(setq Dpkt 0.000)
(setq Dpkt nil)
) ;_ Fin de if
) ;_ Fin de if
(setq NyLinje
(List Tpnr (Car pkten) (cadr pkten) Dpkt nil nil)
) ;_ Fin de setq
(if (= PktListe nil)
(setq PktListe (list NyLinje nil))
(setq PktListe (cons NyLinje pktListe))
) ;_ Fin de if
(setq v0 el
v1 el
) ;_ Fin de setq
(setq elem (Entnext Elem))
(if (/= elem nil)
(progn
(setq el (Entget elem))
(setq TPteller (+ TPteller 1))
) ;_ Fin de progn
) ;_ Fin de if
) ;progn
) ;if
) ;while
(Print (Strcat "La valeur est " (RTOS (caddr enLinje) 2 3)))
(Setq Tpscale
(Getreal "\nFacteur d'echelle des valeurs <1.0>: ")
) ;_ Fin de Setq
(if (/= (numberp Tpscale) T)
(setq Tpscale 1.0)
) ;_ Fin de if
(Print (Strcat "La valeur en EST est "
(RTOS (* TPscale (cadr enLinje)) 2 2)
) ;_ Fin de Strcat
) ;_ Fin de Print
(initget (+ 1 8))
(Setq off1 (Getreal "\nDécalage sur l'axe des X <0.0>: "))
(if (= off1 nil)
(setq off1 0.0)
) ;_ Fin de if
(Print (Strcat "La valeur en NORD est "
(RTOS (* TPscale (caddr enLinje)) 2 2)
) ;_ Fin de Strcat
) ;_ Fin de Print
(initget (+ 1 8))
(Setq off2 (Getreal "\nDécalage sur l'axe Y <0.0>: "))
(if (= off2 nil)
(setq off2 0.0)
) ;_ Fin de if