Aller au contenu

ldata et <Selection set: 8f6e>


Messages recommandés

Posté(e)

Salut,

Ce n'est pas la première fois que cela m'arrive :

J'enregistre une liste dans les ldata sous la forme

(< Selection set: 8fe8 > < Selection set: 8f6e > < Selection set: 8f12 >)

 

Et bien on dirait qu'Acad aime pas du tout le fait que j'enregistre des "Selection set" comme ça.

Si je fais appel à d'autre lisp (qui n'ont rien a voir avec le lisp qui utilise le liste de ldata enregistré),

j'ai des messages du genre :

 

; erreur: impossible de numéroter les données Lisp: < Selection set: 8fe8 >

 

*Avertissement*: objet en propriété multiple, maintien "1184E"

 

http://images.imagup.com/04/1216734843_yyyy.jpg

 

Cela vous est déjà arrivé ????

Vous avez trouvé une solution (à part enregistrer le liste des handle ou de vla-object) ?

merci d'avance

 

 

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut bred!

 

J'ai voulu dans un de mes lisp stocker aussi des sélections, mais le

hic était que ma liste de sélection est très grande, en tout cas supérieur à 128,

limite du nombre de sélection, donc je stocke ceci à la place:

(
 ( < Nom d'entité: xxxxx > < Nom d'entité: xxxxx > < Nom d'entité: xxxxx > ...)
 ( < Nom d'entité: xxxxx > < Nom d'entité: xxxxx > < Nom d'entité: xxxxx > ...)
)

 

Mais ceci fait référence à la ram, donc je pense qu'il faudra stocker les handel ou les oid.

 

Par contre je le sauvegardai dans une variable, pas en Ldata, je pense qu'une sélection utilise

des références ram, donc si tu fermes le dessin, le rouvre, ben ton fichier aura une autre plage

d'adresse mémoire en ram, donc autocad te bloque surement pour cela. Si c'est vraiment le cas,

c'est très bien fait :cool: , y a pas que des bourdes dans totocad ;)

 

Purée, il manque des trucs dans les parenthèses!!

 

[Edité le 22/7/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

 

 

Pourquoi des ldatas ?

 

Les jeux de sélection ne seront pas conservés à la fermeture du dessin.

 

Si c'est bien pour être utiliser dans la même session, des variables globales devraient suffire.

 

Quand au ldatas, j'ai lu à plusieurs endroits qu'ils étaient déconseillés (données uniquement récupérable en LISP et passage douteux d'une version à une autre) et qu'il fallait leur préférer les dictionnaires, xrecords et xdatas. De mon côté je les utilise et n'ai jamais eu de problème...

 

 

Mais j'ai un peu décortiqué les ldatas qui ressemblent beaucoup aux dictionnaires et je n'ai jamais réussi à mette un jeu de sélection dans un xrecord.

 

 

Je m'étais même essayé à faire l'équivalent des fonctions vlax-ldata

 

 

;; gc:DictDataPut
;;
;; Stocke une liste de données dans un dictionnaire
;;
;; Arguments :
;; dict : le nom du dictionnaire (chaine) ou de l'object (ename)
;; key : la clé de l'entée du dictionnaire (chaine)
;; data : la liste de données (chaine, entier, réel, point)

(defun gc:DictDataPut (name key data / dict lst xrec typ)
 (if
   (or
     (and
(= (type name) 'STR)
(snvalid name)
(or
  (and
    (dictsearch (namedobjdict) name)
    (setq
      dict (cdr (assoc -1 (dictsearch (namedobjdict) name)))
    )
  )
  (setq	dict
	 (dictadd
	   (namedobjdict)
	   name
	   (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))
	 )
  )
)
     )
     (and
(or
  (= (type name) 'ENAME)
  (and
    (= (type name) 'VLA-OBJECT)
    (setq name (vlax-vla-object->ename name))
  )
)
(or (setq
      dict (cdr	(assoc 360
		       (member '(102 . "{ACAD_XDICTIONARY")
			       (entget name)
		       )
		)
	   )
    )
    (and
      (setq
	dict (entmakex
	       '((0 . "DICTIONARY") (100 . "AcDbDictionary"))
	     )
      )
      (entmod (append (entget name)
		      (list '(102 . "{ACAD_XDICTIONARY")
			    (cons 360 dict)
			    '(102 . "}")
		      )
	      )
      )
    )
)
     )
   )
    (if (snvalid key)
      (progn
 (or (listp data) (setq data (list data)))
 (foreach d data
   (setq typ (type d))
   (cond
     ((= typ 'STR) (setq lst (cons (cons 1 d) lst)))
     ((= typ 'INT) (setq lst (cons (cons 70 d) lst)))
     ((= typ 'REAL) (setq lst (cons (cons 40 d) lst)))
     ((and (listp d) (<= 2 (length d) 3) (vl-every 'numberp d))
      (setq lst (cons (cons 10 d) lst))
     )
   )
 )
 (and (setq xrec (dictsearch dict key))
      (entdel (cdr (assoc -1 xrec)))
 )
 (if lst
   (progn
     (dictadd
       dict
       key
       (entmakex
	 (append
	   (list '(0 . "XRECORD")
		 '(100 . "AcDbXrecord")
	   )
	   (reverse lst)
	 )
       )
     )
     (reverse (mapcar 'cdr lst))
   )
 )
      )
      (princ (strcat "\nClé non valide: " key))
    )
    (princ "\nNom ou objet non valide.")
 )
)

;; gc:DictDataList
;;
;; Liste les données des entrées d'un dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine) ou de l'object (ename)

(defun gc:DictDataList (name / dict elst lst)
 (if (or
(and
  (= (type name) 'STR)
  (dictsearch (namedobjdict) name)
  (setq dict (dictsearch (namedobjdict) name))
)
(and
  (or
    (= (type name) 'ENAME)
    (and
      (= (type name) 'VLA-OBJECT)
      (setq name (vlax-vla-object->ename name))
    )
  )
  (setq
    dict (entget
	   (cdr	(assoc 360
		       (member '(102 . "{ACAD_XDICTIONARY")
			       (entget name)
		       )
		)
	   )
	 )
  )
)
     )
   (progn
     (setq elst (vl-member-if
	   (function (lambda (x) (= (car x) 3)))
	   dict
	 )
     )
     (while elst
(setq lst  (cons
	     (cons (cdar elst)
		   (mapcar
		     'cdr
		     (cdr
		       (vl-member-if
			 (function (lambda (x) (= (car x) 280)))
			 (entget (cdadr elst))
		       )
		     )
		   )
	     )
	     lst
	   )
      elst (cddr elst)
)
     )
     (reverse lst)
   )
 )
)

;; gc:DictDataDelete
;;
;; Supprime une entée dans un dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine) ou de l'object (ename)
;; key : la clé de l'entée du dictionnaire (chaine)

(defun gc:DictDataDelete (name key / dict xrec)
 (if (or
(and
  (= (type name) 'STR)
  (dictsearch (namedobjdict) name)
  (setq dict (cdr (assoc -1 (dictsearch (namedobjdict) name))))
)
(and
  (or
    (= (type name) 'ENAME)
    (and
      (= (type name) 'VLA-OBJECT)
      (setq name (vlax-vla-object->ename name))
    )
  )
  (setq
    dict (cdr (assoc 360
		     (member '(102 . "{ACAD_XDICTIONARY")
			     (entget name)
		     )
	      )
	 )
  )
)
     )
   (if	(setq xrec (dictsearch dict key))
     (entdel (cdr (assoc -1 xrec)))
   )
 )
)

;; gc:DictDataGet
;;
;; Retourne la liste de données de l'entrée du dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine) ou de l'object (ename)
;; key : la clé de l'entée du dictionnaire (chaine)

(defun gc:DictDataGet (name key / dict xrec)
 (if (or
(and
  (= (type name) 'STR)
  (dictsearch (namedobjdict) name)
  (setq dict (cdr (assoc -1 (dictsearch (namedobjdict) name))))
)
(and
  (or
    (= (type name) 'ENAME)
    (and
      (= (type name) 'VLA-OBJECT)
      (setq name (vlax-vla-object->ename name))
    )
  )
  (setq
    dict (cdr (assoc 360
		     (member '(102 . "{ACAD_XDICTIONARY")
			     (entget name)
		     )
	      )
	 )
  )
)
     )
   (if	(setq xrec (dictsearch dict key))
     (mapcar
'cdr
(cdr
  (vl-member-if (function (lambda (x) (= (car x) 280))) xrec)
)
     )
   )
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

Merci pour vos conseils !

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité