TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 Discretizzare poly (mista) in poly con seg uguali

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Faccine
Felice [:)] Davvero Felice [:D] Caldo [8D] Imbarazzato [:I]
Goloso [:P] Diavoletto [):] Occhiolino [;)] Clown [:o)]
Occhio Nero [B)] Palla Otto [8] Infelice [:(] Compiaciuto [8)]
Scioccato [:0] Arrabbiato [:(!] Morto [xx(] Assonnato [|)]
Bacio [:X] Approvazione [^] Disapprovazione [V] Domanda [?]
Seleziona altre faccine

    
 
   

V I S U A L I Z Z A    D I S C U S S I O N E
aforza Inserito il - 04 novembre 2010 : 12:38:57
Ciao,

qualcuno per caso ha un lispetto per trasformare una polilinea fatta di linee ed archi in polilinea di sole linee avente lunghezza ben precisa ex. 3m

p.s. con divide/misura non funziona

Nell'immagine la poli rossa è l'originale la poli bianca quella nuova

ciao

Immagine inserita:

28,12 KB
20   U L T I M E    R I S P O S T E    (in alto le più recenti)
Giuseppe Mauro Inserito il - 09 novembre 2010 : 07:21:37
Grazie raga', dopo le provo
Terminator Inserito il - 08 novembre 2010 : 22:27:11
Un'altra possibilità è data da:

(vl-load-com)
(setq lung(vla-get-length (vlax-ename->vla-object (car (entsel "\nSelezionare la polilinea: ")))))
;;; per la lunghezza
(setq area(vla-get-area (vlax-ename->vla-object (car (entsel "\nSelezionare la polilinea: ")))))
;;; per l'area
joseph Inserito il - 08 novembre 2010 : 21:52:56
Se cerchi solo la lunghezza, la soluzione si trova già nel file LSP di Terminator; comunque ti allego la modalità secondo VisualLisp:

(vl-load-com)
(setq ent (car (entsel "\nScegli la polilinea: ")))
(setq OBJCURVE (vlax-ename->vla-object ent)
LEN (vlax-curve-getDistAtParam OBJCURVE
(vlax-curve-getEndParam OBJCURVE)
))
Giuseppe Mauro Inserito il - 08 novembre 2010 : 18:07:10
Avendo sottomano 2 ottimi lispisti (parlo di josh e terminator), faccio un semi OT e chiedo 1 consiglio.

Ho un lisp che ha bisogno di calcolare la lunghezza di una poly.
Pre 2010, ottenevo questo dato in un sol colpo, dando "area->object" della poly ed andando a ricavare il valore della variabile "PERIMETER" che autocad conservava insieme all'area.
Dalla 2010 in poi (non chiedetemi il perche'), se si da il comando "area-object" su una pline le cui estremita' si intersecano (per esempio una pline a forma di zeta), il comando area crasha, per cui il lisp mi si blocca per mancanza del dato perimeter.
Cosa strana, sulla stessa polilinea, se si da un LIST, viene calcolata sia l'area che il perimetro (segno che autoca la calcola correttamente) pero' via list i valori non sono recuperabili attraverso GETVAR.

Mi date una drittina, magari anche con qualche funzione VLAX?
aforza Inserito il - 08 novembre 2010 : 14:55:12
ciao,

comunque GRAZIE 1000

ciao
Terminator Inserito il - 08 novembre 2010 : 09:34:38
Messaggio inserito da aforza

mi dispiace molto averti fatto perdere la notte



Non ti preoccupare, non ho lavorato di notte!
aforza Inserito il - 08 novembre 2010 : 09:11:38
ciao,

ottimo lavoro
complimenti dai miei colleghi
per me può bastare spero che anche altri possano sfruttare questa cosa

ciao
aforza Inserito il - 08 novembre 2010 : 08:48:55
ciao,

ora provo la nuova versione poi ti dico, rinnovo i complimenti

mi dispiace molto averti fatto perdere la notte

grazie 1000

ciao
n/a Inserito il - 08 novembre 2010 : 06:57:17
Terminator,
lascia che ti dica una cosa.



Se tu ti alzi all'alba e, prima ancora di fare colazione, posti su Cadlandia, beh, meriti una virtuale ma virile pacca sulle spalle.

Resta con noi, grazie!
Terminator Inserito il - 08 novembre 2010 : 04:56:23
Messaggio inserito da joseph

Invece di usare la combinazione "setq lung (vlax-curve-getdistatpoint
vlpoly(vlax-curve-getendpoint vlpoly))" per trovare la lunghezza totale, si può sfruttare la funzione "(vlax-curve-GetEndParam(car(entsel)))", in cui Param fornisce il numero di vertici di una polilinea; scorrendo successivamente lungo i vertici, se la funzione VLA-GETBULGE mantiene valore 0 (il che è indice di assenza di curvatura) fra 2 vertici in sequenza, in quel tratto si può usare Divide o Misura, velocizzando la procedura.


Precisazione giustissima, ma in caso di polilinee composte da soli archi casca il palco. Poi, con la seconda versione del programma, è stata tagliata la testa al toro.
joseph Inserito il - 07 novembre 2010 : 23:13:45
Messaggio inserito da Terminator
....Infatti ora il programma è lento da far paura, questo perché viene esaminato ogni punto sulla polilinea, anche i punti distanti dalla famigerata lunghezza della corda....


Invece di usare la combinazione "setq lung (vlax-curve-getdistatpoint
vlpoly(vlax-curve-getendpoint vlpoly))" per trovare la lunghezza totale, si può sfruttare la funzione "(vlax-curve-GetEndParam(car(entsel)))", in cui Param fornisce il numero di vertici di una polilinea; scorrendo successivamente lungo i vertici, se la funzione VLA-GETBULGE mantiene valore 0 (il che è indice di assenza di curvatura) fra 2 vertici in sequenza, in quel tratto si può usare Divide o Misura, velocizzando la procedura.
Terminator Inserito il - 07 novembre 2010 : 21:18:01
Ringrazio per i complimenti!

Penso che tuttavia questo forum non sia una classifica dei più bravi e dei meno bravi, ognuno da il suo contributo e devo dire che in questo forum siete tutti molto, ma molto competenti. Lo dice uno che bazzica con l'AutoCAD e con L'AutoLISP da circa 22 anni.
Giuseppe Mauro Inserito il - 07 novembre 2010 : 21:12:12
Tanto di cappello a Terminator
Stavo tentando una strada diversa (costruzione per intersezioni), ma la sua funziona uno spettacolo.

Mi sa che insidierai la leadership di GP nel lisp
Davvero i miei complimenti
Terminator Inserito il - 07 novembre 2010 : 20:03:25
Così va meglio...

La routine while è stata completamente ridisegnata, traendo ispirazione da un vecchio trucco usato su un programma che avevo fatto per le distanze di visibilità sulle curve clotoidi delle strade. In pratica, invece di considerare punto per punto di una polilinea con relative perdite di tempo, si divide in due parti la polilinea e si considera se il punto che interessa si trova nella prima parte o nella seconda. LA parte interessata si divide ulteriormente in due e via dicendo. In questo modo si può eliminare la tolleranza dato che si lavora direttamente su 8 decimali e la divisione della polilinea viene fatta quasi istantaneamente. Come ciliegina sulla torta ho aggiunto una piccola finestra di dialogo.

;;; ****************************DIVPOL***************************************
;;; Programma per discretizzare un polilinea (DIVisione POLilinea)
(defun C:DIVPOL (/ punto1 punto2 dist distanza
cordapresunta oldosmode sommacorde dist1
dist2 lung P10poli P11poli distx
disty adial ndialogo corda
)
(setq OLDOSMODE (getvar "OSMODE"))
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
(vl-load-com)
(setq vlpoly (vlax-ename->vla-object
(car (entsel "\nSelezionare la polilinea: "))
)
lung (vlax-curve-getdistatpoint
vlpoly
(vlax-curve-getendpoint vlpoly)
)
P10poli (vlax-curve-getStartPoint vlpoly)
P11poli (vlax-curve-getEndPoint vlpoly)
punto1 P10poli
)
(create_dialog_divpol)
(setq dcl_id (load_dialog ndialogo))

(if (not (new_dialog "divpol" dcl_id))
(exit)
)

(cond
((= cordas nil)
(setq cordas "3.00")
(set_tile "corda1" "3.00")
)
((/= cordas nil)
(set_tile "corda1" cordas)
)
)

;;; (initget 7)
;;; (setq corda (getdist "\nLunghezza della corda desiderata: "))
;;; (initget 7)
;;; (setq precision (getreal "\nTolleranza (millesimi di unita'): "))
;;; (setq toll (* 0.00000001 precision))

(setq sommacorde 0.00)
(setq dist1 lung)
(setq dist lung)
(setq distx dist1)
(setq dist2 0.00)
(setq disty dist2)

(action_tile "corda1" "(setq cordas $value)")
(action_tile "accept" "(valutazione)")
(action_tile "cancel" "(done_dialog 0)")

(setq flag (start_dialog))

(cond
((= flag 1)
(setq corda (atof cordas))
(command "_PLINE" P10poli)

(while (> (distance punto1 P11poli) corda)
(setq punto2 (vlax-curve-getPointAtDist vlpoly dist)
cordapresunta (distance punto1 punto2)
)

(if (equal dist1 dist2 0.00000001)
(progn
(command punto2)
(setq punto1 punto2
sommacorde
(+ sommacorde corda)
dist1 lung
dist2 dist
)
)
(progn

(if (> cordapresunta corda)
(progn
(setq distx dist1
dist1 dist
)
)
(progn
(setq disty dist2
dist2 dist
)
)
)

(setq dist (+ (/ (- dist1 dist2) 2.00) dist2))
)
)

)

(command "")
)
((= flag 0)
(alert " Funzione annullata")
)
)

(setvar "OSMODE" OLDOSMODE)
(princ)
)
;; chiusura defun

(princ
"\nDiscretizza una polilinea a distanze di corda prefissate - usare DIVPOL"
)

(defun create_dialog_divpol ()
(setq ndialogo (vl-filename-mktemp "divpol.dcl"))
(setq adial (open ndialogo "w"))
(write-line

"
divpol : dialog {
label = \"DIVPOL\";
fixed_width = true;
height = 5;
width = 15;
: edit_box {
label = \"Lunghezza corda:\";
key = \"corda1\";
edit_width = 8;
edit_limit = 8;
alignment = right;
}
: errtile {
width = 10;
}
ok_cancel;
}
"

adial
)

(close adial)
)

(defun valutazione ()

(if (<= (atof cordas) 0.00)
(progn
(set_tile "error" "Lunghezza corda non valida!")
(mode_tile "corda1" 2)
)
(progn
(set_tile
"error"
" "
)
(done_dialog 1)
)
)

)
aforza Inserito il - 05 novembre 2010 : 17:53:10
ciao,

si si vedo, i miei COMPLIMENTI, soprattutto perchè non avete perso l'entusiamo.. io l'ho un pò perso...

ho esagerato avevo una polilinea grande e con 3m ho esagerato....

qui si stava provando con un modo un pò fantaLISP partendo da presupposto che a mano faccio così...


-----------------
;;;DISCretizza.lsp
;;
;

;*******************************************************************************
(defun oEstraeVtx (bb / listanodi ed i pp nn )
;*******************************************************************************
(setq ed (entget bb) i 1 nn (length (cdr ed)))
(while (< i nn)
(if (= 10 (car (nth i ed)))
(progn
(setq pt (cdr (nth i ed))
listanodi (append listanodi (list pt))
)
):progn
);Endif
(setq i (1+ i))
)

(setq pp listanodi)
)
(defun GtoR(angolo) (/ (* pi angolo) 180.00))
(defun TrovaPunto ( pt0 accuratezza distanza)
(setq found T
anginit 0
acc (Gtor accuratezza)
ptlist nil
)

(command "_Circle" pt0 distanza)

(setq ename (entlast))

(while (< anginit (* 2 pi) )

(setq ptNear (polar pt0 anginit distanza)
ptint (Osnap ptNear "_int")
)
(if (= (type ptint) 'LIST)
(progn
(if (not (member ptint ptlist))
(setq ptlist (append ptlist (list ptint)))
);endif
);endprogn
);endif

(setq anginit (+ anginit acc))

;(command "_point" ptnear)

);endwhile

(command "_erase" ename "")

;(command "_pline")
;(foreach pt ptlist (command pt))
;(command "")
(setq ptlist ptlist)

)
(defun c:disc()

(setq LunPar 3
listatemp nil
ss1 (ssget)
coo (car (oEstraeVtx (ssname ss1 0)))
start (car (trovapunto coo 1 lunpar))
ListaTemp (append listatemp (list start))
oldApertur (getvar "APERTURE")

)

;(setvar "APERTURE" 16)

(command "_AREA" "_E" (ssname ss1 0) "")
(command "_Zoom" "_O" (ssname ss1 0) "")
; (command "_Zoom" "0.75x" "")
(setq lpl (getvar "PERIMETER") lpar 0 )

(while (< lpar lpl)

(setq newlist (trovapunto start 1 lunpar) ii 0)

(repeat (length newlist)
(if (not (member (nth ii newlist) listatemp))
(setq listatemp (append listatemp (list (nth ii newlist))))

);end if

(setq start (last listatemp))

)

(setq lpar (+ lpar lunpar))

);endwhile

(setvar "APERTURE" oldApertur)

(setq listatemp (Cons coo listatemp))

(command "_pline")
(foreach pt listatemp (command pt))
(command "")

)


(princ)
(prompt "\nDigitare su linea di comando: disc")
-------------



Terminator Inserito il - 05 novembre 2010 : 17:47:22
Stai tranquillo aforza, sta lavorando...
Terminator Inserito il - 05 novembre 2010 : 17:44:24
Ti ringrazio, Giuseppe Mauro

Hai fatto bene ad inserire quelle modifiche e comunque il programma non aveva assolutamente la pretesa di essere completo ultima release, anzi...
Il programma lascia spazio per ulteriori, eventuali miglioramenti come ad esempio una DCL di dialogo, Un'altro miglioramento che ho in mente, devo ancora buttarlo sulla carta. Infatti ora il programma è lento da far paura, questo perché viene esaminato ogni punto sulla polilinea, anche i punti distanti dalla famigerata lunghezza della corda. Infatti, prima di arrivare 3.00 unità con l'incremento di 0.0001, stiamo freschi!
Finché abbiamo una o due polilinee, poco male, si può aspettare, ma nel momento in cui bisogna trattare 50 o più polilinee...
aforza Inserito il - 05 novembre 2010 : 17:38:19
ciao,

grazie...

mi sa che è andato in loop non si muove più niente...

ciao
arri Inserito il - 05 novembre 2010 : 17:33:45
Messaggio inserito da aforza

ciao,

mi segnala questo errore

Selezionare la polilinea: ; errore: no function definition:
VLAX-ENAME->VLA-OBJECT

ora guardo

ciao


(vl-load-com)

aggiungere all'inizio
aforza Inserito il - 05 novembre 2010 : 17:31:57
ciao,

mi segnala questo errore

Selezionare la polilinea: ; errore: no function definition:
VLAX-ENAME->VLA-OBJECT

ora guardo

ciao

TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,11 secondi.