Newsgroup: it.comp.software.cad
Titolo: Aiuto con lisp - un programma semplice e utile

Salve, avrei bisogno di un aiuto.
Noi, in studio, usiamo molto spezzare le linee e polilinee per costruzioni
in autocad, però risulta molto antipatico l'uso del comando spezza che per
dividere in due una linea. Infatti, ti costringe a selezionare l'entità, poi
a scegliere il flag "prima", poi devi selezionare il punto in cui spezzare
la linea e poi digitare il carattere @.
Allora, ho scritto un semplice comando in autolisp che dovrebbe spezzare una
linea/polilinea nel punto in cui uno la seleziona:
(defun c:div (/ a ent pnt)
  (graphscr)
  (prompt "spezza una linea/polilinea!\n")
  (setq a (entsel))                                           ;; seleziona
una entità e le coordinate di selezione
  (setq ent (entget (car a)))                            ;;separo l'entità e
la metto in ent
  (setq pnt (cdr a))                                         ;; separo le
coordinate e le metto in pnt
  (command "_break" ent "P" pnt "@")          ;;attivo il comando spezza con
i dati in mio possesso
)
Il programma, secondo le mie minime e frammentarie conoscenze di autolisp
dovrebbe funzionare, ma non è così.
Qualcuno mi può spiegare come mai?
Saluti  tutti
-- 
Angelo M. Figundio
ang...@figundio.it
www.figundio.it
***********************************************
E il mio signore lo sa
una sola volta non basterà
che l'avvoltoio divori il mio corpo
per far tacere per sempre il mio cuore
(A. Branduardi)
*******************************************

Non so se lo sai, ma in AutoCAD c'è già un pulsante che ti chiede di
selezionare la linea e poi il punto di break (script del bottoncino:
^C^C_break \_f \@); basta evidenziarlo personalizzando i bottoncini.
comunque, il lisp, secondo me, andrebbe corretto così:
;;;-------------------------------------------------------
(defun c:div (/ a ent pnt)
   (graphscr)
   (prompt "spezza una linea/polilinea!\n")
;; seleziona una entità e le coordinate di selezione:
   (setq a (entsel))
;; separo l'entità e la metto in ent:
   (setq ent (car a))
;; separo le coordinate e le metto in pnt:
   (setq pnt (nth 0 (cdr a)))
;; attivo il comando spezza con i dati in mio possesso:
   (command "_break" ent pnt "@")
  (princ)
)
;;;-------------------------------------------------------
Ciao Claudio
--
--
"Angelo Massimo Figundio" <figundi...@windNOSPAM.it> ha scritto nel
messaggio news:c3ccc5$v58$1...@lacerta.tiscalinet.it...



Certamente così hai risolto un errore nel lisp di Angelo.
Se però ho capito bene il suo problema occorre selezionare esplicitamente il
punto pnt, altrimenti il comando così scritto è equivalente a
 ^C^C_break \@
e non a
^C^C_break \_f \@
Maci

 linea/polilinea nel punto in cui uno la seleziona:
Il lisp corretto fa proprio questo. Però se ho interpretato male....
Ciao Claudio

 in autocad, però risulta molto antipatico l'uso del comando spezza 
ciao!
io uso un lisp (bk) che ho trovato in rete..ti posto il codice
l'unica cosa fastidiosa è che elimina tutti gli osnap per lasciare solo 
intersezione,quindi dopo li devi risettare. Si può modificare affinchè 
dopo rimetta gli osnap precedenti? (io di lisp non so nulla...)
ciao e grazie...
;BK
;BREAKER.LSP                   *** VERSION 1.2 ***              (4/11/89)
;
;WILL BREAK A LINE AT AN INTERSECTION WITH ANOTHER LINE. AUTOMATICALLY SETS
;OSNAP TO "INTERSECT".                                              *[LL]
;
(defun C:BK (/ ln bkpt)
(setq om (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 32)
(setq ln (entsel "\nChoose Line to Break..."))
(setq bkpt (getpoint "\nPick Break Point.. "))
(command "break" ln "f" bkpt "@")
(setvar "osmode" om)
(setvar "cmdecho" 1)
(prin1)
) 

GRAZIE a tutti :-D
Comunque, Claudio ha compreso appieno quanto avevo di necessità.
Infatti il problema che volevo risolvere (ed ho risolto grazie a voi tutti)
era di spezzare una linea con un solo click, e nessuna delle soluzioni
alternative faceva questo.
Un saluto a tutti :-)


AIUTO il lisp di Claudio non funziona!!
Qualcuno sa dirmi perchč?
-- 
Angelo M. Figundio
figun...@tiscali.it

 Qualcuno sa dirmi perchè?


Allora, il programma non ha mai funzionato. Da quello che ho provato è che
il punto pnt ... non è un punto.
Strano, ma ho verificato e la lista è un punto. :-( ti mando il sorgente di
div e bk (bk modificato senza osnap e funzionante).
La differenza tra i due è che in bk con getpoint funziona, ma se in div
metto (getpoint (cdr ent)) mi dice che non è un punto.
Vedi se riesci a capire cosa non va ;-)
(defun c:div (/ ent pnt)
  (graphscr)
  (setq ent (entsel "\n seleziona la linea dove vuoi dividerla \n"))
  (setq pnt (getpoint (cdr ent)))
  (command "_break" ent "_f" pnt "@" )
)
;BK
;BREAKER.LSP                   *** VERSION alpha ***
(19/03/2004)
;
;WILL BREAK A LINE
(defun C:BK (/ ln bkpt)
  (setq ln (entsel "\n Scegli una linea da spezzare..."))
  (setq bkpt (getpoint "\nseleziona il punto di divisione.. "))
  (command "_break" ln "_f" bkpt "@")
)

Allora,
la funzione GETPOINT aspetta l'inserimento di un punto dall'utente (con il
mouse o digitando le coordinate da tastiera) per cui non la puoi utilizzare
per estrarre da una variabile (ent) un punto.
Quando l'utente seleziona un'entità, con la funzione ENTSEL, questa
selezione restituisce una lista comprendente:
1) il nome dell'entità selezionata, che ti servirà per passare al comando
_break (o a qualsiasi altro comando)
2) il punto di selezione, che nel tuo caso è quello corrispondente al punto
di divisione dell'entità.
Al comando _break:
- se gli passi la variabile ENT gli passi in realtà il nome dell'entità e il
punto di selezione, per cui è necessario poi il "_F"
- se invece gli passi (car ENT) gli dai solo il nome dell'entità e non è
necessario "_F".
Per sistemare il tuo LISP ti basta quindi togliere GETPOINT perchè non devi
chiedere nulla all'utente
Lo puoi scrivere quindi:
(defun c:div (/ ent)
   (graphscr)
   (setq ent (entsel "\n seleziona la linea dove vuoi dividerla \n"))
   (command "_break" ent "_f" (cadr ent) "@" )
)
oppure:
(defun c:div (/ ent)
   (graphscr)
   (setq ent (entsel "\n seleziona la linea dove vuoi dividerla \n"))
   (command "_break" (car ent) (cadr ent) "@" )
)
Ciao Claudio
--
--
"Angelo Massimo Figundio" <figundi...@windNOSPAM.it> ha scritto nel
messaggio news:c3ehtg$nkp$1...@lacerta.tiscalinet.it...


Allora Claudio, probabilmente mi hai già dedicato troppo tempo :-), ma se
provi i tuoi listati non funzionano.
Almeno, ho provato con Autocad2004 e non funzionano.
A questo punto, al di là del programmino, mi resta un dubbio:
Se entsel mi da l'entità ed il punto di selezione.
Break cosa vuole come input per spezzarmi la linea?
giro la domanda al Gruppo
"SePrAm.com" <in...@sepramNOSPAM.com> ha scritto nel messaggio
news:umA6c.87969$O31.3...@news4.tin.it...


)
Secondo me la versione corretta è:
(defun c:div (/ ent)
   (graphscr)
   (setq ent (entsel "\n seleziona la linea dove vuoi dividerla \n"))
   (command "_break" (car ent) "_f" (cadr ent) "@" )
)
Il comando Break mi chiede la selezione di un oggetto (car ent),
l'opzione primo punto, il punto (cadr ent) e la ripetizione del punto
stesso.
Saluti, Aniello
-- 
Aniello Annunziata
Content Director Manager
www.cadlandia.com
aniello.a...@cadlandia.com
Per rispondermi in privato, togli NOGARBAGE dall'indirizzo

 ha scritto
nel messaggio news:di7o50dnuu9gf4f5c...@4ax.com...


Prima di postare dei listati di solito li provo, come ho provato questi.
Funzionano ambedue in tutte le versioni di AutoCAD.
P.S. Disattiva l'OSNAP prima di utilizzare il comando DIV!
Ciao Claudio
--
--
"Angelo Massimo Figundio" <figundi...@windNOSPAM.it> ha scritto nel
messaggio news:c3fg70$pco$1...@lacerta.tiscalinet.it...


 Cara Annuziata, speravo che ti facessi viva anche tu, purtroppo Claudio
Allora, inizamo riconrdanod che Aniello è il nome, ed Annunziata il
cognome.
Cmq, questa routine a me funziona:
(defun c:div (/ ent)
   (graphscr)
   (setq ent (entsel "\n seleziona la linea dove vuoi dividerla \n"))
   (command "_break" (car ent) (cadr ent) "@" )
)
Qual'è il problema, ora, che funziona solo se il punto di selezione si
trova direttamente sull'oggetto.
Il che significa che si debba fare la selezione usando uno degli snap
impostati in AutoCAD, altrimenti il comando fallisce miserevolmente
(nels enso che si conclude ma senza nessun risultato).
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Qual'č il problema, ora, che funziona solo se il punto di selezione si


 P.S.: A proposito ma Aniello che etimologia ha?
Sfatiamo sta storia... Aniello č un nome tipicamente napoletano, deriva
da Agnello che nel primo dialetto napoletano si diceva Ajniello, quindi
Ainiello da cui č nato il nome Aniello.
Il santo patrono č Sant'Aniello, cade il 14 dicembre (il giorno dopo
Santa Lucia, e per molto tempo il giorno piů breve dell'anno), il santo
Aniello č statto vescovo di Sorrento nel 1400.
