Newsgroup: it.comp.software.cad
Titolo: Visualizzazione immagini in AutoCAD 2000

Se seleziono un'immagine nella finestra proprietà compare in fondo "Mostra
immagine" dove posso scegliere Si o No. Se metto No non vedo più l'immagine
ma solo la cornice.
Il mio problema è che non riesco a trovare il comando che fa questa
operazione da linea di comando per poter inserire tale procedura in uno
script o in un lisp. Siete in grado voi di aiutarmi per piacere ?
Grazie
--
Massimo Ghio

Niente .....    nessuno lo sa.
--
Massimo Ghio

In data astrale Wed, 29 Aug 2001 15:02:14 GMT, Massimo Ghio ha
scritto:

Penso che una cosa del genere tu la possa fare solo col VisualLisp,
usando le funzioni VLA... del modello ad oggetti.
Queste operazioni, purtroppo, si fanno solo da finestra di dialogo
(IMAGE) e l'unico modo di implementarle, dunque è tramite il modello
ad oggetti, quindi o VisualLisp o VisualBasic, cerca nella guida in
linea per sapere come fare.
Saluti, Aniello
-- 
Aniello Annunziata
Content Director Manager
www.cadlandia.com
aniello.a...@cadlandia.com
Per rispondermi in privato, togli NOGARBAGE dall'indirizzo

 linea per sapere come fare.
Purtroppo la guida in linea dice di usare la finestra proprietà.
Grazie lo stesso.
--
Massimo Ghio

Purtroppo la guida in linea dice di usare la finestra proprietà.
I problemi difficili mi piacciono, così ho cercato un po' di
informazioni.
Il modello ad oggetti VBA di AutoCAD ha un oggeto Raster, questo ha la
proprietà Imagevisibility. Il punto, ora è quello di creare una
routine VBA che permette di selezionare l'immagine ed applicare a
questa proprietà l'opzione OFF.
Dalla guida in linea ho trovato:
Sub Example_ImageVisibility()
    ' This example inserts a raster image and finds the current status
    ' of ImageVisibility for the image. It then changes the
ImageVisibility
    ' status of the image.
 
    ' This example uses the "downtown.jpg" found in the sample
    ' directory. If you do not have the image, or it is located
    ' in a different directory, insert a valid path and name for the
    ' imageName variable below.
    Dim insertionPoint(0 To 2) As Double
    Dim scalefactor As Double
    Dim rotAngleInDegree As Double, rotAngle As Double
    Dim imageName As String
    Dim raster As AcadRasterImage
    imageName = "C:\AutoCAD\sample\downtown.jpg"
    insertionPoint(0) = 2#: insertionPoint(1) = 2#: insertionPoint(2)
= 0#
    scalefactor = 1#
    rotAngleInDegree = 0#
    rotAngle = rotAngleInDegree * 3.141592 / 180#
 
    On Error Resume Next
 
    ' Creates a raster image in model space
    Set raster = ThisDrawing.ModelSpace.AddRaster(imageName,
insertionPoint, scalefactor, rotAngle)
    If Err.Description = "File error" Then
        MsgBox imageName & " could not be found."
        Exit Sub
    End If
    ' Find the current ImageVisibility
    ThisDrawing.Regen True
    MsgBox "The ImageVisibility is currently set to: " &
raster.ImageVisibility, vbInformation
 
    ' Change the ImageVisibility
    If (raster.ImageVisibility) Then
        raster.ImageVisibility = False
    Else
        raster.ImageVisibility = True
    End If
    ThisDrawing.Regen True
    MsgBox "The ImageVisibility is now set to: " &
raster.ImageVisibility, vbInformation
End Sub
Tralasciando il resto, la parte interessante è:
    If (raster.ImageVisibility) Then
        raster.ImageVisibility = False
    Else
        raster.ImageVisibility = True
    End If
    ThisDrawing.Regen True
A questo punto basta che si crea il codice per selezionare un immagine
ed aggiungere il codice sovrastante ed il gico è fatto, s'è creato uno
switch.
Basta associarlo ad una combinazione di tasti o ad un bottone e per
magia s'è aggiunta una comoda utilità ad AutoCAD.
Purtroppo nemmeno io sono ferrato di VBA per AutoCAD, così prima di
lanciarmi in avventure senza uscita, chiedo l'intervento di qualche
maghetto VBA.


Purtroppo la guida in linea dice di usare la finestra proprietà.
La guida in linea fa tutto facile, ma a me piace complicarmi le cose,
e visto che il VBA è una mia lacuna ho cercato di fare i primi passi,
ed ecco quello che ho tirato fuori:
Questo è il codice che devi mettere in un modulo VBA:
--- INIZIO TESTO DA COPIARE ---
Sub InputImage(objimage As Object)
    '
    'Acquisisce un immagine dallo schermo di AutoCAD.
    '
    Dim SSet As Object
    Dim GroupCode(0 To 2) As Integer
    Dim DataValue(0 To 2) As Variant
    On Error GoTo ErrorTrap
    'Definisce un nuovo set di selezione.
    Set SSet = ThisDrawing.SelectionSets.Add("SSImage")
    'Filtra solo le immagini.
    GroupCode(0) = -4
    DataValue(0) = "<or"
    GroupCode(1) = 0
    DataValue(1) = "image"
    GroupCode(2) = -4
    DataValue(2) = "or>"
    SSet.SelectOnScreen GroupCode, DataValue 'Acquisisce l'immagine.
    Set objimage = SSet.Item(0)  'Estrapola l'immagine dal set di
selezione.
    SSet.Delete  'Cancella il set di selezione.
    Exit Sub
ErrorTrap:
    SSet.Delete  'Cancella il set di selezione.
End Sub
Sub SwitchImage()
    '
    'Processa un immagine dallo schermo di AutoCAD e setta la
    'variabile ImageVisibility (Visilbilità) ON ed OFF
    '
    Dim Raster As Object
 
    On Error GoTo ErrorTrap2
 
    'Switcha la visibilità ON ed OFF
    InputImage Raster
    If (Raster.ImageVisibility) Then
        Raster.ImageVisibility = False
    Else
        Raster.ImageVisibility = True
    End If
    ThisDrawing.Regen True
    Exit Sub
ErrorTrap2:
End Sub
--- FINE TESTO DA COPIARE ---
A questo punto salvi in un file DVB ed hai la tua routine.
Puoi crearti una barra degli strumenti con un pulsante.
Il codice da inserire nel pulsante è:
^C^C-VBARUN SwitchImageVisibility.dvb!Modulo1.SwitchImage 
Dove -VBARUN è il comando che fa caricare uan macro,
SwitchImageVisibility.dvb è il nome del file dvb che contiene la macro
(se non è in una cartella della pathdei file di supporto di AutoCAD
devi aggiungere anche il percorso),  Modulo1 è il Modulo che contiene
la macro e SwitchImage è la macro.
La macro che ho creato non gestisce gli errori, così, se non si
seleziona nulla (cliccando sul pulsante destro del mouse o premendo
ESC o Invio) la routine genererà un errore e comparirà la finestra del
debugger di VBA. purtroppo non ho avuto ne il tempo ne la preparazione
per mettere a punto una efficiente routine di error trapping.
L'unica cosa che ho potuto corregere è stata l'introduzione di un
piccolo error trapping per evitare che il selection set rimanga in
memoria e quindi renda inutilizzabile (nella sessione di lavoro
corrente) la routine VBA.
Questo è il mio modesto contributo, sperando che sia utile a tutti.


Ciao Massimo, ciao Aniello,
Ecco in autolisp (LISP) un po' di codice (+C)
per avere un simpatico interruttore on/off per le immagini raster
(Command: ICA);
sulla base di quanto sto' passando si possono preparare altre procedure
per fare ad esempio l'on/off di tutte le immagini del dwg o di quelle su
determinati layer.... ... capito Massimo? ... ...se ti serve e non ci riesci
fammi sapere. :-)
quanto al VBA, caro Aniello, dovrei impararlo, ma non ne ho il tempo.
Il codice sviluppato prende spunto dal grande libro
dei codici DXF sottoparagrafo IMAGE, nel quale
trovasi quanto segue:
 Group code 70:  Image display properties:
   1 = Show image
   2 = Show image when not aligned with screen
   4 = Use clipping boundary
   8 = Transparency is on
 In pratica se il codice 70 e' dispari l'immagine e' visualizzata
 se no e' spenta... ...basta invertire l'interruttore. :-)
Ci si sente o ci si scrive...
ciao Giovanni Anzani.
---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---
;-----------------------------------------------------;
; Procedure sviluppate da Giovanni Anzani  -  SET 2001;
; email: 
giova...@tiscalinet.it
                     ;
;-----------------------------------------------------;
;-----------------------------------------------------;
; DESCRIZIONE PROCEDURE E PROGRAMMI
;-----------------------------------------------------;
; (imvis-p ne) -> IMmagine VIsibilita' Predicato.
;    Restituisce T se l'entita' passata tramite il suo
;    nome e' visibile, nil se e' invisibile.
;    manca un controllo del tipo di entita, e' quindi
;    testato solo per entita' image per le quali il
 ;    cod 70 esprime lo stato di visibilita'
; (imvis-c ne cod)  ->  IMmagine VIsibilita' Cambia.
;    La funzione svolge tre possibili compiti a seconda
;    del valore passato con cod:
;      cod =  0 -> on/off dell'imm.
;      cod =  1 -> on     dell'imm.
;      cod = -1 ->    off dell'imm.
;   Anche qua manca qualsiasi controllo, o gestione
;   di errori.
; INA -> nasconde l'immagine se e' visibile
; ICA -> cambia lo stato di visibilita' dell'immagine,
;        se e' visibile la nasconde e viceversa
; IMO -> mostra l'immagine se non e' visibile
;-----------------------------------------------------;
;-----------------------------------------------------;
; PROCEDURE E PROGRAMMI
;-----------------------------------------------------;
(defun imvis-p (ne)
  (if (zerop (rem (cdr (assoc 70 (entget ne))) 2)) nil T))
;-----------------------------------------------------;
(defun imvis-c (ne cod / le c70 cvi)
  (setq le   (entget ne))
  (setq c70  (assoc 70 le))
  (setq cvi  (+ (cdr c70)
                (cond ((= cod  0) (if (imvis-p ne) 1 -1))
                      ((= cod  1) (if (imvis-p ne) 0 -1))
                      ((= cod -1) (if (imvis-p ne) 1  0)))))
  (entupd (cdr (assoc -1 (entmod (subst (cons 70 cvi) c70 le))))))
;-----------------------------------------------------;
(defun c:INA () (imvis-c (car (entsel)) -1))
(defun c:ICA () (imvis-c (car (entsel))  0))
(defun c:IMO () (imvis-c (car (entsel))  1))
;-----------------------------------------------------;
---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---CUT---

Grazie ragazzi.
Ora ci lavoro un po' poi vi faccio sapere.
La procedura di Aniello in VBA sono riuscito farla funzionare, purtroppo
però non sono pratico e non riesco a creare una selezione automatica.
Sono contento di aver riportato G.Anzani nel NG. Spero che rimanga.
Ripeto, provo a lavorarci un po' e vi faccio sapere.
--
Massimo Ghio