Hyppolight Posté(e) le 20 avril 2016 Posté(e) le 20 avril 2016 Bonjour, Je développe un programme (.NET) dont une partie sert à la mise de données d'objets présents dans des polylignes ou blocs. J'ai associé mes envois de commande au double-clic sur des entités (dans la partie CUI (ou IUP)): - double-clic sur une polyligne : affichage d'une boite de dialogue spécifique en fonction du calque de la polyligne - double-clic sur un bloc : affichage d'une boite de dialogue spécifique en fonction du nom du bloc Les boites de dialogues associées charge les informations (données d'objets, attributs de blocs, propriétés dynamiques de blocs) dans des textboxs, comboboxs... (principalement des comboboxs pour limiter les choix) L'utilisateur peut donc mettre à jour les informations dans la boite de dialogue Lors de la fermeture de la boite de dialogue, les informations sont mis à jour dans l'entité sélectionnée (double-cliquée) Le programme en lui-même fonctionne très bien sauf qu'il arrive certaines fois que lors de la MAJ (mise à jour) des OD (object data = données d'objets) ne se fasse pas instantanément Cela n'est pas très grave vous me direz.. sauf que, temporairement (quelques secondes), les tables de données d'objets associés normalement au fichier disparaissent (non visible dans les propriétés de l'entité sélectionnée), puis se ré affichent une fois MAJ. Ce qui entraine des erreurs en cas de demande de modification d'une entité (double-clic) qui est en train d'être mise à jour : les tables d'OD n'étant temporairement pas associées à l'entité, leur demande de chargement pour charger la boite de dialogue engendre un message d'erreur voire un plantage d'AutoCAD Map. Avez-vous déjà rencontré ce problème?
bonuscad Posté(e) le 20 avril 2016 Posté(e) le 20 avril 2016 Bonjour, Je ne sais pas si ma réponse va t'aider, je ne pratique pas le NET. Cependant ce que j'ai lu dans la doc lisp de map (en anglais), est en résumé ceci: Il vaut mieux utiliser ade_odgetrecfield que ade_odgetfield, car ce premier est beaucoup plus rapide car il utilise directement l'ID du record pour aller "piocher" la valeur dans la base.Pour obtenir l'ID du record, c'est la fonction ade_odgetrecord. Dans la doc ils donnent les équivalences pour ADSRX, est ce qu'elles sont valables pour NET, j'en sais strictement rien... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Hyppolight Posté(e) le 22 avril 2016 Auteur Posté(e) le 22 avril 2016 Bonjour, Tout d'abord merci pour cette réponse rapide... Je pense avoir trouver une solution VB.NET plus ou moins équivalente... Après plusieurs tests je me suis rendu compte qu'il était préférable (pour ce problème de lenteur) de supprimer les records puis de les recréer que de chercher à les mettre à jour. J'ai donc utiliser la méthode suivante dans ma classe d'objet. 'Mise à jour des attributs de bloc et des données d'objets depuis les variables Public Sub MAJ_OD_from_VAR_V2(Block As BlockReference, OD_Tbl_Name As String) Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim tr As Transaction = db.TransactionManager.StartTransaction() Using tr Try Dim odTables As Tables = HostMapApplicationServices.Application.ActiveProject.ODTables Dim tbl As Autodesk.Gis.Map.ObjectData.Table = Nothing Dim recs As ObjectData.Records = Nothing Dim rec As ObjectData.Record = Nothing Dim mapVal As Autodesk.Gis.Map.Utilities.MapValue = Nothing Dim id As ObjectId = Block.ObjectId Dim dbObj As DBObject = tr.GetObject(id, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) Select Case OD_Tbl_Name Case "00_GENERAL" tbl = odTables.Item("00_GENERAL") recs = tbl.GetObjectTableRecords(0, id, Constants.OpenMode.OpenForWrite, False) 'Suppression des anciennes informations Dim ie As IEnumerator ie = recs.GetEnumerator ie.MoveNext() recs.RemoveRecord() 'Ajout des nouvelles informations rec = ObjectData.Record.Create tbl.InitRecord(rec) mapVal = rec(0) mapVal.Assign(LOT) mapVal = rec(1) mapVal.Assign(TRONCON) mapVal = rec(2) mapVal.Assign(SEGMENT) mapVal = rec(3) mapVal.Assign(ANTENNE) mapVal = rec(4) mapVal.Assign(CLE) mapVal = rec(5) mapVal.Assign(NOM_COMM) mapVal = rec(6) mapVal.Assign(INSEE) mapVal = rec(7) mapVal.Assign(NOM_VOIE) mapVal = rec(8) mapVal.Assign(GEST_VOIE) tbl.AddRecord(rec, dbObj) 'Select case ... End Select tr.Commit() tr.Dispose() recs.Dispose() rec.Dispose() mapVal.Dispose() Catch ex As Exception ed.WriteMessage(ex.ToString & vbCr) MsgBox(ex.ToString) End Try End Using End Sub Encore merci et bon week-end.. Hyppo
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant