-
Notifications
You must be signed in to change notification settings - Fork 1
/
kpente_texte_situation_forcee.lsp
153 lines (133 loc) · 4.16 KB
/
kpente_texte_situation_forcee.lsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
;; Bonjour, cette commande autocad crée, en selectionnant deux points, un texte avec la pente en % et une flèche.
;; Pour l'utiliser: 1) copiez l'entier de ce texte dans la barre de commande de votre fichier sur autocad.
;; 2) taper "kpentetxtecourbedeniveaux" (sans les guillemets) pour lancer la fonction
(defun c:kpente_texte_situation_forcee ( )
(setq a_fp 0.44810)
(setq l_fp 0.41533)
(setq a_fm 0.88564)
(setq l_fm 0.23239)
(setq a_ff 2.69349)
(setq l_ff 0.41533)
(setq a_t 1.57000)
(setq l_t 0.31263)
(setq hauteurtexte 0.25)
(setq style (getvar "textstyle"))
(if (= facteur nil)
(setq facteur 1.0)
)
(setq textechoix (strcat "\nDéfinissez le facteur d'agrandissement ou ENTER[" (rtos facteur 2 1) "]:"))
(setq choix (getreal textechoix))
(if (/= choix nil)
(setq facteur choix)
)
;; entrée utilisateur
(setq p1 (getpoint "\nSpécifiez le premier point: "))
(setq p2 (getpoint p1 "\nSpécifiez le deuxième point: "))
(setq alt1 (getreal "\nEntrer l'altitude du premier point"))
(setq alt2 (getreal "\nEntrer l'altitude du deuxième point"))
;; socker les variables systeme et les mettre à 0
(setq
os (getvar "osmode")
dim (getvar "dimzin")
)
(setvar "osmode" 0)
(setvar "dimzin" 0)
;;Faire ne sorte que le point le plus Haut (z) soit en p1
(if (< alt1 alt2)
(and
(setq p p1)
(setq p1 p2)
(setq p2 p)
(setq alt alt1)
(setq alt1 alt2)
(setq alt2 alt)
) ;; and
) ;; if
;; calcul des distances (sur x, sur y et sur z)
(setq dx (- (car p2) (car p1)))
(setq dy (- (cadr p2) (cadr p1)))
(setq dz (- alt2 alt1))
;; variable pour savoir la direction de la flèche (si "+" = flèche vers la droite, si "-" flèche vers la gauche)
(setq direction
(if (> (car p1) (car p2))
"-"
"+"
)
)
;; determiner la pente entre les deux points
(setq pente (abs (* (/ dz (sqrt (+ (* dx dx) (* dy dy)))) 100)))
;; déteermine l'angle du texte et de la flèche dans le SCU utilisateur
(setq angle
(if (> dx 0)
(atan dy dx)
(atan (* -1.0 dy) (* -1 dx))
)
)
;; détermine le point de départ pour l'insertion du texte et de la flèche
(setq pointmilieu
(list
(/ (+ (car p1) (car p2)) 2.00)
(/ (+ (cadr p1) (cadr p2)) 2.00)
0.00
)
)
;; crée la chaine de texte à afficher comme pente
(setq texte (strcat (rtos pente 2 1) "%"))
;; transformation des points de coordonnées utilisateurs à coordonnées générales
(setq
p1_final (trans p1 1 0)
p2_final (trans p2 1 0)
pointmilieu_final (trans pointmilieu 1 0)
)
(setq dx_final (- (car p2_final) (car p1_final)))
(setq dy_final (- (cadr p2_final) (cadr p1_final)))
(setq difference_angle (- (atan dy dx) (atan dy_final dx_final)))
(setq angle_final (- angle difference_angle))
(entmakex
(list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
;;(cons 8 calque)
(cons 100 "AcDbPolyline")
(cons 90 3)
(cons 70 0)
(cons 10 (if (= direction "+")
(polar pointmilieu_final (+ a_fp angle_final) (* facteur l_fp))
(polar pointmilieu_final (+ (- PI a_fp) angle_final) (* facteur l_fp))
)) ;; if cons
(cons 40 0)
(cons 41 (* facteur 0.1))
(cons 10 (if (= direction "+")
(polar pointmilieu_final (+ a_fm angle_final) (* facteur l_fm))
(polar pointmilieu_final (+ (- PI a_fm) angle_final) (* facteur l_fm))
)) ;; if cons
(cons 40 0)
(cons 41 0)
(cons 10 (if (= direction "+")
(polar pointmilieu_final (+ a_ff angle_final) (* facteur l_ff))
(polar pointmilieu_final (+ (- PI a_ff) angle_final) (* facteur l_ff))
)) ;; if cons
) ;; entmakex
)
(entmakex
(list
(cons 0 "MTEXT")
;;(cons 8 calque)
(cons 100 "AcDbEntity")
(cons 100 "AcDbMText")
(cons 10 (polar pointmilieu_final (+ a_t angle_final) (* facteur l_t))) ;;point d'insertion
(cons 40 (* facteur hauteurtexte))
(cons 41 2.0)
(cons 71 8)
(cons 1 texte)
(cons 7 style)
(cons 50 angle)
)
)
;; retablissement des variables système
(setvar "osmode" os)
(setvar "dimzin" dim)
)
;; Futures modifications:
;; Ajouter Choix d'échelle
;; Ajouter préfixe/suffixe