Aller au contenu

MAJ de données d'objets - Pb lenteur MAJ


Hyppolight

Messages recommandés

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?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

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é