domenico ieva home page
domenicoIEVA.com consulente CAD & CG - sviluppo software in ambiente AutoCAD

 

CS : copia o trasferice entità dallo spazio modello allo spazio carta e viceversa

Questa breve programma e' stato anche pubblicato sul n.4 del '92 della rivista Mondo AutoCAD. Di seguito, l'articolo che lo introduceva:

Molto spesso si ha la necessita' di trasferire alcune parti del disegno dallo spazio CARTA allo spazio MODELLO o viceversa.

Per fare ciò un metodo potrebbe essere quello di creare un blocco dell'oggetto, commutare lo spazio inserire il blocco. Altrimenti utilizzare Change Space CS.

Il programma, dopo una normale selezione di oggetti, permette di COPIARE o TRASFERIRE le entita' selezionate nell'altro spazio (modello o carta). La routine sfrutta la funzione ENTMAKE, che crea delle nuove entita' data una lista strutturata così come restituita da entget. A secondo dello spazio in cui si trova l'entita' da copiare o trasferire, basta modificare nella sua lista il valore della coppia puntata con indice 67 : (0 se nello SpazioM 1 se nello SpazioC).

Da notare che le entita' VIEWPORT non possono essere trasferite o copiate nello spazio modello e, sebbene la funzione ENTMAKE abbia il pieno controllo su questo tipo di operazione (nel senso che non genera un errore ma setta solo la variabile ERRNO a 54), ho previsto comunque la rimozione, dal gruppo di selezione, delle eventuali VIEWPORT selezionate.


(defun c:cs ()

;;
;;* Muta spazio :Crea lista con flag per l'altro 'spazio'.
;;

(defun muta_sp ( a / new_lst )
   (if (= (getvar"cvport") 1)
     (setq new_lst (subst (cons 67 0) '(67 . 1) (entget a (list "*"))))
     ;(setq new_lst (append (entget a (list "*")) '((67 . 1)))) rimosso perchè non funziona con nuove versioni di AutoCAD
     (setq new_lst (subst (cons 67 1) '(67 . 0) (entget a (list "*"))))
   );chiude if
   ;(entmake new_lst)
   (entmake (VL-REMOVE (assoc 410 new_lst) new_lst)); aggiunto vl-remove per elimina coppia 410 con nome layout
)


;;*  Entita' complesse: Applica la funzione muta_sp alle entita' secondarie di una
;;*  polilinea o di un blocco fino a SEQEND.
;;

(defun ent_comp ( x / in )
    (setq in T)
    (while in
       (muta_sp x)
       (if (= "SEQEND" (cdr (assoc '0 (entget x))))
            (setq in nil)
            (setq x(entnext x))
       )
     )
)

;; M a i n  -----

  (setq ce(getvar "cmdecho"))
  (setvar "cmdecho" 0)

  (if (setq ss(ssget)) ;;selezione oggetti
     (progn
       (if (= 1 (getvar"cvport"))
         (progn
           (setq sp "MODELLO" i 0 lss (sslength ss)) 
           ;; rimuove le entita 'VIEWPORT' dal gs ss
           (while (< i lss)
               (setq en(ssname ss i))
               (if (= "VIEWPORT" (cdr(assoc '0 (entget en))))
                  (progn
                     (ssdel en ss) (setq lss(1- lss))
                     (prompt"\nVIEWPORT rimossa dal gruppo di selezione.")
                  )
                  (setq i(1+ i))
                );if
            );while        
          );progn
          (setq sp "CARTA") 
        );if

        (initget "Trasferisce Copia")
        (setq cot(getkword (strcat "\nCopia o trasferisce nello spazio " sp "? <C>: ")) i 0)
        ;per ogni entita' applica muta_sp tranne che ai blocchi e le polilinee
        (repeat (sslength ss)
           (setq en(ssname ss i))
   
           ;se sono polilinee o blocchi con attributi applica ent_comp
              (if (or (= "POLYLINE" (cdr (assoc '0 (entget en))))
                 (and (= "INSERT" (cdr (assoc '0 (entget en))))
                               (cdr(assoc '66 (entget en))) 
                 )
               )
             (ent_comp en)
             (muta_sp en)
           )
           (setq i(1+ i))
         );repeat

         (prompt(strcat "\n" (itoa(sslength ss)) " entita' "))  
           (if (= cot "Trasferisce") 
              (progn 
                 (command"._erase" ss "") 
                 (prompt "trasferita/e.")
               )
               (prompt "copiata/e.")
           )
        );progn
        );if
        
        (setvar "cmdecho" ce)
        (princ)
);defun

  NOTA: Sono passati più di 20 anni dalla stesura di questo programma e molte cose sono cambiate
  nella struttura del database di AutoCAD pertanto ho apportato delle modifiche all'originale del 1992.
  
  Nella funzione muta_sp ho rimosso una linea di codice che aggiungeva la coppia (67 . 1) tramite append.
  Non poteva più funzionare perchè, nelle nuove versioni di AutoCAD, la coppia con indice 67 è sempre
  presente.
  L'entmake usa adesso una lista da cui si elimina la coppia (410 . "xxxx...") che contine il nome del layout
  di appartenenza dell'entità. La sua presenza colliderebbe con l'effetivo spazio di destinazione dell'oggetto.
  

DOWNLOAD: CS.ZIP (1 KB)

 

 


...perennemente in costruzione dal maggio 1997 | h.p. versione 6


Google+

canale YouTube

email: info@domenicoieva.com

AutoCAD 2015 Certified Professional