Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
7 décembre 2012 5 07 /12 /décembre /2012 16:34

Autocad Map : Incompatibilité des tables de données dans les dessins ouverts, Conflit de données d'objet

 

Si vous connaissez le message :

Incompatibilité des tables de données dans les dessins ouverts.

Paramètre: CLASSNAME Valeur: A-NO

Paramètre: APPLNAME Valeur: ad

Erreur: 786433 - Incompatibilité des tables de données dans les dessins ouverts.

Paramètre: ERRCODE; Valeur: 786433.
 

Vous serez intéressé par cet article

 

Diagnostic : Est-ce que c’est grave ?

Le problème vu par les utilisateurs :

 

Une recherche approfondie sur le forum Autocad Map montre que ce problème est connu depuis la version 2002
Mais au lieu d'avoir attiré l'attention des développeur Autodesk, il n'a fait qu'empirer, jusqu'à être une véritable problème, sans solution avec la 2010 et il est devenu infernal avec la 2012.
Ci joint un certain nombre de thread à ce propos, le dernier est intéressant, car Rakesh Rao (voir lien pour fonctions ADE), qui n'est pas un novice sous Map, avoue ne pas trouver de solution, et surtout note des dysfonctionnements aléatoires de certains programmes :


http://discussion.autodesk.com/forums/t … dID=223419
http://discussion.autodesk.com/forums/t … p;#6120232
http://discussion.autodesk.com/forums/t … mp;#893189
http://discussion.autodesk.com/forums/t … p;#4468629
http://discussion.autodesk.com/forums/t … p;#2288136

 

 

 

Il y a également quelqu’un qui a remarqué que lorsque Map a rencontré ce problème, il le trouve partout, sa mémoire est corrompue et il vaut mieux carrément quitter Windows ...
j'ai fait ce constat également.

Même une xref introuvable perturbe Map ... Il faut le savoir.
 

 

 

J’avais lancé ce sujet sur géorézo :

 

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

Le problème vu par Autodesk :

Le comportement de Map 3D en présence des XREF et de tables des données avec le même nom mais structure différente doit être considéré « as designed ». Ce control a été implémenté pour assurer la cohérence des données.

En gros, le bug dont vous souffrez est une fonctionnalité ! Qui vous protège de votre défaut bien connu, l’incohérence !

 

Donc on ne fait rien ?

Heureusement que si, car sinon, on ne pourrait plus travailler.

Solution 1 (principe) :

 

Dans tous les dessins :

-          Supprimer toutes les tables non utilisées (s’il y en a)

-          Renommer les tables :

Par exemple, le message d'erreur de map portait sur une table qui n'existe pas dans mon dessin : E-ACC
la table qui existe est E-ACCESS

Avec le menu map, j'ai renommé la table E-ACCESS en E-ACC

La j'ai eu la surprise de voir que la table E-ACCESS n'avait pas disparu, mais qu'elle cohabitait avec E-ACC.

Certaine entité avait soit l'une des tables, soit les 2.

Par un programme,

TABLE2OTHERTABLE j'ai copié le contenu de la table E-ACC vers E-ACCESS pour le objets qui n'avait pas la table E-ACCESS
j'ai supprimé la table E-ACC,
et le message d'erreur a disparu, et on peut a nouveau travailler.

 

Solution 2 (cas normal)

Dans tous les dessins :

-          Supprimer toutes les tables non utilisées (s’il y en a)

-          Si les xref sont trouvées, ouvrir une à une les xref, supprimer les tables non utilisées, et mettre à jour les tables si la xref contient les même tables que le dessin hôte : le moindre accent oublié dans la description d’un champ peut entrainer une erreur !

- détacher les xrefs non utilisée ou introuvables

Quitter Autocad et Windows

Relancer, le message doit disparaitre.

 

Solution 3 (cas sévères)

Dans tous les dessins :

-          Supprimer toutes les tables non utilisées (s’il y en a)

-          Si les xref sont trouvées, ouvrir une à une les xref, supprimer les tables non utilisées, et mettre à jour les tables si la xref contient les même tables que le dessin hôte : le moindre accent oublié dans la description d’un champ peut entrainer une erreur !

- détacher les xrefs non utilisée ou introuvables

Utiliser le lisp Xrelative qui est sur ce blog

 

Fermer le dessin, et déplacer le dessin d'un répertoire

Rouvrir le dessin (il n'aura plus d'xrefs)

 

Préfixer les tables

Utiliser le lisp :  Ajout_prefixe_tables (code en fin d’article)

Mettre un préfixe au choix, genre « MonPref_ »

Fermer le dessin

 

A ce stade, on peut avoir dans le dessin deux fois la table E-ACCESS :

-        E-ACCESS :

-        MonPref_E-ACCESS 

 

Le but de l'opération est de supprimer celle qui a le moins d'objets :

 

 

Rouvrir le dessin

Télécharger l’excellent programme d’Olivier Eckman : (Post du 16 Juin)

http://georezo.net/forum/viewtopic.php?pid=213740#p213740

 

Charger ObjectDataCS.dll (_netload votrechemin /ObjectDataCS.dll)

Taper mqselect, parcourir les tables et voir celles qui sont utilisées.

Pour chaque table en doublon,

Sélectionner celles qui ont le moins d'objets, 

 

TABLE2OTHERTABLE du jeu de sélection de la table source (qui sera supprimée) vers la table cible(qui sera gardée)

 

Effacer une à une les tables source avec cartes/données d'objet/définir les données d'objet

 

Lancer le lisp :Supprime_prefixe_tables

 

Fermer le dessin, et le remettre à son emplacement initial,

Commande Lisp  Xabsolus, et le dessin est propre

 

Précaution utiles :

Cet article s’adresse à des utilisateurs très confirmés d’Autocad map, débutants s’abstenir.

Avant de s’aventurer dans ce genre de traitement, on fait une sauvegarde de tous les fichiers que l’on veut traiter.

Si ça ne marche pas, ce n’est pas grave, mais si vous détruisez vos données, c’est autre chose.

Prérequis, articles à lire, programmes à utiliser :

Télécharger les lisps concernant Autocad Map (préfix AM) de 4D technologie :


http://www.4d-technologies.com/techcenter/

 

Installer PowerClic :

Installation et mise à jour de PowerClic pour Autocad

 

Récupérer les lisps pour les xrefs :

Changement de type de chemin pour les références externes

 

Puis placer les routines suivantes dans un fichier lisp, ex G-eaux_ADE_utils.lsp, et le charger.

Les routines lisps utiles

;********************************************************
;§**/ade/renome les tables avec un prefixe propre au dessins / none
(defun c:Ajout_Prefixe_tables ( / table tablelst)
(pw_setvar1 "CMDDIA" 0)
(if (vlax-ldata-get "NADIAA" "prefixe-table")
(Prompt "\nLes tables de ce dessins ont déjà un préfixe ! ")
(progn
(while (= "" (setq prefixe-table (getstring "\nPrefixes local pour les tables de ce dessin (code INSEE) + undescore")))
(Prompt "\nIncorrect, recommencez ! ")
)
(setq tablelst (AM_GETTABLELST))
(foreach table tablelst
;;;_adedefdata
;;;Table: [?/Supprimer/Modifier/Nouvelle/Renommer/Quitter]: R
;;;Table à renommer: E-ACCESS
;;;Nouveau nom de la table : O-ACCESS
;;;Table: [?/Supprimer/Modifier/Nouvelle/Renommer/Quitter]:
(command "_adedefdata" "_Rename" table (strcat prefixe-table table) "")
)
(vlax-ldata-put "NADIAA" "prefixe-table" prefixe-table )
)
)
(pw_setvar2 "CMDDIA" )
)

;;********************************************************
;§**/ade/supprime le prefixe de tables propre au dessins / none
(defun c:Supprime_Prefixe_tables ( / table tablelst)
(pw_setvar1 "CMDDIA" 0)
(if (not (setq prefixe-table (vlax-ldata-get "NADIAA" "prefixe-table")))
(Prompt "\nLes tables de ce dessins n'ont pas de préfixe ! ")
(progn
(setq tablelst (AM_GETTABLELST))
(foreach table tablelst
(setq newtable (vl-string-subst "" prefixe-table table ))
(if (= (strcase newtable)(strcase table))
    (prompt "\nTable sans préfixe")
;;;_adedefdata
;;;Table: [?/Supprimer/Modifier/Nouvelle/Renommer/Quitter]: R
;;;Table à renommer: E-ACCESS
;;;Nouveau nom de la table : O-ACCESS
;;;Table: [?/Supprimer/Modifier/Nouvelle/Renommer/Quitter]:
(command "_adedefdata" "_Rename" table newtable "")
)
)
(vlax-ldata-delete "NADIAA" "prefixe-table" )
)
)
(pw_setvar2 "CMDDIA" )
)
;*******************************************************************
;§/ade/efface toutes les tables d'un dessin/none
;
(defun c:Delete_all_table ()
(mapcar 'ade_oddeletetab (ade_odtablelist))
(prompt "\nToutes les tables detruites !")
)

;*******************************************************************
;§/ade/liste à l'écran toutes les tables d'un dessin/none
(defun c:tableliste ()
(foreach l (ade_odtablelist)
(print l)
(mapcar 'print (AM_GetTableFormat l))
)
)

*******************************************************************
;§/ade/ecrit, dans un fichier csv, toutes les tables d'un dessin/none
(defun c:Ecrit_table_dans_csv ()
(setq nchem (getvar "dwgprefix"))
(setq ndess (cadr (pw_scie_fich (getvar "dwgname"))))

(setq fich (getfiled "Fichier csv de table de données à écrire : " (strcat nchem ndess ".csv" ) "csv" 1))
(setq f (open fich "w"))
(setq ltable (ade_odtablelist))
(write-line "[TABLES]" f)
(write-line ";;nom de la table,description" f)

(foreach l ltable
(setq tmp (ade_odtabledefn l))
(setq desc (cdr (assoc "TableDesc" tmp)))
(write-line (strcat l "," desc) f)
)
(write-line "" f)



(foreach l (ade_odtablelist)
(write-line (strcat "[" l "]" ) f)
(write-line ";;nom de champ,description,type,valeur par defaut" f)
(setq tmp (AM_GetTableFormat l))
(foreach chp tmp
(setq chp (mapcar 'pw_guil_make chp))
(setq chp (pw_ch_de_lst chp ","))
(write-line chp f)
)
(write-line "" f)

)



(close f)
(OpenCsvWithoOOsCalc fich)
)

;*************************************************************************
;§/ade/nil si la table n'existe pas/table
(defun na_exist_table (table / lt)
(setq lt (ade_odtablelist))
(if (member table lt)
table
nil
)
)

;******************************************************************************
;§/ade/Copier les données d'objet d'une table vers une autre/none
;

(defun c:Table2otherTable ( / i)

(pw_getstringmem "\nTable à copier ?" "source-table")
(pw_getstringmem "\nTable cible ?" "cible-table")

(if (not (NA_EXIST_TABLE cible-table))
(progn
(setq lchp (AM_GetTableFormat source-table))
(NA_DEFINETAB cible-table (strcat "Copie de la table " source-table) lchp)
)
)

(prompt "\nChoix des objets pour l'opération")
(setq sel (ssget))

;*******************************************************************
;;§/ade/cree une table à partir de :/tblname tbldesc l-fields
;; tablename tabledesc '(liste des champs)
;;liste des champs compatible avec la liste retournée par AM_GetTableFormat
;;compatible avec les fichier ini de definition de table de nadiaa

(defun NA_definetab (tblname tbldesc l-fields )
(setq l-fields
     (mapcar '(lambda (x)
         (list (cons "colname" (car x))
             (cons "coldesc" (cadr x))
             (cons "coltype" (caddr x))
             (cons "defaultval" (pw_nil_t (cadddr x)))
            )
         )
         l-fields
     )
)

(ade_oddefinetab (list (cons "tablename" tblname)
             (cons "tabledesc" tbldesc)
         (list "columns"
             l-fields
         )
         )
)
)

 

 

 

g-eaux

 

 

Partager cet article
Repost0

commentaires

L
article intéressant
Répondre