Aller au contenu

Overrule Worldraw


Messages recommandés

Bonjour,

 

Je commence à jouer avec les overrule (en C#) sur le Worldraw pour le moment. Le 1er but était de dessiner certaines polylignes sous forme de 3 polylignes parallèles avec celle du mieux plus épaisses et d'une autre couleur, puis des trait en travers comme des rails de chemin de fer.

Après quelques déboires, ça fonctionne bien maintenant. Le problème ce sont les performances. J'ai 1600 polylignes dans mon dessin. Si je lance la commande REGEN ça prend quelques dixièmes de secondes. Si j'active mon WorldDraw, ça met plus de 5 secondes à regénérer.

Alors je suis revenu en arrière et j'ai habillé avec les fonctions d'AutoCAD en décalant et en mesurant pour dessiner tous les objets que je dessine dans mon WorldDraw. Et là AutoCAD met moins d'une demi seconde pour tout regénérer.

Ce qui me donne à la louche un facteur 10 de ralentissement.

 

Si quelqu'un a déjà mis les mains dans ces fonctions d'OverRule, est-ce que vous avez constaté un ralentissement, ou bien mon code n'est pas optimisé? J'utilise principalement la fonction GetOffsetCurves pour faire mes décalages, je ne vois pas comment faire autrement. Je ne sais pas quelles portions de code sont les plus gourmandes en ressource.

 

De plus je souhaite ajouter la possibilité de m'accrocher sur mes polylignes décalées, j'imagine que ça doit se trouver dans les OsnapOverrule et GetObjectSnapPoints . Pour le moment, je n'ai pas trouvé grand chose sur le net, si vous avez un lien ou un exemple, je suis preneur d'infos.

 

Merci.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Quand je rencontre des problèmes de performances, j'utilise la classe StopWatch (dans System.Diagnostics) pour mesurer le temps d'exécution de chaque bloc de code, ce qui me permet de localiser la portion de code problématique. Tu peux également utiliser un profileur comme dotTrace par exemple (personnellement j'ai toujours trouvé ces outils peu pratique à utiliser).

 

Ton test avec les décalages n'est pas représentatif pour moi car dans un cas, AutoCAD ne fait que transformer les entités en primitives graphiques lors de la régénération, alors que dans le deuxième il doit générer des courbes en plus.

 

Pour le reste, tu as un exemple d'utilisation d'un OsnapOverrule ici ; http://through-the-interface.typepad.com/through_the_interface/2013/12/disabling-snapping-to-specific-autocad-objects-using-net-part-1.html

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut Maxence,

 

merci pour la classe StopWatch, je vais me pencher dessus.

 

Pour le lien sur OsnapOverrule, je l'avais déjà vu, mais on surcharge la fonction qui renvoie des points de snap pour qu'elle renvoie ce que l'on veut (dans ce cas rien).

Mon problème c'est que je dois ajouter les points d'accrochage de ma seconde polyligne qui est temporaire dans mon WorldDraw. Donc si j'ai bien compris, il va falloir que je refasse mon décalage pour récupérer les SnapPoints dans mon OverRule sur Osnap?

 

Ensuite pour un accrochage PROCHE par exemple, tous les points de la polyligne sont accrochables, soit une infinité de points? C'est la dessus que je manque de compréhension sur le fonctionnement.

Est-ce que cette fonction Osnap est appelée chaque fois que j'ai un accorchage différent. Par exemple pour un accrochage EXT l'objet polyligne me renvoie les sommets dans la fonction GetSnapPoints, mais si j'ai plusieurs accrochages activés, alors la liste des points accrochables se cumulent pour chaque mode. Dans ce cas, je dois ajouter tous les points de ma poly décalée pour chacun des modes????

C'est pas clair dans ma tête, donc pas clair quand j'essaie de l'écrire.

 

Je vais essayer d'éplucher la doc ObjectARX, ça doit fonctionner pareil.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Pour le lien sur OsnapOverrule, je l'avais déjà vu, mais on surcharge la fonction qui renvoie des points de snap pour qu'elle renvoie ce que l'on veut (dans ce cas rien).

Mon problème c'est que je dois ajouter les points d'accrochage de ma seconde polyligne qui est temporaire dans mon WorldDraw. Donc si j'ai bien compris, il va falloir que je refasse mon décalage pour récupérer les SnapPoints dans mon OverRule sur Osnap?

 

Je pense qu'il faut que tu calcules la position des points lors du WorlDraw, puis tu les stockes dans des données étendues avec un code 1011 (DxfCode.ExtendedDataWorldXCoordinate) pour qu'ils soient transformés avec l'entité support.

 

Ensuite pour un accrochage PROCHE par exemple, tous les points de la polyligne sont accrochables, soit une infinité de points? C'est la dessus que je manque de compréhension sur le fonctionnement.

Est-ce que cette fonction Osnap est appelée chaque fois que j'ai un accorchage différent. Par exemple pour un accrochage EXT l'objet polyligne me renvoie les sommets dans la fonction GetSnapPoints, mais si j'ai plusieurs accrochages activés, alors la liste des points accrochables se cumulent pour chaque mode. Dans ce cas, je dois ajouter tous les points de ma poly décalée pour chacun des modes????

 

J'ai déjà bricolé avec ça dans le passé, mais je ne me souviens plus trop de comment ça marche exactement. Il me semble que pour l'accrochage proche, ça doit se passer dans le PointFilter. Il faudrait demander à (gile), il a déjà implémenté des accrochages personnalisés dans son complément OsnapPalette : https://apps.exchange.autodesk.com/ACD/fr/Detail/Index?id=appstore.exchange.autodesk.com%3aosnappalette_windows32and64%3afr

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

A la réflexion, j'ai dit une bêtise. GetSnapPoints est appelé à chaque fois que la souris se déplace, donc avec un accrochage PROCHE, tu dois retourner le point sur l'entité qui est le plus proche du curseur (en tenant compte de la distance ; variable système APERTURE ?).

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Bon j'avance, j'ai compris que le GetSnapPoints est appelé à chaque fois que l'on bouge la souris et pour chacun des accrochages activés. Par ex avec EXT, MIL, CEN, PRO, il est appelé 4 fois et pour chacun des modes d'accrochage ça remplit (complète) le tableau de snapPoints. Ensuite c'est AutoCAD qui choisit le point le plus proche de la position de la souris et affiche le Glyph correspondant au mode d'accrochage correspondant à ce point au moment de son stockage.

Dans mon cas, à chaque notification, j'appelle le GetSnapPoints sur l'objet de base puis sur la ou les poly décalée(s) et ça pour chacun des modes d'accrochage et je remplis le tableau des snappoint.

Ca fonctionne bien mais c'est super lent car je dois recréer mes poly décalées à chaque fois.

L'idéal ce serait que ces poly soient calculées/mises à jour lors du WorldDraw (ou peut-être mieux : mises à jour lors du GripStrech ou GripMove et seulement affichées dans le WorldDraw) pour les utiliser directement au moment des accrochages.

Comment est-il possible de stocker la listes des polylignes "graphiques" (List<Polyline>) sur mon objet? Stocker les géométries (points et courbures) en Xdata ça risque d'exploser?

Je n'ai jamais regardé, mais est-ce possible de stocker "n'importe quoi" dans les dictionnaires d'extension?

 

Merci

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Tu peux peut-être les stocker dans un dictionnaire où la clé serait le maintien (handle) de la polyligne support et la valeur serait une liste générique de polylignes. Le dictionnaire serait lui stocké dans Document.UserData. Comme ça tu génères/mets à jour les polylignes dans le WorldDraw et tu peux les réutiliser dans ton GetSnapPoints. Par contre tu dois placer un gestionnaire sur l’événement DocumentToBeDestroyed pour disposer toutes tes polylignes à la fermeture du document.

 

Comme ce sont des données temporaires, ce n'est pas adapté de les stocker dans les dictionnaires d'extension.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut Maxence,

 

Merci pour toutes ces infos, j'arrive au bout, ça fonctionne, les accrochages sont redevenus rapides. Je me suis un peu battu avec mon évènement de DocumentToBeDestroyed, mais c'est bon.

Je vais voir pour ne mettre à jour mes poly décalées que si la géométrie change au lieu de le faire systématiquement dans le Worlddraw afin de gagner un peu de temps.

Il ne me reste plus qu'à faire la fonction qui sauvegarde tout ça en mode "explosé" pour la livraison des fichiers en mode AutoCAD pur et dur.

 

Peut-être une dernière chose à régler. Mon Overrule est attaché à la session et pas au document. Ça serait mieux de pouvoir ouvrir plusieurs dessins et d'activer à volonté dessin par dessin la surcharge graphique.

 

Encore une fois merci pour ta patience et ton aide.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Pour ça tu dois mémoriser une variable booléenne dans une combinaison dictionnaire/XRecord. Ensuite, dans l'événement DocumentBecameCurrent, tu lis cette variable. Si elle n'existe pas, tu désactives la surcharge. Si elle existe et qu'elle est à true, tu l'actives...

 

Ça c'est si tu veux que l'activation/désactivation persiste à la fermeture du document. Sinon tu peux utiliser à nouveau UserData pour stocker ta variable booléenne.

 

Attention sur 2016, tu as des onglets qui ne sont pas des documents (page d'accueil) et dans ce cas le document passé dans l'argument du gestionnaire d'événement est null.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour,

 

Un an déjà, ça passe vite. Le projet était resté bloqué, mais je l'ai fini il y a quelques semaines et déployé. Ça fonctionne plutôt bien, mais il me reste un souci dans un cas très particulier.

 

Je crée une polyligne que je surcharge avec mon overrule. Je crée un bloc de cette polyligne et je sauvegarde mon dessin => pas de souci.

Je crée un tableau AutoCAD, puis j'essaie d'insérer ce bloc dans une cellule de mon tableau. Pas de souci, le bloc apparaît dans ma cellule avec son overrule.

Par contre dès que je sauvegarde mon DWG, j'ai un plantage. Et je ne vois pas du tout où ça se produit. Ça plante quelque soit la version MAP 3D 2010, 2012, 2014 sous Windows 7 32 et 64 bit.

 

Avant de farfouiller de partout, est ce que quelqu'un a déjà testé cette procédure avec un overrule pour voir si c'est un bug AutoCAD ou bien moi qui implémente "mal" mon overrule?

 

Merci

 

Olivier

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é