Newsgroup: it.comp.software.cad
Titolo: [Autolisp + codice]: (Vla-intersectwith) e (vlax-safearray->list)

Ciao a tutti, vediamo se qualcuno ne viene a capo!
 ;---------------------------------------------------------------------
 (defun c:ie ( / x-obj1 x-obj2)
 ;---------------------------------------------------------------------
  ;; OK Load ActiveX support
 (vl-load-com)
 ;; OK Select object (entity)
 ;; and Transforms entity to VLA-object
 (setq x-obj1 (vlax-ename->vla-object (car(entsel "\nSelect first object:
"))))
 (setq x-obj2 (vlax-ename->vla-object (car(entsel "\nSelect second object:
"))))
 ;; OK Gets the points where 1° obj intersects 2° obj in the drawing.
Options:
 ;; acExtendNone         Does not extend either obj.
 ;; acExtendThisEntity  Extends the base obj.
 ;; acExtendOtherEntity  Extends the obj passed as an argument.
 ;; acExtendBoth         Extends both obj.
 (setq x-var (VLA-INTERSECTWITH x-obj1 x-obj2 acExtendNone))
 ;---------------------------------------------------------------------
 ; QUESTION: If the two objects do not intersect, no data is returned;
 ; come si puo' evitare l'errore nel passaggio successivo di ricavarne la
lista ?
 ;---------------------------------------------------------------------
 ; questa parte va sempre bene (in apparenza), anche se non c'e'
interesezione,
ma non riesco a distinguere (coc questo 4 comandi) il caso in cui c'e'
intresezione
e quello in cui non c'e', (senza dover mandare in error il programma che
deve
poter continuare)
 ; OK Determines the data type of a variant
 (setq var_type  (vlax-variant-type x-var))
 ; OK Returns the value of a variant ->  diventa cosi' un safearray
 (setq var_value (vlax-variant-value x-var))
 ; OK Returns the data type of a safearray
 (setq sar_type  (vlax-safearray-type var_value))
 ; OK Returns the number of dimensions in a safearray object
 (setq sar_value (vlax-safearray-get-dim var_value))
 ;---------------------------------------------------------------------
 ; questa parte se non vc'e' intresezione va in crisi, a me in realta' serve
 solo la lista, non devo estrarmi gli elementi qua, ma volevo vedere se
riuscivo
a prevenire l'error.
 ; Message: -> error: bad argument type: safearrayp nil
 ; BAD Returns an element from an array
 (setq se (vlax-safearray-get-element vv 0))
 ; BAD Returns the elements of a safearray in list form
 (setq sl (vlax-safearray->list vv))
 ;---------------------------------------------------------------------
 (alert " ! il programma puo' continuare nonostante la mancanza di
intersezione! " )
 ) ;end defun c:ie
 ;---------------------------------------------------------------------
 grazie a buon rendere  Giovanni Anzani

 ha scritto nel messaggio
news:a8rg71$hdn$1...@lacerta.tiscalinet.it...


Ciao Stefano,
Sei stato molto gentile ed esauriente, grazie.
Ne sono venuto a capo in maniera un po' diversa, ma i tuoi suggerimenti,
mi sono stati utili per imparare funzioni che non conoscevo come quelle
relative alla "trappola per gli errori".
(vl-catch-all-apply) + (vl-catch-all-error-p)
Se ti puo' interessare ecco il predicato che mi sono costruito,
struttutato cosi' sembra non andare mai in crisi:
;-----------------------------------------------------------------------------------------
-------------
(vl-load-com) ;; Load ActiveX support
;-----------------------------------------------------------------------------------------
-------------
(defun OBJ_intersect_OBJ_P (obj1 ext1 obj2 ext2  /  x-var)
 (setq x-var (VLA-INTERSECTWITH (vlax-ename->vla-object obj1)
                         (vlax-ename->vla-object obj2)
                         (cond ((and ext1 ext2) acExtendBoth)        ;Extends both obj.
                                     (ext1            acExtendThisEntity)    ;Extends the
base obj.
                                     (ext2            acExtendOtherEntity) ; Extends the
obj passed as an argument.
                                     (T               acExtendNone))))       ;Does not
extend either obj.
 (if (safearray-value (variant-value x-var)) T nil))
;-----------------------------------------------------------------------------------------
-------------
serve a valutare se tra due oggetti esistono o no intersezioni.

Oops
Ciao Giovanni, Ciao Stefano
Mario

Ciao Giovanni
Buu Buu!!
Ma possibile che l'unico a non trovare il tempo di studiare visual lisp sono
io.???!!
Ciao Mario