Newsgroup: it.comp.software.cad
Titolo: eseguire uno zoom "oggetto"

esiste un comando o una istruzione lisp per eseguire uno zoom "oggetto"?
Cioè fare in modo che l'oggetto selezionato venga zoomato grande come lo
schermo?
Io ho trovato le due soluzioni in lisp che seguono, ma mi sembrano un pò
troppo artificiose
prima soluzione:
- seleziono l'oggetto
- lo metto in un layer appositamente creato
- spengo tutti i layer tranne quello
- faccio uno zoom estensione
- riporto l'oggeto al layer originale
seconda soluzione ancora più drastica:
- memorizzo i dati dell'oggetto
- erase _all
- reinserisco l'oggetto nel database del disegno
- zoom estensione
- oops
--
Studio geometra MIRANO Dario
www.studiomirano.it
Progettazione - Direzione lavori - Catasto terreni e fabbricati -
Cartellonistica - Grafica 2D e 3D

 schermo?
Specifica sempre quale versione usi.
Se usi >=2005 esiste già l'apposita opzione, altrimenti:
; Marc'Antonio Alessi - 
http://xoomer.virgilio.it/alessi
; Function: ALE_GetBounds
;
; Version 1.00
;
; Use:
; (ALE_getbounds (car (entsel)))
;
(defun ALE_GetBounds (EntNam / LowLft UppRgt)
; (vl-load-com)
  (vl-catch-all-apply
    'vlax-invoke-method
    (cons (vlax-ename->vla-object EntNam) '(GetBoundingBox LowLft UppRgt))
  )
  (if LowLft
    (mapcar 'vlax-safearray->list (list LowLft UppRgt))
  )
)
Se non ricordao male la cosa è già stata discussa qui tempo fa.
-- 
----------------------------------------------------------
Marc'Antonio Alessi - 
http://xoomer.virgilio.it/alessi
Per AutoCAD:
- Travi 2D: disegno automatico travi e pilastri in C.A.,
  relativi ferri e staffe, report peso ferri e C.A.
  su Excel
- Calcolo automatico aree su planimetrie: report su Excel
  per locale altezza, piano con descrizioni locali e piani
- Elaborazione dati from/to Excel
- Librerie manufatti in assonometria
- Autolayers: gestione automatica dei layers
- Elaborazioni e stampe multiple e automatiche
- Parametrico 2D, Viterie 2D/3D, Esplosi 2D/3D
- AutoGroups: gestione automatica gruppi di layers
- SetUp del disegno con gestione automatica DimStyles
- Conversione automatica files Inventor a DWG e viceversa
  anche senza avere Inventor installato
- ...
----------------------------------------------------------

 wrote in message
news:MU_Qf.30600$A83.8...@twister1.libero.it...


innanzitutto grazie, anche per la risposta sulla selezione, e anche i miei
complementi per come conosci il lisp in modo approfondito.
Su questa risposta dell zoom ti voglio chiedere una cosa.
Ok per le vlax, che piano piano sto inziando a leggermi (ma molto piano!!!),
ma sul GetBoundingBox devo proprio chiederti dei chiarimenti.
Ho cercato sulla guida di autocad, la voce GetBoundingBox è nella sezione
activeX e VBA e in particolare, nella sua pagina di help, è mostrato come un
comando VBA, questo mi ha proprio confuso un pò...... non è che puoi darmi
qualche dritta?
Poi volevo chiederti, tempo fa postai una domanda del tipo "come inserire
dentro un poligono qualsiasi una scritta grande il più possibile?", ho fatto
parecchie ricerche su internet, ma non ho ancora trovato un algoritmo
geometrico adatto, a parte alcune teorie che un pò si avvicinano.
Questo GetBoundingBox  però mi suona bene, dici che potebbe venirmi in
aiuto?Sinceramente non vedo come, ma magari tu hai qualche idea in merito.
Se comunque GetBoundingBox è una proprietà posseduta anche da una stringa di
testo, comunque un pò le cose mi vengono semplificate.


 ha scritto nel messaggio
news:oxjRf.32102$A83.8...@twister1.libero.it...


Studio MIRANO ha scritto:




ha dato la spiegazione qui
http://www.newsland.it/nr/browse/it.comp.software.cad/930.html
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ti riporto la spiegazione di Marco_AA
Purtroppo non c'è un Help diretto per le funzioni Vla.....
Occorre andare a vedere le omonime (o quasi) in:
ActiveX and VBA Reference
Il manuale ActiveX and VBA Reference fornisce informazioni sul modello di 
oggetti ActiveX e sui componenti di interfaccia associati e comprende i
seguenti 
argomenti:
Object Model
Events
Methods
Properties
Objects
Code Examples
--
Visible
Specifies the visibility of an object or the application.
See Also | Example
Signature
object.Visible
object
All Drawing objects, Application, AttributeReference, Group, Toolbar
The object or objects this property applies to.
Visible
Boolean; read-write (write-only for the Group object)
TRUE: The object or application is visible.
FALSE: The object or application is not visible.
Remarks
If you specify an object to be invisible, it will be invisible regardless
of the 
application visible setting. Other factors can also cause an object to be 
invisible; for example, an object will not be displayed if its layer is
off or 
frozen.
Specifying the application to be invisible allows you to run tasks in the 
background without having to see the component.


 testo, comunque un pò le cose mi vengono semplificate.
Oltre a quanto scritto da arri,
hai provato: (ALE_getbounds (car (entsel)))
selezionando un testo?
--
Marco

qualche dritta?
Get Boundix Box è una funzione ActiveX che permette di ottenere il più
piccolo rettangolo che contiene (strettamente) la selezione.
Le funzioni ActiveX sono richiamabili sia da VBA (molto facilmente,a
volte sono proprietà), sia da Visual Lisp, mediante le funzioni
generalmente chiamate VLA e VLAX. Infatti tutte le chiamate all'albero
ad oggetti ActiveX di AutoCAD sono replicabili mediante Visual Lisp.
Il modo fi chiamata è:
(vla-GetBoundingBox obj 'minpt 'maxpt)
dove vla-getBoundingBox è la funzione, obj è l'oggetto, minpt la lista
del punto in basso a sinistra, maxpt la lista del punto in alto a
destra.

 wrote in message
news:k8lRf.31637$PR2.6...@twister2.libero.it...


Scusa se intervengo in merito al discorso boundingbox. Come ipotizzavo in un
precedente messaggio, usare il boundingbox di una primitiva grafica per poi
fare uno zoom finestra sul bounding box e' un modo veloce ma inesatto per
ottenere cio' che cerchi. Ottieni non di visualizzare soltanto la primitiva
che hai selezionato, ma una vista che e' la piu' piccola che puo' contenere
tutta la primitiva indicata. Questo e' anche ovvio se ci si pensa su.
Ovviamente integrando la routine qui sotto con le idee che gia' avevi in
mente si puo' andare ancora piu' avanti. (Es: spostare la primitiva indicata
su un layer, spegnere tutti gli altri e poi fare lo zoom finestra sul
bounding box).
Per quanto riguarda l'utilizzo del bounding box per il problema relativo
allo scrivere un testo all'interno di una polilinea, credo non sia fattibile
per due principali motivi :
Il primo e' che il bounding box che torna autocad non e' orientato. Questo,
per l'utilizzo dello zoom come nell'esempio qui sotto e' un vantaggio, nel
tuo caso e' un problema.
Il secondo (e piu' importante) motivo e' che, se ho capito bene, a te
servirebbe il piu' grande rettangolo inscritto nella polilinea non il piu'
piccolo rettangolo non orientato che la contiene tutta (che e' appunto  il
BoundingBox).
A suo tempo avevo scritto qualcosa che faceva proprio questo. Peccato fosse
in C. Pero' sto pensando di provare a fare qualcosa in ObjArx e magari, se
decido, posso usare quell'esempio giusto per far pratica.
Buon lavoro con la routine per il testo dentro la polilinea !
Sandro
http://www/kombian.com
Sub Zoom_oggetto()
    Dim returnObj As AcadObject
    Dim basePnt As Variant
    Dim extmin As Variant
    Dim extmax As Variant
    On Error Resume Next
    '
    ' Seleziona un' entita' e calcola il box di ingombro.
    '
NUOVO_GIRO:
    ThisDrawing.Utility.GetEntity returnObj, basePnt, "Selezionare una
entita' grafica"
    '
    ' Per uscire dal loop cliccare sull'area grafica senza selezionare
nessuna primitiva
    '
    If Err <> 0 Then
        Err.Clear
        Exit Sub
    Else
        returnObj.Update
        returnObj.GetBoundingBox extmin, extmax             ' il bounding
box della primitiva
        ZoomWindow extmin, extmax                           ' Zoom finestra
su quelle dimensioni
    End If
    GoTo NUOVO_GIRO
End Sub
' Fine routine

> Get Boundix Box č una funzione ActiveX che permette di ottenere il piů
quindi Get Boundix Box č una funzione ActiveX, che puň essere richiamata sia
in VBA, sia in LISP. Il fatto che io ho trovato Get Boundix Box  scritto
come un comando VBA nell'help, vuol dire che in quel contesto era richiamato
all'interno di VBA.....capito, ti ringrazio, adesso le cose mi sono piů
chiare.

 Buon lavoro con la routine per il testo dentro la polilinea !
Grazie, essendo una funzione che in realtà mi serve poco vedrò se trovo un
pò di tempo libero per pensarci....ormai è più una questione di principio :)
P.S.: quello che segue è il codice in C????????Scusa, ma non mi trovo col
linguaggio :)


beh, risolto è una parola grande, comunque dopo aver letto sul web varie
teorie, tipo problema isoperimetrico, problema didone, teorema delaunay,
ec.. mi son reso conto che la soluzione corretta del problema è una cosa
"enorme"!Quindi ho semplificato e in fondo ho ottenuto il risultato che
volevo.
Ringrazio per la dritta del bounding box.
Il lisp che riporto sotto ragiona così:
- dentro la polilinea selezionata ci deve stare un rettangolo grande almeno
x,y
- prova a disegnare n rettangoli x,y incrementando le ccordinate del loro
primo vertice fino a quando non ne trovi uno contenuto nella polilinea
scelta
- a questo punto fermati
- opzionale: se non trovi soluzione ripeti tutto riducendo le dimensioni x,y
fino a un minimo consentito
il probleme, che spero qualcuno sappia risolvere, è che l'algoritmo è
lentissimo...................!!!!!!
si potrebbe migliorare, cioè scartare a priori i punti esterni alla
polilinea (il rettangolo viene diseganto anche se completamente esterno
perchè il parametro di partenza e il primo punto del boungind box), oppure
scartare i punti vicini al secondo punto del bounding box......ma tanto
credo rimarrebbe lento lo stesso.
Ecco il lisp:
***************************************
(defun c:prova ()
;setto le variabili
(setq a 0)
(setq listavertici nil)
(setq polyinteressata1 (ssget))
(setq xideale 4)
(setq yideale 4)
(setq stepx 1)
(setq stepy 1)
(setq uscita 0)
(setq uscita1 0)
; le 2 seguenti variabili sono per ora non è utilizzate
;servono nel caso preveda la possibilità di ridurre x e y ideali
;fino ad un minimo comunque garantito in caso con x e y ideali non si trovi
soluzione
(setq xminima 1)
(setq yminima 1)
(trovoboundingbox)
(trovolistavertici)
(while (= uscita1 0)(progn ;start while02 prova tutte le ypunto1
(while (= uscita 0)(progn ;start while01 prova tutte le x della ypunto1
corrente
(command "_rectangle" (strcat (rtos xpunto1)","(rtos ypunto1))(strcat "@"
(rtos xideale) "," (rtos yideale)))
(setq testocontenuto (ssget "_wp" listavertici '((0 . "lwpolyline"))))
(if (/= testocontenuto nil)(progn(setq uscita 1)(setq uscita1 1)))
(command "_erase" "_last" "")
(setq xpunto1 (+ xpunto1 stepx))
(if (> xpunto1 xpunto2) (setq uscita 1))
));end while01
(setq ypunto1 (+ ypunto1 stepy))
(if (> ypunto1 ypunto2) (setq uscita1 1))
(setq uscita 0)
(setq xpunto1 (car punto1))
));end while02
(command "oops")
)
;***************************************************************************
*******
;***************************************************************************
*******
;***************************************************************************
*******
(defun trovoboundingbox()
;seleziono l'oggetto dentro il quale diesegnare il rettangolo
(setq polyinteressata (entget (ssname polyinteressata1 0)))
(setq polyinteressata2 (ssname polyinteressata1 0))
;trovo gli estremi del bounding box che contiene la polyinteressata
(vl-load-com)
(vla-getboundingbox (vlax-ename->vla-object polyinteressata2) 'minpoint
'maxpoint)
(setq punto1 (vlax-safearray->list minpoint))
(setq punto2 (vlax-safearray->list maxpoint))
(princ punto1)
(princ punto2)
;trovo x e y dei punti 1 e 2
(setq xpunto1 (car punto1))
(setq ypunto1 (cadr punto1))
(setq xpunto2 (car punto2))
(setq ypunto2 (cadr punto2))
)
;***************************************************************************
*******
;***************************************************************************
*******
;***************************************************************************
*******
(defun trovolistavertici ()
(repeat (Length polyinteressata)
(Setq ennesimaproprieta (Nth a polyinteressata))
(If (= (Car ennesimaproprieta) 10)
(progn
(setq listavertici (cons (cdr ennesimaproprieta) listavertici)))
)
(setq a (+ a 1))
)
)
;***************************************************************************
*******
;***************************************************************************
*******
;***************************************************************************
*******

Ringrazio per la dritta del bounding box.
La soluzioen ideale al problema di trovare il perimetro esterno di una
serie di punti è il Delaunay, che però richiede alcune condizioni base
(spazio monoconnesso, ec. etc.).
Per il metodo Delaunay, esistono algoritmi già scritti, forse in Lisp
si trova qualcosa scritto da Reini Urban.