Newsgroup: it.comp.software.cad
Titolo: [LISP] problemi con dati di definizione di un oggetto

Salve a tutti, è da un po' che non scrivevo sul forum.....
scusate se il post risulta un po' lungo.
Il mio problema è il seguente:
da una selezione di oggetti, nella fattispecie dei blocchi, li passo con i vari entget per esportare una serie di informazioni che mi servono...
Ho dei problemi su qualcuno di questi blocchi in quanto tra le informazioni(ad esempio le coordinate) del db di AutoCAD del blocco, e quelle reali di posizione nel disegno ci sono delle incogruenze!
Vi riporto sotto quanto ricavo con il comando "lista" e lo stesso blocco passato con entget in lisp.
 
Definizione Blocco con comando:"LISTA"
RIFERIMENTO DI BLOCCO  Layer: "SCHEDA"
                            Spazio: Spazio modello
                     Gestore = 246
  Nome del blocco: "SCHEDA"
                al punto, X=2350051.3814  Y=4856932.1379  Z=   0.8713
Fattore di scala X:    1.0000
Fattore di scala Y:    1.0000
Fattore di scala Z:    1.0000
Direzione di estrusione relativa al sistema UCS:
                   X=   0.0458  Y=   0.1760  Z=   0.9833
Scala uniformemente: No
Consenti esplosione: Sì
 
                  ATTRIBUTO  Layer: "0"
                            Spazio: Spazio modello
                     Gestore = 247
             Stile = "Standard"
        Annotativa: No
             Tipo di carattere = Arial
          iniziale punto, X=2350072.5775  Y=4856934.4557  Z=  -0.5307
           altezza   20.0000
            valore 35
         etichetta NS
         larghezza fattore di scala    1.0000
      inclinazione angolo      0
Direzione di estrusione relativa al sistema UCS:
                   X=   0.0458  Y=   0.1760  Z=   0.9833
              flag normale
       generazione normale
 
                  FINE DELLA SEQUENZA  Layer: "SCHEDA"
                            Spazio: Spazio modello
                     Gestore = 248
 
Definizione blocco selezionato con metodi Lisp:
((-1 . <Nome entità: 7ef03670>) (0 . INSERT) (330 . <Nome entità: 7ef01cf8>) (5 . 246) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . SCHEDA) (100 . AcDbBlockReference) (66 . 1) (2 . SCHEDA) (10 -1.05088e+006 -5.20405e+006 962300.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 2.88696) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0458009 0.175968 0.98333))
 
((-1 . <Nome entità: 7ef03678>) (0 . ATTRIB) (330 . <Nome entità: 7ef03670>) (5 . 247) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 -1.0509e+006 -5.20406e+006 962300.0) (40 . 20.0) (1 . 35) (50 . 2.88696) (41 . 1.0) (51 . 0.0) (7 . Standard) (71 . 0) (72 . 0) (11 0.0 0.0 962300.0) (210 0.0458009 0.175968 0.98333) (100 . AcDbAttribute) (280 . 0) (2 . NS) (70 . 0) (73 . 0) (74 . 0) (280 . 0))
 
((-1 . <Nome entità: 7ef03680>) (0 . SEQEND) (330 . <Nome entità: 7ef03670>) (5 . 248) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . SCHEDA) (-2 . <Nome entità: 7ef03670>))
 
Any suggestion?
Grazie
Andrea

> Any suggestion?
 
Tieni presente che il comando lista restituisce i valori in funzione
dell'UCS corrente (vedi sotto) mentre il valore 10 (DXF) ï¿œ in OCS:
 
10 = Insertion point (in OCS) DXF: X value; APP: 3D point
20, 30 = DXF: Y and Z values of insertion point (in OCS)
 
 
Marco
 
--------------------------------------------------------------------
                  RIFERIMENTO DI BLOCCO  Layer: "$COM_NORM"
                            Spazio: Spazio modello
                   Gestore = 1886
  Nome del blocco: "RIC"
                al punto, X=    18.57  Y=  -197.79  Z=     0.00
Fattore di scala X:      1.00
Fattore di scala Y:      1.00
angolo di rotazione:   0.00
Fattore di scala Z:      1.00
         Unitï¿œIns: Millimetri
Conversione unitï¿œ:      1.00
Scala uniformemente: No
Consenti esplosione: Sï¿œ
 
Comando: ucs
 
Nome UCS corrente: *NESSUN NOME*
Specificare origine dell'UCS o [Faccia/con
NOme/OGgetto/Precedente/Vista/Globale/X/Y/Z/Asse-z] <Globale>:
 
Comando: lista
 
Selezionare oggetti: trovato(i) 1
 
Selezionare oggetti:
                  RIFERIMENTO DI BLOCCO  Layer: "$COM_NORM"
                            Spazio: Spazio modello
                   Gestore = 1886
  Nome del blocco: "RIC"
                al punto, X=   228.24  Y=   208.13  Z=  -182.69
Fattore di scala X:      1.00
Fattore di scala Y:      1.00
Fattore di scala Z:      1.00
Direzione di estrusione relativa al sistema UCS:
                   X=     0.25  Y=     0.92  Z=    -0.30
         Unitï¿œIns: Millimetri
Conversione unitï¿œ:      1.00
Scala uniformemente: No
Consenti esplosione: Sï¿œ
 
-- 
Marco
 
 

 Marco
Marco grazie mille per il tuo interessamento!
Era da un po' che non scrivevo in lisp ed il discorso dell'OCS mi sfuggi...
Mi son ricordato della funzione "trans"....
About Coordinate System Transformations (AutoLISP)
http://docs.autodesk.com/ACD/2013/ENU/index.html?url=files/GUID-0F0B833D-78ED-4491-9918-9481793ED10B.htm,topicNumber=d30e577075
 
ma qualcosa mi sfugge.
Se non ho capito male con tale funzione si possono passare le coordinate di un punto tra i diversi sistemi ma come funziona!?
Andrea
 

 un punto tra i diversi sistemi ma come funziona!? Andrea
 
Spiegarlo qui ï¿œ un po' lungo, fai delle prove con coordinate semplici e
prova questo programma:
 
; Marc'Antonio Alessi -  
http://alessi.xoom.it//alessi/
 
; Function: ALE_PointId
;
; Version 1.00
;
(defun C:ALE_PointId ( / Pnt000 Pnt001 Pnt002 Pnt01d Pnt02d AltStr PrmStr)
  (setq Pnt000 (upoint 41 "Confronta" "Confronta/<indica punto>" nil nil))
  (cond
    ( (= (type Pnt000) 'list)
      (alert (strcat "UCS           " (ALE_PointIdPrint Pnt000 1 1) (chr 10)
                     "World         " (ALE_PointIdPrint Pnt000 1 0) (chr 10)
                     "Display       " (ALE_PointIdPrint Pnt000 1 2) (chr 10)
      )      )
    );1 cond
    ( (= Pnt000 "Confronta")
      (setq
        Pnt001    (upoint 41 "" "ID primo punto" nil nil)
        Pnt002    (upoint 41 "" "ID secondo punto" nil Pnt001)
        PrmStr (strcat
                "Punto 1  UCS           "   (ALE_PointIdPrint Pnt001 1 1) (chr 10)
                "Punto 1  World         "   (ALE_PointIdPrint Pnt001 1 0) (chr 10)
                "Punto 1  Display       "   (ALE_PointIdPrint Pnt001 1 2) (chr 10) (chr 10)
                "Punto 2  UCS           "   (ALE_PointIdPrint Pnt002 1 1) (chr 10)
                "Punto 2  World         "   (ALE_PointIdPrint Pnt002 1 0) (chr 10)
                "Punto 2  Display       "   (ALE_PointIdPrint Pnt002 1 2) (chr 10) (chr 10)
                "Distanza 3D tra i punti: " (rtos (distance Pnt001 Pnt002))        (chr 10)
              )
        Pnt01d   (trans Pnt001 1 2)
        Pnt02d   (trans Pnt002 1 2)
      )
      (cond
        ( (> (caddr Pnt01d) (caddr Pnt02d)) (setq AltStr "Il punto 1 ï¿œ piï¿œ vicino") )
        ( (< (caddr Pnt01d) (caddr Pnt02d)) (setq AltStr "Il punto 2 ï¿œ piï¿œ vicino") )
        ( (= (caddr Pnt01d) (caddr Pnt02d)) (setq AltStr "Il punto 1 ed il punto 2 sono alla stessa profonditï¿œ") )
      )
      (alert (strcat PrmStr AltStr " relativamente al display." (chr 10)))
    );2 cond
  );cond
  (princ)
)
;
(defun ALE_PointIdPrint (Pnt001 FromPt To__Pt / Pnt002)
  (setq Pnt002 (trans Pnt001 FromPt To__Pt))
  (strcat
    (substr (strcat "X: " (rtos (car   Pnt002)) "         ") 1 13) "  "
    (substr (strcat "Y: " (rtos (cadr  Pnt002)) "         ")  1 13) "  "
                    "Z: " (rtos (caddr Pnt002))
  )
)
(princ)
; ---------- Source files from: --------------------------------------------
; These functions are freeware courtesy of the author's of "Inside AutoLisp"
; for rel. 10 published by New Riders Publications. This credit must
; accompany all copies of this function.
; Modified by Alessi Marc'Antonio
;
; UPOINT Funzione di interfaccia utente per punti.
; IGtBit > (1 = not null, 0 for none) same of INITGET
; KwdStr = key word ("" for none) same of INITGET
; PrmStr = prompt string, a default as <DefPnt> (nil for none)
;          will be added and a : will be added
; BasPtn = base point (nil for none)
;
; Example:
; (setq #GlVal (uPoint 40 "" "Inser point <Lastpoint>" #GlVal #GlVal))
;
(defun uPoint (IGtBit KwdStr PrmStr DefPnt BasPtn / InpVal DefStr ZetPnt)
  (if DefPnt
    (setq
      ZetPnt (caddr DefPnt)
      DefStr
        (strcat
          (rtos (car  DefPnt)) ","
          (rtos (cadr DefPnt)) ","
          (if ZetPnt (rtos ZetPnt) "0")
        )
      PrmStr (strcat "\n" PrmStr " <" DefStr ">: ")
      IGtBit (logand IGtBit 254)
    )
    (setq PrmStr (strcat "\n" PrmStr ": "))
  )
  (setq InpVal "STRINGANONVALIDA" IGtBit (+ IGtBit 128))
  (while
    (not
      (or
        (= 'LIST (type InpVal))
        (null InpVal)
        (if (= 'STR (type InpVal))
          (or
            (= 'LIST (type (read InpVal)))
            (wcmatch KwdStr (strcat "*" InpVal "*"))
          )
        )
      )
    )
    (initget IGtBit KwdStr)
    (setq InpVal (if BasPtn (getpoint BasPtn PrmStr) (getpoint PrmStr)))
  )
  (if InpVal
    (if (or (/= 'STR (type InpVal)) (atom (read InpVal)))
      InpVal
      (eval
        (if (= "ACTIVE" (cadr (read InpVal)))
          (subst nil "ACTIVE" (read InpVal))
          (read InpVal)
        )
      )
    )
    DefPnt
  )
)
 
-- 
Marco
 
 

 Marco
 
Scusa se ti rispondo solo adesso....., grazie mille per il codice me lo studierò per bene!
Ciao
Andrea