CADxp: comment matérialiser l'apparition d'un dessin - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

comment matérialiser l'apparition d'un dessin

#1 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 26 septembre 2017 - 10:24

Bonjour

J’ai réalisé un programme qui affiche un dessin à partir de certaines données.
A fur et à mesure que j’avance dans mon programme, le dessin met beaucoup de temps à être afficher.
La procédure :
J’introduis les données dans une interface et je lance l’exécution, tout est ok !
Une fois que j’indique un point d’insertion le dessin met un certain temps pour s’afficher et cela à la première exécution du programme.
Mais seulement après, il est plus rapide comme si des dll ont étaient chargées.
Je que je cherche c’est comment occuper l’attention de l’utilisateur avec par exemple une progress bar ou un message l’informant de patienter.
Car j’ignore quand le dessin va apparaitre donc je ne peux pas fixer le "setlimit" de la progressbar
Sinon comment matérialiser le moment où le dessin apparait ?
J’ai déjà posté sur des sites anglophones mais pas de solution au problème.
j'utilise vb.net ,autocad 2013
merci
0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11290
  • Inscrit(e) : 02-septembre 05

Posté 26 septembre 2017 - 16:32

Salut,

Il faudrait que tu sois plus clair.
Qu'est-ce que c'est ce "dessin à partir de certaines données" que le programme affiche ?
Doit-il s'afficher dans AutoCAD ?
Sous forme de référence de bloc ?
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#3 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 27 septembre 2017 - 11:41

Bonjour, j'arrive pas à attacher les fichiers
....Le serveur a retourné une erreur durant l'envoi....
je vais etre plus explicite
je suis sur autocad
c'est une application qui se charge de dessiner des poteaux de batiment.
je charge mon application avec NETLOAD.
il ya là une interface qui me demande d'introduire les données tels que;hauteur de poteau, largeur, hauteur d'etage , etc...
Une fois les données introduites je lance l'exécution.

maintenant je precise un point d'insertion sur autocad.
et me voilà attendre l'affichage du poteau qui met un bon bout de temps pour apparaitre!
ok je relance l'application ,introduction de données,...
l'affichage du dessin maintenant est plus rapide !

Comme dans le programme je charge des layers, des styles de cotation, styles de textes....
peut etre que ça met du temps pour les charger à la première exécution et après c'est ok?

je n'utilise pas de bloc.

Donc je cherche à combler ce temps d'attente par un message priant l'utilisateur de patienter et qui disparait à l'apparition du dessin ou une progressbar.
comme je ne sais pas à quel moment il va apparaitre et voilà.



0

#4 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11290
  • Inscrit(e) : 02-septembre 05

Posté 28 septembre 2017 - 07:40

Salut,

Ce que tu décris ici (ou sur TheSwamp) m'étonne beaucoup.
La lenteur à la première exécution peut être due à la compilation JIT du code MSIL et/ou au chargement de calques, styles etc.
Dans le premier cas, il faut vraiment qu'il y ait beaucoup de code à compiler pour que la différence entre la première exécution et les suivantes soit sensible.
Dans le deuxième cas, la manière dont tu "charges" les calques et styles doit très certainement pouvoir être optimisée. Tu dis utiliser des DLLs pour faire ça, est-ce bien le plus efficient ? Parce que importer des objets depuis un dessin/gabarit ou créer ces objets à la volée ne devrait pas prendre plus d'une seconde (à moins qu'on parle de milliers d'objets).
Tu peux facilement savoir si c'est le chargement de ces objets qui ralenti l'exécution en lançant ton programme dans un dessin/gabarit qui a déjà ces objets.
Pour faire un diagnostic plus précis des "goulots d'étranglement", tu peux, comme on te l'a conseillé sur TheSwamp, utiliser une instance de StopWatch.

Ceci étant, pour "matérialiser" l'attente, tu as le chois entre le ProgressMeter d'AutoCAD et un ProgressBar Windows.
Le second est plus complexe à mettre en œuvre : généralement on utilise un BackgroundWorker pour que le ProgressMeter et la tache s'exécutent sur deux Threads différents.

Dans tous les cas, d'après ce que tu décris "l'attente" devrait démarrer au moment où l'utilisateur spécifie le point d'insertion et se terminer quand le code finit de dessiner la dernière entité.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#5 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 28 septembre 2017 - 13:25

salut!
j'ai vainement essayer une instance de StopWatch mais rien eu.
Seulement maintenant, ce que je cherche exactement comme tu l'as remarquer;
comment savoir quand le code finit de dessiner la dernière entité.?
car à mon niveau entre la première et dernière entité c'est du "nanoseconde"le dessin s'affiche en entier en une fraction de seconde
et à partir de la je peux peut etre mettre un message d'attente qui doit disparaitre dès que le dessin est affiché.


En ce qui concerne les calques, styles de textes , de cotes, etc... le code est etabli d'une manière tel qu'il s'assure d'abord
si le calque existe sinon il en crée un.



voici à titre d'exemple un code pour le style de textes et c'est la même procédure pour les calques , cotation
crées un à un, peut etre le problème est ici, car pour une dizaine de layer........


Dim acTextTbl As TextStyleTable
acTextTbl = acTrans.GetObject(acCurDb.TextStyleTableId, _
OpenMode.ForRead)


Dim Texttitre As String = "Text titre"


If acTextTbl.Has(Texttitre) = False Then
Dim acTextTblRec As TextStyleTableRecord = New TextStyleTableRecord()


acTextTblRec.Name = Texttitre
acTextTblRec.TextSize = 40
acTextTblRec.XScale = 1.5
acTextTblRec.FileName = "Consolas.shx"

acTextTbl.UpgradeOpen()

acTextTbl.Add(acTextTblRec)
acTrans.AddNewlyCreatedDBObject(acTextTblRec, True)


End If

0

#6 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11290
  • Inscrit(e) : 02-septembre 05

Posté 29 septembre 2017 - 07:40

Salut,

Ce genre de procédure ne devrait pas ralentir plus que ça l'exécution de ton programme.

Pour l'utilisation de Stopwatch, c'est assez simple :
Tu crées une instance de Stopwatch(). Au moment où l'utilisateur spécifie le point d'insertion, tu démarres le chronométrage et tu récupères des temps intermédiaires après chaque opération (ou groupe d'opérations), une fois toutes les opérations terminées tu arrêtes le chrono et tu affiches les résultats.

            ' créer une instance de Stopwatch '
            Dim sw = New System.Diagnostics.Stopwatch()

            ' démarrer le chronométrage '
            sw.Start()

            ' exécuter la première opération '

            ' prendre un premier temps intermédiaire à la fin de cette opération '
            Dim t1 As Long = sw.ElapsedMilliseconds

            ' exécuter la deuxième opération '

            ' prendre un deuxième temps intermédiaire à la fin de cette opération '
            Dim t2 As Long = sw.ElapsedMilliseconds

            ' exécuter la troisième opération '

            ' prendre un troisième temps intermédiaire à la fin de cette opération '
            Dim t3 As Long = sw.ElapsedMilliseconds

            ' exécuter la dernière opération '

            ' arrêter le chronomètre à la fin de cette opération '
            sw.Stop()
            Dim total As Long = sw.ElapsedMilliseconds

            ' afficher les résultats '
            Dim ed = Application.DocumentManager.MdiActiveDocument.Editor
            ed.WriteMessage(vbLf & "Première opération: " & t1 & "millisecondes")
            ed.WriteMessage(vbLf & "Deuxième opération: " & t2 - t1 & "millisecondes")
            ed.WriteMessage(vbLf & "Troisième opération: " & t3 - t2 & "millisecondes")
            ed.WriteMessage(vbLf & "Dernière opération: " & total - t3 & "millisecondes")
            ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#7 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 01 octobre 2017 - 15:26

salut
je cravache,je trécuche, je me relève et j'avance pas!
je pense devoir revoir quelque chose dans mes codes et procédures.
j'ai trouvé à des endroits je passe 5700 ms de la première exécution à 110 ms en moyenne sur les suivantes.
seulement je reviens toujours à la question:
Comment specifier la fin de l'exécution des codes?



0

#8 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 05 octobre 2017 - 10:48

Bonjour
J'ai un peu réduit le temps d'impression grace à Stopwatch
j'ai trouve que l'utilsation de la condition Case est mieux adaptée que If...then .successifs dont j'abuse.
par contre j'insiste toujours comment indexer l'apparition du dessin après getpoint
..?
Merci.
0

#9 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11290
  • Inscrit(e) : 02-septembre 05

Posté 05 octobre 2017 - 13:11

Salut,

Que veux-tu dire par "apparition du dessin" ?
Ne sachant pas ce que fait ton programme, c'est difficile à dire, mais normalement quand on ajoute des entités dans AutoCAD, il apparaissent quand on appelle Commit() sur la Transaction qui a servi à ajouter ces objets.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#10 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 05 octobre 2017 - 18:31

oui c'et bien ça
je pense avoir donner des precision précedemment.

et je pense que vous avez decélé mon obstacle, d'ailleurs un peu plus haut vous aviez bien mentionner;
<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">Dans tous les cas, d'après ce que tu décris "l'attente" devrait démarrer au moment où l'utilisateur spécifie le point d'insertion et se terminer quand le code finit de dessiner la dernière entité.

en ce qui concerne le programme j'avais ecris:

c'est une application qui se charge de dessiner des poteaux de batiment.
je charge mon application avec NETLOAD.
il ya là une interface qui me demande d'introduire les données tels que;hauteur de poteau, largeur, hauteur d'etage , etc...
Une fois les données introduites je lance l'exécution.
<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">maintenant je precise un point d'insertion sur autocad.<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">et me voilà attendre l'affichage du poteau qui met un bon bout de temps pour apparaitre!<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">ok je relance l'application ,introduction de données,...<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">l'affichage du dessin maintenant est plus rapide !<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">

Maintenant,

mais normalement quand on ajoute des entités dans AutoCAD, il apparaissent quand on appelle Commit() sur la Transaction qui a servi à ajouter ces objets.

Peut etre ce temps d'attente est dù à ça car j'ai une seule transaction pour l'ensemble des codes, d'ou un seul Commit()?????????
j'aurais peut être dù metrre plusieurs transaction?

merci pour la perseverance.
0

#11 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 05 octobre 2017 - 18:51

c'est à dire, après chaque entité créée

Dim tr As Transaction = db.TransactionManager.StartTransaction()
Using tr
1ere entité.......
tr.AddNewlyCreatedDBObject
tr.Commit()
End Using


Dim tr As Transaction = db.TransactionManager.StartTransaction()
Using tr
2eme entite .......
tr.AddNewlyCreatedDBObject
tr.Commit()
End Using
0

#12 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11290
  • Inscrit(e) : 02-septembre 05

Posté 05 octobre 2017 - 23:25

Non, je pense que c'est mieux de ne faire qu'une transaction. Mais si tu veux faire apparaître les entités au fur et à mesure qu'elles sont créées (avant le Commit(), tu peux utiliser la méthode TransactionManager.QueueForGraphicsFlush()

Dim tr As Transaction = db.TransactionManager.StartTransaction()
Using tr
    '1ere entité.......
    tr.AddNewlyCreatedDBObject(ent1, True)
    db.TransactionManager.QueueForGraphicsFlush()

    '2eme entite .......
    tr.AddNewlyCreatedDBObject(ent2, True)
    db.TransactionManager.QueueForGraphicsFlush()

    '.......

    'derniere entite .......
    tr.AddNewlyCreatedDBObject(entLast, True)
    tr.Commit()
End Using 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#13 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 09 octobre 2017 - 09:22

Bonjour,
idem même avec QueueForGraphicsFlush sur chaque entité ajoutée le dessin s'affiche en entier apres un temps d'attente.
par contre j'ai trouvé quelque chose d'interessant fait par Norman Yuan
"Showing Progress for long code execution in AutoCAD" sur Drive AutoCAD with Code
mais un peu compliqué; qui répond peut être à ma question?
0

#14 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 25 octobre 2017 - 12:39

bonjour

je suis arrivé à ce point avec l'utilsation de stopwatch
un phenomène!

la durée totale est de 4823msecondes

sw.Start()

armature(acBlkTblRec, acCurDb, acTrans, New Point3d(origTextX, origTextY, 0))

sw.Stop()
total = sw.ElapsedMilliseconds

Dim ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")



Mais en exécutant stopwatch à l'interieur de ma fonction, la durée totale est de 25 msecondes


Public Sub armature(ByRef acBlkTblRec As BlockTableRecord, ByRef acCurDb As Database, ByRef acTrans As Transaction, _
ByVal origTEXT As Point3d)


sw.Start()

-
-
-
-


sw.Stop()
total = sw.ElapsedMilliseconds

Dim ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")
End Sub


Ou est le problème?
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)