Aller au contenu

Modifier des Xdata


bonuscad

Messages recommandés

Bonsoir,

 

Il m'arrive parfois d'avoir besoin de modifier des valeurs d' XData.

Les Express Tools ont bien des outils pour Créer/Rajouter et Lister des XDatas, mais rien pour modifier celle-ci.

 

Le Problème majeur c'est que l'on peut avoir par exemple plusieurs valeur d'XData concernant les réels, mais qu'on veuille en modifier une bien précise (donc (subst) ne convient pas dans ce cas là). Il faut indexer les valeur pour pouvoir changer la bonne.

 

Je me suis pencher sur le problème aujourd'hui, car cet outil me manquait.

Voici le code en beta test qui me semble répondre à ce besoin.

Il demande de bien connaitre la struture des XData pour pouvoir l'utiliser (il n'y a pas par exemple pour les handles de contrôle de validité), donc à utiliser si l'on sait ce qu'on veut faire.

L'index commence à 0 pour le premier élément.

 

Si (gile) nous ponds quelque chose de plus abouti, et bien c'est bien volontier. ;)

 

Pour moi ce code me suffit, mais je reconnais qu'il est assez sommaire.

 

(defun c:modif_xdata ( / js ent xd_list e_data el msg what new nw_data)
 (setq namapp (getstring "\nNom de l'application ?: "))
 (while (not (setq js (ssget "_+.:E:S" (list '(0 . "*") (cons -3 (list (list namapp))))))))
 (setq
   ent (entget (ssname js 0) (list namapp))
   xd_list (cdr (assoc -3 ent))
   e_data (cdr (car xd_list)) el '(0)
 )
 (repeat (1- (length e_data)) (setq el (cons (1+ (car el)) el)))
 (setq msg "")
 (initget (foreach n (setq el (mapcar 'itoa el)) (setq msg (strcat n " " msg))))
 (setq msg "")
 (setq msg (strcat "\nElément à modifier? [" (foreach n el (setq msg (strcat n "/" msg)))  "]"))
 (print e_data)
 (setq what (getkword msg))
 (princ "\nRemplacer ")
 (princ (cdr (nth (atoi what) e_data)))
 (princ " par -> ")
 (cond
   ((member (car (nth (atoi what) e_data)) '(1000 1003 1005))
     (setq new (cons (car (nth (atoi what) e_data)) (getstring " nouvelle chaine: ")))
   )
   ((member (car (nth (atoi what) e_data)) '(1040 1041 1042))
     (initget 1)
     (setq new (cons (car (nth (atoi what) e_data)) (getreal " nouvelle valeur réelle: ")))
   )
   ((member (car (nth (atoi what) e_data)) '(1070 1071))
     (initget 1)
     (setq new (cons (car (nth (atoi what) e_data)) (getint " nouvelle valeur entière: ")))
   )
   ((member (car (nth (atoi what) e_data)) '(1010 1011 1012 1013))
     (initget 1)
     (setq new (cons (car (nth (atoi what) e_data)) (getpoint " nouveau vecteur: ")))
   )
   (T
     (princ "\nNe peut changer ce type d'élément !")
     (setq new (nth (atoi what) e_data))
   )
 )
 (setq nw_data '())
 (foreach n el (if (eq n what) (setq nw_data (cons new nw_data)) (setq nw_data (cons (nth (atoi n) e_data) nw_data))))
 (entmod (append (entget (ssname js 0)) (list (cons -3 (list (cons (caar xd_list) nw_data))))))
 (prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

 

J'ai essayé de relever le défi, je trouvais le problème amusant.

 

 

L'interface est une boite de dialogue créée 'à la volée' en fonction des données étendues de l'entité et de l'application. la validité des données est contrôlée.

 

Le choix de l'application est automatique s'il n'y en a qu'une ou se fait dans une liste déroulante.

 

La modification des données se fait par saisie dans les cases de texte ou à l'écran (point, vecteur, angle, distance, calque, handle)

 

 

(defun c:xdedit	(/
	 ;; fonctions
	 writeDcl xdEditDlg
	 ;; variables
	 appName ent elst xdata)

 ;;-------------------------- sous-routines --------------------------;;

 ;; writeDcl
 ;; Ecrit le DCL dans un fichier temporaire en fonction des xdatas
 ;; Retourne une liste : (fichier liste_clés_text_box liste_clés_button)

 (defun writeDcl (/
	   ;; fonctions
	   writeTextBox	writeTextBoxAndButton
	   ;; variables
	   tmp file cnt	code tKeys bKeys tk bk)

   ;; writeTextBox
   (defun writeTextBox	(code key)
     (write-line
(strcat
  ":edit_box{label="
  (vl-prin1-to-string code)
  ";key="
  (vl-prin1-to-string key)
  ";allow_accept=true;}"
)
file
     )
   )

   ;; writeTextBoxAndButton
   (defun writeTextBoxAndButton (code tk bk)
     (write-line
(strcat
  ":row{:edit_box{label="
  (vl-prin1-to-string code)
  ";key="
  (vl-prin1-to-string tk)
  ";allow_accept=true;}"
  ":button{label=\">>\";width=4;fixed_width=true;key="
  (vl-prin1-to-string bk)
  ";}}"
)
file
     )
   )

   ;;-------------------------------------------------------------------;;

   (setq tmp  (vl-filename-mktemp "Tmp.dcl")
  file (open tmp "w")
  cnt  -1
   )
   (write-line
     (strcat
"xdEdit:dialog{label=\"Edition de données étendues\";width=42;"
":text{label="
(vl-prin1-to-string (strcat "Application enregistrée : " appName))
";}spacer;:boxed_column{label=\"Données étendues\";"
     )
     file
   )
   (foreach x xdata
     (setq code (car x)
    cnt	 (1+ cnt)
     )
     (cond
((= 1002 code) (write-line (strcat ":text{label=\"1002     \\" (cdr x) "\";}") file))
((member code '(1000 1042 1070 1071))
 (setq tKeys (cons (setq tk (strcat (itoa cnt) "_txt_" (itoa code))) tKeys))
 (writeTextBox (itoa code) tk)
)
((member code '(1003 1005 1010 1011 1012 1013 1040 1041))
 (setq tKeys (cons (setq tk (strcat (itoa cnt) "_txt_" (itoa code))) tKeys)
       bKeys (cons (setq bk (strcat (itoa cnt) "_btn_" (itoa code))) bKeys)
 )
 (writeTextBoxAndButton (itoa code) tk bk)
)
     )
   )
   (write-line "}spacer;ok_cancel;}" file)
   (close file)
   (list tmp (reverse tKeys) (reverse bKeys))
 )

 ;;-------------------------------------------------------------------;;

 ;; xdEditDlg
 ;; Boite de dialogue de modification des xdatas
 ;; Retourne le résultat : 1 = OK, 0 = Annuler

 (defun xdEditDlg (/
	    ;; fonctions
	    xdSubst action
	    ;; variables
	    tmp	tKeys bKeys dcl_id status klst key keys	val)

   ;; xdSubst
   ;; Remplace la valeur dans la donnée étendue
   (defun xdSubst (key val / klst)
     (setq klst (gc:str2lst key "_"))
     (setq xdata (gc:substAt (cons (atoi (caddr klst)) val) (atoi (car klst)) xdata))
   )

   ;; action
   ;; change la donnée étendue ou retourne un message
   (defun action (key val msg / klst)
     (setq klst (gc:str2lst key "_"))
     (if val
(xdSubst key val)
(progn
  (alert msg)
  (mode_tile key 2)
)
     )
   )

   ;;-------------------------------------------------------------------;;

   (setq keys	 (writeDcl)
  tmp	 (car keys)
  tKeys	 (cadr keys)
  bKeys	 (caddr keys)
  dcl_id (load_dialog tmp)
  status 2
   )
   (while (< 1 status)
     (or (new_dialog "xdEdit" dcl_id) (exit))
     (foreach k tKeys
(setq klst (gc:str2lst k "_"))
(set_tile k
	  (cond
	    ((wcmatch (caddr klst) "101#")
	     (gc:lst2str (mapcar 'rtos (cdr (nth (atoi (car klst)) xdata))) ",")
	    )
	    ((wcmatch (caddr klst) "104#") (rtos (cdr (nth (atoi (car klst)) xdata))))
	    ((wcmatch (caddr klst) "107#") (itoa (cdr (nth (atoi (car klst)) xdata))))
	    (T (cdr (nth (atoi (car klst)) xdata)))
	  )
)
(action_tile
  k
  (cond
    ((wcmatch (caddr klst) "101#")
     "(action $key (gc:toPoint $value) \"Nécessite un point valide\")"
    )
    ((wcmatch (caddr klst) "104#")
     "(action $key (distof $value) \"Nécessite un nombre réel valide\")"
    )
    ((= (caddr klst) "1070")
     "(action $key (gc:toInt16 $value) \"Nécessite un nombre entier entre -32768 et 32767\")"
    )
    ((= (caddr klst) "1071")
     "(action $key (gc:toInt32 $value) \"Nécessite un nombre entier entre -2147483648 et 2147483647\")"
    )
    ((= (caddr klst) "1003")
     (vl-prin1-to-string
       '(if
	 (tblsearch "LAYER" $value)
	 (xdSubst $key $value)
	 (progn
	  (alert "Nécessite un nom de calque valide")
	  (mode_tile $key 2)
	 )
	)
     )
    )
    ((= (caddr klst) "1005")
     (vl-prin1-to-string
       '(if
	 (handent $value)
	 (xdSubst $key $value)
	 (progn
	  (alert "Nécessite un maintient (handle) valide")
	  (mode_tile $key 2)
	 )
	)
     )
    )
    ("(xdSubst $key $value)")
  )
)
     )
     (foreach k bKeys
(setq klst (gc:str2lst k "_"))
(action_tile
  k
  (strcat "(setq key $key) (done_dialog "
	  (cond
	    ((= (caddr klst) "1003") "3)")
	    ((= (caddr klst) "1005") "4)")
	    ((= (caddr klst) "1040") "5)")
	    ((= (caddr klst) "1041") "6)")
	    ((member (caddr klst) '("1010" "1011")) "7)")
	    ((member (caddr klst) '("1012" "1013")) "8)")
	  )
  )
)
     )
     (action_tile "cancel" "(done_dialog 0)")
     (action_tile "ok" "(done_dialog 1)")
     (setq status (start_dialog))
     (cond
((= status 3)
 (if (setq val (car (entsel "\nSélectionnez une entité sur le calque voulu: ")))
   (xdSubst key (cdr (assoc 8 (entget val))))
 )
)
((= status 4)
 (if (setq val (car (entsel "\nSélectionnez l'entité pour le 'handle' voulu: ")))
   (xdSubst key (cdr (assoc 5 (entget val))))
 )
)
((= status 5)
 (initget "Angle Distance")
 (setq opt
	(cond
	  ((getkword "\nChoisissez une option [Angle/Distance] <D>: "))
	  ("Distance")
	)
 )
 (if (= opt "Angle")
   (if (setq val (getangle "\nSpécifiez un angle: "))
     (xdSubst key val)
   )
   (if (setq val (getdist "\nSpécifiez une distance: "))
     (xdSubst key val)
   )
 )
)
((= status 6)
 (if (setq val (getdist "\nSpécifiez une distance "))
   (xdSubst key val)
 )
)
((= status 7)
 (if (setq val (getpoint "\nSpécifiez un point : "))
   (xdSubst key val)
 )
)
((= status 8)
 (if (setq val (gc:getVector))
   (xdSubst key val)
 )
)
     )
   )
   (unload_dialog dcl_id)
   (vl-file-delete tmp)
   status
 )

 ;;----------------------- fonction principale -----------------------;;

 (sssetfirst nil nil)
 (if (setq ent (car (entsel)))
   (if	(setq apps (mapcar 'car (setq xdata (cdr (assoc -3 (entget ent '("*")))))))
     (if (= 1 (length apps))
(setq appName (caar xdata)
      xdata   (cdar xdata)
)
(if (setq appName (gc:ListBox "Applications enregistrées" nil (mapcar 'cons apps apps) 0))
  (setq xdata (cdr (assoc appName xdata)))
)
     )
   )
   (alert "Cette entité n'a pas de données étendues")
 )
 (if (and xdata (= 1 (xdEditDlg)))
   (entmod (append (entget ent) (list (list -3 (cons appName xdata)))))
 )
 (princ)
)

;;----------------------------- routines -----------------------------;;

;; gc:str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
(defun gc:str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
  (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

;;-------------------------------------------------------------------;;

;; gc:lst2str
;; Concatène une liste et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur
(defun gc:lst2str (lst sep)
 (if (cdr lst)
   (strcat (car lst)
    sep
    (gc:lst2str (cdr lst) sep)
   )
   (vl-princ-to-string (car lst))
 )
)

;;-------------------------------------------------------------------;;

;; gc:SubstAt
;; Remplace l'élément à l'indice dans la liste
;;
;; Arguments
;; ele : l'élément à remplacer
;; ind : l'indice
;; lst la liste
(defun gc:SubstAt (ele ind lst)
 (cond
   ((null lst) nil)
   ((zerop ind) (cons ele (cdr lst)))
   ((cons (car lst) (gc:SubstAt ele (1- ind) (cdr lst))))
 )
)

;;-------------------------------------------------------------------;;

;; gc:toInt16
;; Convertit une chaîne en un entier codé sur 16 bits (nil en cas d'echec)
;;
;; Argument
(defun gc:toInt16 (str / num)
 (if
   (and
     (setq num (distof str))
     (= num (fix num))
     (<= -32768 num 32767)
   )
    (fix num)
 )
)

;;-------------------------------------------------------------------;;

;; gc:toInt32
;; Convertit une chaîne en un entier codé sur 32 bits (nil en cas d'echec)
(defun gc:toInt32 (str / num)
 (if
   (and
     (setq num (distof str))
     (= num (fix num))
     (<= -2147483648 num 2147483647)
   )
    (fix num)
 )
)

;;-------------------------------------------------------------------;;

;; gc:toPoint
;; Convertit une chaîne en un point 3d (nil en cas d'echec)
(defun gc:toPoint (str / pt)
 (if (vl-every 'numberp (setq pt (mapcar 'distof (gc:str2lst str ","))))
   (cond
     ((= 2 (length pt)) (list (float (car pt)) (float (cadr pt)) 0.0))
     ((= 3 (length pt)) (mapcar 'float pt))
   )
 )
)

;;-------------------------------------------------------------------;;

;; gc:getVector
;; Retourne le vecteur spécifié
(defun gc:getVector (/ p1 p2)
 (setq	p1 (cond
     ((getpoint "\nSpécifiez le point de départ <0,0,0>: "))
     ('(0. 0. 0.))
   )
 )
 (if (setq p2 (getpoint p1 "\nSpécifiez l'extrémité: "))
   (mapcar '- p2 p1)
 )
)

;;-------------------------------------------------------------------;;

;; gc:ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;;        1 = liste choix unique
;;        2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
(defun gc:ListBox (title msg keylab flag / tmp file dcl_id choice)
 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat "ListBox:dialog{label=\"" title "\";")
   file
 )
 (if (and msg (/= msg ""))
   (write-line (strcat ":text{label=\"" msg "\";}") file)
 )
 (write-line
   (cond
     ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
     ((= 1 flag) "spacer;:list_box{key=\"lst\";")
     (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
   )
   file
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ListBox" dcl_id))
   (exit)
 )
 (start_list "lst")
 (mapcar 'add_list (mapcar 'cdr keylab))
 (end_list)
 (action_tile
   "accept"
   "(or (= (get_tile \"lst\") \"\")
   (if (= 2 flag) (progn
   (foreach n (str2lst (get_tile \"lst\") \" \")
   (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)))
   (setq choice (reverse choice)))
   (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

  • Like 1

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Bonuscad et Gilles

 

Tout d'abord MERCI a vous deux ! :)

 

C Super, la routine de Bonuscad est "plus frustre", ce n'est pas pejoratif ;)

et demande le nom de la Registered App ! Mais ca fonctionne !

 

C Magnifique, je viens de tester plus a fond la version de Gilles

sur un dessin de cadastre EDIGEO avec souvent 2 Registered App par entite

et ca marche Nickel-Chrome :D

 

Comment se faire un micro-SIG sans utiliser les Object Data de MAP / CIVIL

C penible mais ca serait possible avec pas mal de dev ...

 

Bon d'accord, il faudrait beaucoup plus, par exemple :

- Vue Tableau avec Selection de 1/N XDATA et Zoom sur le/les entite(s) concernee(s)

- requetes simples sur les XDATA pour selectionner les entites correspondantes

- Extraction des proprietes graphiques (comme AutoCAD) + contenu des XDATA interessantes en CSV / Excel

- etc

 

C beau de rever ... mais a mon avis il vaut mieux acheter un MAP ou un CIVIL !

 

Beau Boulot, les Gars, MERCI, Le Decapode

 

PS: Tests realises sur MAP 2004

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Merci lecrabe (et bonuscad), je me suis bien amusé à écrire cette routine.

 

lili2006,

Il est possible d'attacher des données (texte, nombres entiers ou réels, points, vecteurs) aux objets AutoCAD sous forme de données étendues (xdata).

On peut le faire par programmation ou avec des routines comme XDATA des ExpressTools (XDLIST pour lire les données).

Chaque donnée est stockée sous forme de paire pointée avec un code de groupe :

1000 = chaine de caractères

1001 = nom d'application enregistrée

1002 = accolades

1010 = point (liste de 3 réels)

1011 = point (position)

1012 = vecteur 3d (déplacement)

1013 = vecteur 3d (direction)

1040 = nombre réel

1041 = nombre réel (distance)

1042 = nombre réel (facteur d'échelle)

1070 = entier codé sur 16 bits (-32769

1071 = entier codé sur 32 bits (-2147483649

 

Les routines ci-dessus servent à modifier les xdatas attachées à l'objet sélectionné.

 

NOTA : certaines données sont liées à l'entité et automatiquement mises à jour quand l'entité est modifiée (1011, 1041, 1042)

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Quand on pense qu'Autodesk a concu cette usine a gaz lors de la sortie d'AutoCAD R11 !

Je n'ai jamais compris pourquoi ils avaient fait AUSSI complique !?

Pourquoi ne pas s'inspirer des attributs sur les blocs, cela aurait ete plus simple et conviviale ?

 

La R11 a aussi amene le developpement en ADS (grosse revolution)

et la R13 (la plus mauvaise version d'AutoCAD) le developpement en ARX

http://georezo.net/forum/viewtopic.php?id=44042

 

Enfin malheureusement il faut vivre avec et heureusement que des logiciels comme SAFE-FME, MAPINFO, ARCVIEW savent tres bien (en general) lire/ecrire les XDATAS :)

 

Bonne nuit, le Decapode

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile)

 

je me suis bien amusé à écrire cette routine.

 

Ravi que tu ais apprécier le défi.

 

C'est sur que cela change de ma version très basique (frustre ;) )

 

Au 1er essai, malgré que cela fonctionne (pas de bug) j'ai voulu changé une donnée 1040 par saisie graphique et il m'a bien donné la main mais avec un (getangle), je m'attendais plutôt à un (getdist), alors bien sur la valeur retourné est une valeur en radian. (un oubli, un copier-coller non modifié ?)

 

Voila un outil bien spacieux d'utilisation, les ExpressTools peuvent aller se rhabiller ! ;)

 

Chapeaux l'artiste et merci beaucoup de cet outil, même si je pouvais me contenter du mien.

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

Lien vers le commentaire
Partager sur d’autres sites

J'ai peut-être été un peu trop pointilleux sur les groupes et le type de valeurs qu'ils contiennent.

J'avais réservé le groupe 1041 pour les distances.

 

J'ai modifié le code, quand l'utilisateur prend la main pour un groupe 1040, il a le choix entre Angle et Distance.

 

PS : je vais peut-être entièrement revoir ma copie à cause d'un problème d'affichage si la liste des xdatas est trop longue...

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Yeah c comme avec ton excellente routine "XDA.lsp" qui permet de consulter les XDATAs avec un DCL construit a la volee, si le nombre de Registered App et/ou le nombre de XDATAs est trop important, on est mal !

 

(getvar "screensize") permet d'obtenir la resolution de la partie graphique AutoCAD

mais bon c limite car en fait le probleme c la resolution verticale disponible et aujourd'hui avec les ecrans "grande largeur" des portables, on a souvent seulement 768 ou 800 ou 864 ou 900 ou 1024 pixels ... et donc on est vite limite !

 

En fait il faudrait un melange ou fusion de XDEDIT et de XDA (pour avoir dans la meme routine la consultation et la modification) qui detecte la "grosseur" des XDATAs pour les presenter en UNE page DCL ou eventuellement en N pages DCL !

 

A mon avis, il y a un peu "beaucoup" de boulot !

 

Le Decapode

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

A mon avis, il y a un peu "beaucoup" de boulot !

 

Et on peut toujours en rajouter... ;)

 

Par exemple pour les saisies graphiques par getdist getpoint getangle récupérer celle-ci dans une entité sélectionné (longueur, surface, point de définition, rotation et j'en oublie)

 

(gile) Ce n'est pas une incitation, je n'ai pas besoin personnellement de tels possibilités.

 

Je pense que les Xdata dans l'ensemble sont peu utilisés car pas (jusqu'à maintenant) d'outil très souples pour les manipuler, la quantité d'octet alloué est limité. (je ne pense pas qu'on puisse avoir beaucoup de pages et de pages à afficher avec un DCL).

 

Dans quelles occasions peut-on avoir ce besoin ?

Elles sont utiles surtout pour ceux qui font du développement, autrement elles n'ont pas beaucoup d'intérêt. Généralement celui qui les utilise doit être capable de les exploiter par programmation, c'est le but. Elle sont très structurées séquentiellement donc seul celui qui les a introduites est capable de les exploiter car un utilisateur lambda sera être incapable d'identifier la structure et de comprendre les valeurs affectées et à quoi elles peuvent correspondre.

Bien sur on pourrait les commenter, mais comme la taille est limité, on évite de les commenter pour s'attribuer le maximum de place aux données.

 

C'est un peu comme si tu essayais de comprendre une liste retourné par (entget) et que tu n'as aucune documentation sur les codes DXF et que tu n'y connais rien. Tu risque de perdre beaucoup de temps à comprendre :P

 

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Merci pour ta réponse Bonuscad,

 

J'ai posé cette question car sur autre sujet Bred m'avait branché sur une application en xdata que je voulais faire (micro SIG) sur le plan d'un cimetière. Et ça avait plutôt bien marché pour ce que je voulais faire ,...Il faudrait que je rebosse le truc pour voir,..

 

J'ai testé le lisp de (gile) en attribuant des Xdatas depuis les Express,...

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ne voyant pas bien comment résoudre le problème des liste trop longue en DCL, j'ai carrément changé mon fusil d'épaule et essayé quelque chose en .NET.

Boite de dialogue étirable avec barres de défilement quand la liste s'allonge.

 

J'en ai profité pour élargir les possibilités (pas tant dans le sens suggéré par bonuscad concernant la saisie des données).

 

En plus de modifier les xdatas existantes, il est possible d'en créer (ainsi que les applications) de nouvelles.

en gros plus besoin de commandes XDATA et XDLIST des Express Tools.

 

La commande unique s'appelle toujours XDEDIT.

 

Nouvelle version : ajout d'un contrôle d'appariement des accolades.

 

Nouvelle version (CF réponse #22)

 

Télécharger XdataEditor.zip

 

 

  • Like 1

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

Lien vers le commentaire
Partager sur d’autres sites

j'ai carrément changé mon fusil d'épaule et essayé quelque chose en .NET.

 

Ah ! On n'avait pas remarqué que t'avais changé ton fusil d'épaule dans le développement. ;)

 

En tout cas ta version lisp fonctionne aussi sous Briscad sous Linux, je l'ai testé.

 

(pas tant dans le sens suggéré par bonuscad concernant la saisie des données)

 

C'était pas une suggestion! C'était juste pour dire qu'il est toujours possible de vouloir encore plus de fonctionnalités. Pour moi tout va bien, l'outil de base répond à mon besoin.

 

En même temps pouvoir modifier simplement des Xdata n'est peut être pas une bonne chose pour celui qui les a mis en place, car généralement il y a aussi un développement derrière celles-ci.

Si on lui truicide sa base, ben y vas pas être content. :P

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

Lien vers le commentaire
Partager sur d’autres sites

Contrairement à ce que vous semblez dire, j'ai encore beaucoup de plaisir avec le LISP, et j'en ai eu à écrire le code ci dessus, même si j'ai pris la route la plus tordue avec des edit_box et, optionnellement, des buttons, à créer et contrôler 'à la volée'.

La voie list_box est très certainement plus facile.

 

Mais faire des boites de dialogue un peu sophistiquées avec Visual Studio est aussi très plaisant et surtout puissant (plus qu'ObjectDCL ou OpenDCL) Et, dès qu'un programme devient un peu touffu (ici pus de 700 lignes sans compter le code automatiquement généré par Visual Studio pour les descriptions de boites de dialogue) l'extrême rigueur de C# devient un atout.

 

 

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

Lien vers le commentaire
Partager sur d’autres sites

C'est qu'il se fâcherait notre gilou national ;)

Je me doute qu'il est plaisant de faire la même chose en .net, histoire de mieux maîtriser les boites de dialogues.

Si je prenais le temps d'approfondir, c'est ce que j'aurai fait, mais en 1er.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Puissant(s) !

 

Dans la version .NET, j'ai quand même une question :

Si je m'amuse à supprimer les accolades (le code 1002), je ne les retrouve plus en effet au renouvellement de la commande. Voilà qui est troublant.

Mais autant ma manip est stupide (ne sert pas à grand chose) autant je me demande comment ton programme peut ne pas s'en "offusquer".

Bref, j'ai quand même été troublé par le succès de ma manip (complètement) débile !?

 

Sinon, chapeau.

J'ai bien compris le code de la version .LSP et, comme d'hab', c'est limpide et propre.

Inutile de (me) montrer le code de la .NET, j'ai pas le temps de m'y mettre ce soir :cool:

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Dans la version .NET, j'ai quand même une question :

Si je m'amuse à supprimer les accolades (le code 1002), je ne les retrouve plus en effet au renouvellement de la commande. Voilà qui est troublant.

Mais autant ma manip est stupide (ne sert pas à grand chose) autant je me demande comment ton programme peut ne pas s'en "offusquer".

Bref, j'ai quand même été troublé par le succès de ma manip (complètement) débile !?

 

Je n'avais pas ajouté ce contrôle car, comme tu as pu le constater, AutoCAD ne s'en "offusque" pas non plus.

 

Mais tu as raison, alors je l'ai rajouté.

 

Nouvelle version : XdataEditor.zip

 

Pour ceux qui sont intéressés, le code source de la classe principale (sans le code généré par VisualStudio) est ici

  • Like 1

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

Excellente fonction qui va ravir les utilisateurs de données attributaires dans le monde du SIG (système d'informations Géographiques )et du SIB (système d'informations bâtimentaires).

 

J'aurai juste une petite requête,

1- Permettre le copier Windows dans la zone de liste peut-être par un menu contextuel sur 1 élément de la liste..

 

2- Il serait bien que s'affiche la valeur à modifier au dessus de l'intitulé de modification comme dans l'exemple ci-dessous :

Commande: XDEDIT
Valeur courante à modifier : NOMDEL=PARIS
Sélectionnez une entité:
Entrez un texte ou :

 

Afin de voir ou de copier coller pour rentrer la nouvelle valeur.

 

Merci,[Edité le 13/1/2011 par fabcad]

 

[Edité le 13/1/2011 par fabcad]

Lien vers le commentaire
Partager sur d’autres sites

Pour répondre à tes suggestions, j'ai un peu peaufiné l'histoire :

- menu contextuel et raccourcis clavier pour la liste de xdatas (y compris copier la valeur dans le presse papier).

- double clic pour modifier une xdata ou pour choisir un type de donnée (Ajouter)

- saisie des valeurs dans une boite de dialogue (l'ancienne valeur est affichée pour Modifier)

- version bilingue (français anglais) si le dossier 'en' est dans le même répertoire que la DLL.

 

J'ai mis le lien ci-dessus à jour.

 

 

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

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à toutes et tous,

 

Salut Gilles,

 

Si tu devais répondre à ce pb, comment ferais tu avec XdataEditor ?

 

A savoir, pouvoir renseigner quelques champs comme, par exemple (L'application est un micro SIG pour un cimetière).

 

Merci d'avance,

 

PS: J'ai regardé un peu mais mes connaissances sont bien trop maigre pour faire fonctionner cette appli,..

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

XDEDIT est juste une commande plus conviviale (et plus puissante) que XDATA et XDLIST des Express Tools.

Elle permet de voir, créer et modifier des données étendues. Mais les xdatas, comme le disait bonuscad, ne sont vraiment intéressantes que quand elles sont traitées par des programmes.

 

Pour résumer, XDEDIT ne répond qu'au 1) de ce que tu demandais ici.

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

Lien vers le commentaire
Partager sur d’autres sites

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é