Aller au contenu

Routine Attributs vers XDATAs


Messages recommandés

Posté(e)

 

Hello Mrs les Pros du Lisp / V-Lisp

 

SVP Pour un probleme SIG, je desire une routine qui copierait le contenu des attributs de tous les blocs selectionnes dans une application XDATA nomme par exemple "B2XD" (ou autre nom) et remplirait bien sur N champs XDATAs de l'application XDATA avec le contenu des N attributs !

 

Dans un manuel MapInfo on trouve le bout de code suivant

qui bien sur ne fonctionne pas : :casstet:

 

(regapp B2XD )

(setq jeu (ssget X '((0 . INSERT ))))

(if jeu

(progn

(setq n 0)

(while (setq blk (ssname jeu n))

(setq e (entnext blk))

(setq ent (entget e))

(setq data nil)

(while (/= SEQEND (cdr (assoc 0 ent)))

(setq ETIQ (cdr (assoc 2 ent)))

(setq contenu (cdr (assoc 1 ent)))

(setq data (cons (cons 1000 (strcat etiq contenu)) data))

(setq e (entnext e))

(setq ent (entget e))

) ; while

(setq data (cons (cons 1002 } ) data))

(setq data (reverse data))

(setq data (cons (cons 1002 { ) data))

(setq exdata (list (list -3 (cons B2XD data))))

(setq entblk (entget blk))

(setq newent (append entblk exdata))

(entmod newent)

(setq n (1+ n))

) ; while

) ; progn

(alert Pas de blocs )

) ; if jeu

(princ)

 

Pour ceux qui ne connaissent pas les XDATAs (apparus avec AutoCAD R11),

essayez les commandes XDATA et XDLIST

 

Il faut que les routines Bonus/Express soient installees !

( Regardez le source du fichier "XDATA.LSP" du sous-catalogue "EXPRESS" )

 

Merci d'avance, Le Decapode

 

PS: Il manque des guillemets en fin de routine sur le Alert

mais je ne suis pas sur que cette correction soit suffisante !

 

 

 

 

[Edité le 15/9/2006 par lecrabe]

Autodesk Expert Elite Team

Posté(e)

Bonjour le Décapode qui se mélange les pinces

 

J'étais juste en train de lire cet article.

 

Peut être que ça peut t'aider

 

Amicalement

 

Zebulon_

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut Lecrabe

Il est possible de faire quelque chose, mais pourquoi des xdatas et pas un dictionnaire ?

De plus les xdatas doivent être rattachés à des entités, ce qui est déjà le cas pour des attributs (rattaché à un bloc)

Ce qui fait que je ne comprends pas ce que tu souhaites faire exactement et où tu veux en venir ?

 

Le Patrick_35 interrogatif

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonsoir,

 

Le principal de l'exemple est bon et fonctionne en remettant les guillemets "Zappés"....

 

Corrigé ça donne ça :

 

(regapp "B2XD")
(setq jeu (ssget "_X" '((0 . "INSERT"))))
(if jeu
(progn
(setq n 0)
(while (setq blk (ssname jeu n))
(setq e (entnext blk))
(setq ent (entget e))
(setq data nil)
(while (/= "SEQEND" (cdr (assoc 0 ent)))
(setq ETIQ (cdr (assoc 2 ent)))
(setq contenu (cdr (assoc 1 ent)))
(setq data (cons (cons 1000 (strcat etiq " " contenu)) data))
(setq e (entnext e))
(setq ent (entget e))
) ; while
(setq data (cons (cons 1002 "}") data))
(setq data (reverse data))
(setq data (cons (cons 1002 "{") data))
(setq exdata (list (list -3 (cons "B2XD" data))))
(setq entblk (entget blk))
(setq newent (append entblk exdata))
(entmod newent)
(setq n (1+ n))
) ; while
) ; progn
(alert "Pas de blocs")
) ; if jeu
(princ)

 

Cependant j'ai déja remarqué que (entmod) ne fonctionne pas sur des atributs placés dans un calque verrouillé, alors attention honorable "Décapode"

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

 

Bonjour

 

Merci à tous, en fait c'est pour un prog qui relit correctement les XDATAs dans un dessin AutoCAD (Car cela existe depuis la version R11) mais qui n'est pas capable de comprendre les attributs et donc leur contenu ! :o

 

Grand merci à Bonuscad qui m'a corrigé la routine avec efficacité ! :)

J'avais bien trouvé à plusieurs endroits le manque de Guillemets mais pas partout ! :casstet:

 

SVP puis je vous demander une 2 petites améliorations :

 

- 1 - Demander le nom de l'application XDATA, pas forcement "B2XD"

 

Actuellement cette routine traite TOUS les .INSERT

- 2 - Je désire avoir le choix, soit TOUS les blocs, soit une sélection

 

Encore Merci à tous les Pro du Lisp, V-Lisp, VBA, C++ et DOT.NET sur AutoCAD.

Le Decapode (XDATAnt)

 

Autodesk Expert Elite Team

Posté(e)

Voilà, ça devrait marcher (pas testé)

 

On peut enlever les espaces après les "" mais c'est juste une question d'esthétique aucune incidence sur le fonctionnement.

 

(defun c:b2xd
      (/ app jeu n blk e ent data etiq contenu exdata entblk newent)
 (setq app (getstring "\nSpécifiez le nom de l'application : "))
 (if (or (not app) (= app ""))
   (setq app "B2XD")
 )
 (regapp app)
 (prompt "\nSélectionnez les blocs ou ")
 (if (not (setq jeu (ssget '((0 . "INSERT")))))
   (setq jeu (ssget "_X" '((0 . "INSERT"))))
 )
 (if jeu
   (progn
     (setq n 0)
     (while (setq blk (ssname jeu n))
(setq e (entnext blk))
(setq ent (entget e))
(setq data nil)
(while (/= "SEQEND" (cdr (assoc 0 ent)))
  (setq etiq (cdr (assoc 2 ent)))
  (setq contenu (cdr (assoc 1 ent)))
  (setq data (cons (cons 1000 (strcat etiq " " contenu)) data))
  (setq e (entnext e))
  (setq ent (entget e))
)				; while
(setq data (cons (cons 1002 "}") data))
(setq data (reverse data))
(setq data (cons (cons 1002 "{") data))
(setq exdata (list (list -3 (cons app data))))
(setq entblk (entget blk))
(setq newent (append entblk exdata))
(entmod newent)
(setq n (1+ n))
     )					; while
   )					; progn
   (alert "Pas de blocs")
 )					; if jeu
 (princ)
) 

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

Posté(e)

Cependant j'ai déja remarqué que (entmod) ne fonctionne pas sur des atributs placés dans un calque verrouillé

 

Outre ceci, ce code ne fonctionne que pour des blocs parent (1er niveau d'imbrication) des attributs imbriqués à un second niveau ne sont pas traités.

 

On pourrait affiner le cas échant le filtre de sélection:

-> les espaces courant Model et Onglet Papier.

-> rajouter le '(66 . 1) pour avoir que des blocs avec attributs non-constants

-> écarter les XRef du jeu de sélection (traitement inutile d'entités "INSERT")

 

Voilà les écueils de ce code présenté en exemple et les possibilités qu'il peut avoir sans trop de modifications.i

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

des attributs imbriqués à un second niveau ne sont pas traités

 

Mais des attributs imbriqués ne sont plus éditables, ils sont comme des attributs constants, ou je me trompe ?

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

Posté(e)

ne sont plus éditables

 

On ne cherche pas à les éditer :exclam:

 

Je penses que si des attributs enfants existe, ils peut être interressant ou util d'inscrire les infos en Xdata, car si elles existent c'est que les infos sont à priori nescessaire pour une identication avec un outil SIG...

 

Lecrabe le prendra avec des pince(ttes) car le but de l'écriture n'est pas révélé, seul lui sait ce qu'il veut faire de ces infos.... ;)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

On ne cherche pas à les éditer

 

J'ai bien compris, mais comme, d'un autre côté, tu proposes d'affiner le filtre pour n'avoir que les blocs contenant des attributs non constants ...

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

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é