-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpuerta.lsp
More file actions
260 lines (153 loc) · 6.45 KB
/
Copy pathpuerta.lsp
File metadata and controls
260 lines (153 loc) · 6.45 KB
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
;; Programilla para hacer una puerta en un muro
;; -------------------------------------------------------------------------------
;; FUNCION DE ERROR
;; -------------------------------------------------------------------------------
(defun prog-err (s)
(if (/= s "quit / exit abort")
(princ (strcat "\nError: no se encuentra un muro "))
)
(setq *error* olderr)
(setq seleccion nil
)
(command "_undo" "_end")
(recupera-vars)
(princ)
)
;; -------------------------------------------------------------------------------
;; Funcion para salvar las variables del sistema
;; -------------------------------------------------------------------------------
(defun salva-vars (a)
(setq MLST '())
(repeat (length a)
(setq MLST (append MLST (list (list (car a) (getvar (car a))))))
(setq a (cdr a))
)
)
;; -------------------------------------------------------------------------------
;; Funcion para recuperar las variables salvadas del sistema
;; -------------------------------------------------------------------------------
(defun recupera-vars ()
(repeat (length MLST)
(setvar (caar MLST) (cadar MLST))
(setq MLST (cdr MLST))
)
)
;; -------------------------------------------------------------------------------
;; FUNCION PRINCIPAL
;; -------------------------------------------------------------------------------
;; La variable anchop hay que guardarla en el dibujo y todavía no sé como
(defun puerta (/ bisagra cosamuro datosmuro angulo
pt1 pt2 seleccion num-sel
fallo indice lista-dist nombre
entidad angulo-aux distancia intersec
pgrosor p4 p5 mensaje
linea1 linea2 aux nuevovalor
hueco capamuro
)
;;-------LLamar a la nueva funcion de error)
(setq olderr *error* *error* prog-err)
;; Guardar variables del sistema
(salva-vars '("cmdecho" "blipmode" "expert"
"gridmode" "osmode" "thickness" "clayer"
"OFFSETDIST" "ORTHOMODE")
)
;;------Poner los valores que quiera en las variables del sistema------------
(mapcar 'setvar
'("cmdecho" "blipmode" "expert" "gridmode"
"osmode" "thickness" "ORTHOMODE")
'(0 0 0 0 0 0 0)
)
(command "_undo" "_begin")
(setq bisagra (getpoint "\nPunto en el que irá la bisagra <Relativo>: "))
(if (not bisagra)
(setq bisagra (pto-rel))
)
(setq bisagra (osnap bisagra "_nearest")) ;;Ajustar el punto. Si da error se que no había muro
(setq cosamuro (ssname (ssget bisagra) 0))
(setq datosmuro (entget cosamuro))
(setq capamuro (cdr(assoc 8 datosmuro))) ;;Poner la capa de lo que sea como capa actual
(setq pgrosor (encuentra-muro cosamuro bisagra))
(if (not pgrosor)
(progn
(prompt "\nNo encuentro otra línea paralela")
(exit) ;; Provocar fallo
)
)
;hacia qué lado?
(initget 1)
(setq aux (getpoint bisagra "\nHacia que lado de la bisagra irá el hueco: "))
; ;solicita el ancho del hueco
; (if (not anchop)
; (setq mensaje "\nAncho de la hoja (NOTA: las dos jambas ocupan 10 cm)<ancho>: ")
; (setq mensaje (strcat "\nAncho de la hoja (NOTA: las dos jambas ocupan 10 cm)<" (rtos anchop) ">: "))
; )
; (if (setq nuevovalor (getdist bisagra mensaje)) (setq anchop nuevovalor))
;;Redondeo a un número entero de centímetros
; (setq anchop (distof (rtos anchop 2 2) 2 ) )
;;----------------------Vamos a crear (si hace falta) un bloque puerta nuevo-------------------
(setq nombre (strcat "PS_H" (rtos (* 100 anchop) 2 0) "-J" (rtos (* 100 jamba) 2 0)))
(if (not (tblsearch "BLOCK" nombre ))
;; Si no existe esa puerta, a dibujarla y a crear el bloque correspondiente
(progn
(prompt "\nCreando un nuevo bloque de puerta...")
(setq seleccion nil )
(setq seleccion (ssadd))
;;Dibujar una jamba
(setvar "CLAYER" "0")
(Command "_rectang" "0,0" (list jamba jamba))
(setq seleccion (ssadd (entlast) seleccion))
;;Dibujar la otra jamba
(command "_copy" seleccion "" "0,0" (list (+ anchop jamba) 0))
(setq seleccion (ssadd (entlast) seleccion))
;;Dibujar la hoja
(command "_rectang" "0,0" (list 0.03 anchop) )
(setq seleccion (ssadd (entlast) seleccion))
(command "_move" (entlast) "" "0,0" (list jamba jamba))
;;Dibujar el arco
(command "_arc" "_c" "0,0" (list anchop 0) (list 0 anchop) )
(setq seleccion (ssadd (entlast) seleccion))
(command "_move" (entlast) "" "0,0" (list jamba jamba))
(command "_block" nombre "0,0" seleccion "")
(prompt "Nueva puerta creada OK")
)
)
(setvar "CLAYER" capamuro)
(command "_line" bisagra pgrosor "")
(setq linea1 (entlast))
(command "_offset" (+ anchop jamba jamba) linea1 aux "")
(setq aux (entlast))
(setq linea2 (entget (entlast)))
;calcula los puntos p4 y p5
(setq p4 (cdr ( assoc 10 linea2)))
(setq p5 (cdr ( assoc 11 linea2)))
;recorta las lineas del muro entre los puntos ya sabidos
(entdel linea1) ;; La quito para ver lo que hay debajo
(command "_break" (polar bisagra (angle bisagra p4) (/ anchop 2 )) "_f" bisagra p4)
(command "_break" (polar pgrosor (angle pgrosor p5) (/ anchop 2 )) "_f" pgrosor p5)
(entdel linea1) ;; La vuelvo a poner
;; Ahora, a dibujar la puerta
;crear la capa carpinteria si no existe
(if (not (tblsearch "LAYER" "Carpinteria"))
(command "_LAYER" "_New" "Carpinteria" "_color" "_cyan" "carpinteria" "")
)
(setvar "CLAYER" "Carpinteria")
;;Ojo al paso de radianes a grados que hay en el INSERT
(if (or
(equal (+ (angle bisagra p4) (/ pi 2)) (angle bisagra pgrosor) 0.001)
(equal (- (angle bisagra p4) (/(* 3 pi) 2)) (angle bisagra pgrosor) 0.001)
)
(command "_insert" nombre bisagra "" "" (* 180.0 (/ (angle bisagra p4) pi)) )
(command "_insert" nombre bisagra "" "-1" (* 180.0 (/ (angle bisagra p4) pi)) )
)
(command "_undo" "_end")
(setq *error* olderr) ;;Volver a poner los errores en condiciones
(recupera-vars)
(prin1) ;Para que no salga ningun valor en la línea de comandos
)
;; -------------------------------------------------------------------------------
;; MENSAJE HORTERA
;; -------------------------------------------------------------------------------
(defun c:puerta () (puerta))
(defun c:pt () (puerta)) ;Alias de la orden
(princ "\nFuncion para hacer puertas en un muro en 2D y 3D...cargada OK")
(princ)