;
;   Versione per AUTOCAD 12 o Superiore  I T A L I A N O  /  I N G L E S E
;
;   Copyright (C)2003 by Claudio Rivoira
;
;      _________________________________________________________________
;      |                                                               	|
;      |   CREA UNA FRECCIA:						|
;      |                                                               	|
;      |   - Inserire 1° punto (Vertice della freccia)                	|
;      |   - Inserire 2° punto (Determina dimens. freccia)             	|
;      |   - Inserire 3° punto (determina la rotazione dellla freccia)	|
;      |   - Inserire altri punti (se si desidera proseguire la "coda")	|
;      |                                                               	|
;      ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
;
;
;---------------------------------
;  Input Variabili ambiente
;---------------------------------
(defun MODES (a)
   (setq mlst '())
   (repeat (length a)
      (setq mlst (append mlst (list (list (car a) (getvar (car a))))))
      (setq a (cdr a))
   )
)
;-----------------------------------
;  Ripristina variabili ambiente
;-----------------------------------
(defun MODER ()
   (repeat (length mlst)
      (setvar (caar mlst) (cadar mlst))
      (setq mlst (cdr mlst))
   )
)
; ----------------------------------
; Error handler (gestione errore)
; ----------------------------------
(defun b_err (st)
  (moder)		 ; Ripristina variabili memorizzate
  (setq *error* olderr)	 ; Restore old *error* handler
  (entdel msgscr)	 ; Cancella il messaggio di testo dallo schermo grafico

;;;;  Inserire qui altre variabili di sistema o comandi da eseguire prima dell'uscita

  (princ)                ; Esce senza nil
)
;----------------------------
;        Input Dati
;----------------------------
(defun INDATI ()
;
   (graphscr)
   (setvar "highlight" 1)
   (setvar "pickstyle" 1) ; Impostando a 1 questa variabile, i gruppi vengono selezionati 
;
   (modes '("OSMODE" "LIMCHECK" "CMDECHO"))
   (setvar "osmode" 0)				; Azzera osnap
   (setvar "limcheck" 0) (setvar "cmdecho" 0)
;
  (setq stiletxt (getvar "textstyle"))		; Memorizza lo stile di testo corrente
  (command "_style" "messaggi" "arial black" 0 0.7 0 "n" "n"); Crea un nuovo stile e lo rende corrente
  (setvar "TEXTSTYLE" stiletxt)			; Riporta allo stile di testo normale
;
   (setq sel (ssadd))				; Crea un gruppo di selez. senza entita'
;
   (while (= pt1 nil)				; Questo while serve per non avere pt1 = nil
     (xx:messaggio "Vertice della freccia:" 1)	; Inserisce messaggio su schermo grafico
     (setq pt1 (getpoint "\nVertice della freccia: "))
     (entdel msgscr)   ; Cancella il messaggio di testo dallo schermo grafico
   )
;
   (while (= pt2 nil)				; Questo while serve per non avere pt2 = nil
     (xx:messaggio "2° punto:" 2)		; Inserisce messaggio su schermo grafico
     (setq pt2 (getpoint pt1 "\n2° punto: "))
     (entdel msgscr)   ; Cancella il messaggio di testo dallo schermo grafico
   )
;
   (xx:messaggio "n3° punto: Direzione o <Invio>:" 3); Inserisce messaggio su schermo grafico
   (prompt "\n3° punto: Direzione della freccia")
   (setq pt3 (getpoint pt2 "\n(Invio = usa la direzione del 2° punto) : "))
   (entdel msgscr)     ; Cancella il messaggio di testo dallo schermo grafico
;
   (if (= pt3 nil)				; Se pt3 è nullo ...
     (progn
	(setq pt3 pt2)				; ... Pone pt3 = a pt2 ...
        (while (= pt4 nil)			; Questo while serve per non avere pt4 = nil
          (xx:messaggio "Altro punto:" 6)	; Inserisce messaggio su schermo grafico
	  (setq pt4 (getpoint pt3 "\nAltro punto: ")); Richiede un altro punto
          (entdel msgscr) ; Cancella il messaggio di testo dallo schermo grafico
	)
     )
   )
;
   (setq lfre (distance pt1 pt2))		; Lunghezza della freccia
   (setq hfre (/ lfre 2))			; Altezza della freccia = 1/2 della lunghezza
   (setq pt2 (polar pt1 (angle pt1 pt3) lfre))	; Ricalcola la posizione del pt2
;
   (if pt4					; Se il punto pt4 esiste ...
     (progn
       (command "_pline" pt1 "_w" 0 hfre pt2 "_w" 0 0 pt4 ""); Disegna la freccia (polilinea con largh. variabile)
       (setq ptvec pt4)				; Pone PTVECchio = pt4
     )
     (progn
       (command "_pline" pt1 "_w" 0 hfre pt2 "_w" 0 0 pt3 ""); Disegna la freccia (polilinea con largh. variabile)
       (setq ptvec pt3)				; Pone PTVECchio = pt3
     )
   )
;
   (setq sel (ssadd (entlast) sel))		; Aggiunge alla selez. l'ultima entita' creata (la polilinea)
;
   (setq loop T)				; Inizializza il flag (per entrare nel loop)
   (while loop
     (xx:messaggio "Altro punto  (Invio=fine):" 7); Inserisce messaggio su schermo grafico
     (setq ptnew (getpoint ptvec "\nAltro punto (Invio=fine): "))
     (entdel msgscr)				; Cancella il messaggio di testo dallo schermo grafico
     (if ptnew					; Se ptnew esiste (diverso da nil) ...
       (command "_line" ptvec ptnew "")		; Traccia una linea ...
       (setq loop nil)				; ... altrimenti annulla il flag (per uscire da loop)
     )
     (setq sel (ssadd (entlast) sel))		; Aggiunge alla selez. l'ultima entita' creata (la linea)
     (setq ptvec ptnew)				; Aggiorna la posizione del punto vecchio
   )
;
  (command "_pedit" sel "_J" sel "" "")		; Unisce tutte le linee alla freccia
;
)
;;;;
;;;;
;;;;
;;;;----------------------------------------
;;;;    SCRIVE UN MESSAGGIO SU SCHERMO
;;;;----------------------------------------
;;;;
;;;;	Questa sub. può essere utilizzata per creare dei messaggi 
;;;;    sullo schermo durante l'utilizzo del programma.
;;;;	I messaggi sono dei testi posizionati a centro schermo e con 
;;;;    una dim. (H testo) che si adegua allo zoom corrente.
;;;;	Dopo aver scritto il messaggio, la sub. memorizza il testo nel 
;;;;    set di selezione MSGSCR in modo da poterlo
;;;;	cancellare successivamente.
;;;;
;;;;	Purtroppo l'utilizzo di un'entità 'testo' impone di non poter 
;;;;    utilizzare il bit 64 di osmode (Punto di inserimento) che
;;;;	potrebbe 'forzare' l'osnap sul punto di inserimento del testo 
;;;;    anzichè sul punto desiderato.
;;;;	Occorre quindi utilizzare questa subrutine senza osnap o comunque 
;;;;    con un valore in cui non ci sia il punto di inserimento.
;;;;
;;;;	Dati in input:
;;;;	txt	= Testo da inserire: è una semplice stringa (non deve essere preceduta da '\n')
;;;;	colmsg	= Colore del testo : un numero dall'1 al 255 che identifica il colore
;;;;
;;;;	Dati in output:
;;;;	msgscr	= Set di selezione con il quale è possibile cancellare il testo in qualunque momento.
;;;;
;;;;
					;
(defun xx:messaggio (txt colmsg)
					;
  (setvar "TEXTSTYLE" "messaggi")	; Imposta lo stile di testo per i messaggi (creato nella sub. INDATI)
					;
  (setq posiz
    (list
      (car (getvar "viewctr"))		; Asse x della coord. del centro dello schermo corrente
      (+
        (cadr (getvar "viewctr"))	; Asse y della coord. del centro dello schermo corrente
	(* (/ (getvar "viewsize") 10) -4); Sposta verso la parte bassa dello schermo
      )
    )
  )
  ; Viene scritto il testo sullo schermo con un H testo pari a 1/15 della dimensione dello zoom corrente
  (command "_text" "_j" "_mc" posiz (/ (getvar "viewsize") 15) 0 txt)
  (setq msgscr (entlast))		; Memor. il testo appena creato: sara' possibile cancellarlo facilmente
  (command "_change" msgscr "" "_p" "_c" colmsg ""); Cambia il colore al testo del messaggio
  (setvar "TEXTSTYLE" stiletxt)		; Riporta allo stile di testo normale
)
;;;;
;
;
;--------------------------------------------------
;     P R O G R A M M A     P R I N C I P A L E
;--------------------------------------------------
(defun C:FRECCIA 	(/
		a mlst st       ; In MODES e MODER per salvare e riprist. variabili
		olderr          ; Gestione errori
		pt1 pt2 pt3 pt4 ; Punti della freccia
		lfre hfre       ; lunghezza e altezza freccia
		sel             ; Set di selezione (per creare un'unica polilinea)
		ptvec ptnew     ; Punto vecchio e punto nuovo (per creare le linee)
		loop            ; Flag per entrare nel while
		)
;
   (setq olderr *error* *error* b_err)		; Richiama gestore errori
;
   (indati)					; Input dei dati
;
   (moder)					; Ripristina variabili iniziali
;
   (setq olderr *error*)			; Ripristina in caso di errore
   (princ)					; Esce senza nil
)