alala Posté(e) le 18 avril 2013 Posté(e) le 18 avril 2013 Bonjour, un soucis que je rencontre très régulièrement est d'avoir un plan avec des objets à des coordonnées inconnues très éloignés les un des autres, au point ou si l'on fait un Zoom étendu il soient si petit qu'ils n'apparaissent pas ou trop peu!). Je souhaite donc régler ce problème avec une routine que j'ai commencer à écrire : (defun MiddlePointPosition (Entit / MinPoint MaxPoint) (vla-GetBoundingBox Entit 'MinPoint 'MaxPoint) (setq MinPoint (vlax-safearray->list MinPoint)) (setq MaxPoint (vlax-safearray->list MaxPoint)) (setq MiddlePoint (list (/ (+ (car MinPoint) (car MaxPoint)) 2) (/ (+ (cadr MinPoint) (cadr MaxPoint)) 2) ) ) ) (defun c:ZonesZoom (/ doc modelSpace Alpha Ent Ent2 removeObjects addObjects MiddlePoint SSTot Zones ZEC ZoneEnCour ) (vl-load-com) (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-ActiveDocument acadObj)) (setq modelSpace (vla-get-ModelSpace doc)) (setq SS (vla-get-SelectionSets doc)) (ssget "_X" '((410 . "MODEL"))) (Setq Alpha (getint "Quelle tolérance? \n ")) ;;; Création de la sélection générale des éléments (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-Item (list SS "SSTotal" ) ) ) (setq SSTot (vla-add SS "SSTotal" ) ) (setq SSTot (vla-item SS "SSTotal" ) ) ) (vla-clear SSTot) (vla-select SSTot acSelectionSetPrevious) ;;; Boucle générale (setq Zones '()) (setq i 0) (while (> (vla-get-count sstot) 1) ;tan que la sélection générale contien un élément (vlax-for Ent SSTot (setq removeObjects (vlax-make-safearray vlax-vbObject (cons 0 0) ) ) ; création d'un Safearray pour stoquer les éléments à supprimer (vlax-safearray-put-element removeObjects 0 Ent) ;on remplis le SA avec l'élément en cours (vla-RemoveItems SSTot removeObjects) ;on supprime l'élément de la sélection ;;; On crée la nouvelle liste de sélection ZoneX (setq i (1+ i)) (setq Zones (append (list (strcat "Zone" (itoa i))) Zones)) (setq ZoneEnCour (car Zones)) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-Item (list SS ZoneEnCour ) ) ) (setq ZEC (vla-add SS ZoneEnCour ) ) (setq ZEC (vla-item SS ZoneEnCour ) ) ) (vla-clear ZEC) (setq addObjects (vlax-make-safearray vlax-vbObject (cons 0 0) ) ); création d'un Safearray pour stoquer les éléments à ajouter (vlax-safearray-put-element addObjects 0 Ent);on remplis le SA avec l'élément en cours (vla-additems ZEC addObjects);on l'additionne à la sélection ; On boucle sur les éléments de la nouvelle liste (vlax-for EntZEC ZEC (setq MiddlePointBase (MiddlePointPosition EntZEC)) ; on recherche le point centrale de chaque objet ; On boucle sur tous les éléments du plan non supprimés de la liste de séletion générale (vlax-for Ent2 SSTot (setq MiddlePointEnd (MiddlePointPosition Ent2)) (if (< (distance MiddlePointBase MiddlePointEnd) Alpha) ; On compare (progn (setq removeObjects (vlax-make-safearray vlax-vbObject (cons 0 0) ) ) (vlax-safearray-put-element removeObjects 0 Ent2) (vla-RemoveItems SSTot removeObjects) (setq addObjects (vlax-make-safearray vlax-vbObject (cons 0 0) ) ) (vlax-safearray-put-element addObjects 0 Ent2) (vla-additems ZEC addObjects) ) ) ) ) ) ) ) Problème, j'ai une erreur :; erreur: Erreur Automation Pointeur d’objet nulCette erreur survient lors de la suppression de la liste de sélection. J'ai voulus passer un max en Vlisp mais l'ajout et la suppression d'objet dans un jeu de sélection nommé est une galére et j'arrive plus à rien à partir de ça.Si vous avez une solution je suis preneur et vous en serait reconnaissant. Merci d'avance. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
alala Posté(e) le 18 avril 2013 Auteur Posté(e) le 18 avril 2013 Bon le temps de me plonger un poil plus dedant et j'ai résolus le soucis. la routine fonctionne il ne reste plusqu'a pondre une interface pour le zoom sur les Zones crées avec des jeux de sélection. Si vous avez le courrage de corriger les erreurs ou de me proposer quelques chose de plus propre je suis preneur. ;) C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
Patrick_35 Posté(e) le 18 avril 2013 Posté(e) le 18 avril 2013 Salut Et la routine ZoomObject de (gile) ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
alala Posté(e) le 18 avril 2013 Auteur Posté(e) le 18 avril 2013 Bonjour, la problématique ici est de trouver les "grappes" d'objets si leur éloignement ne permet pas rapidement de les trouver à l'oeuil. Chez moi ça plante au dessus des 400000 Objets, et plus il y a d'objet plus c'est lent (normal). Donc à voir pour améliorrer et enrubanner tout ça dans un beau DCL! C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 18 avril 2013 Posté(e) le 18 avril 2013 la problématique ici est de trouver les "grappes" d'objets si leur éloignement ne permet pas rapidement de les trouver à l'oeuil. Bonjour alala, Pour info, je me sers de la vue aérienne (VUEAER), je l’ai toujours trouvé pratique et assez efficace avec son mode dynamique pour ce type de problème, perso elle me règle 95% de mes besoins dans le genre. A+ Apprendre => Prendre => Rendre
alala Posté(e) le 18 avril 2013 Auteur Posté(e) le 18 avril 2013 Bonsoir, J'ai testé un peu tout les types d'affichage est c'est toujours le même soucis, l'on finit par trouver mais c'est long et parfois (plan géoréférencé ou des petit malin mélangent le local, Lambert et Lambert 93 zones) l'on arrive à avoir quelques zones de dessin bien trop éloignés. Après un test fructueu de la routine si dessu sur 350000 entités dans un plan, ça fonctionne mais c'est TRES long, donc je vais tenter de faire autrement (des series de ssget avec des zones serait peu être plus rapide que de parcourir toute les entités. Pour exemple sur le plan en question j'en suis à 5 groupes d'objets qui sont éloignés de plus de 10km (bien plus) les une des autres. Merci de votre aide. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 19 avril 2013 Posté(e) le 19 avril 2013 J'ai testé un peu tout les types d'affichage est c'est toujours le même soucis, l'on finit par trouver mais c'est long et parfois (plan géoréférencé ou des petit malin mélangent le local, Lambert et Lambert 93 zones) l'on arrive à avoir quelques zones de dessin bien trop éloignés. Re, Je n’ai certainement pas tout compris à ta problématique, et je risque surement de répondre à côté.Mais si il s’agit de visualiser des groupes d’objet un zoom étendu, suivie d’un (sssetfirst nil (ssget "_X")) ne serait pas plus simple. Les entités étant « grippé » (grip dont la taille est définit en pixels), on arrive à localiser même un point dans un coin de l’écran. Quitte à jouer avec la valeur des variables suivantes si nécessaire, pour plus d’efficacité visuelle.GRIPCOLOR -> Gère la couleur des poignées non sélectionnées. Les valeurs admises sont comprises entre 1 et 255.GRIPSIZE -> Définit la taille en pixels du carré représentant la poignée. Bon courage A+ Apprendre => Prendre => Rendre
alala Posté(e) le 19 avril 2013 Auteur Posté(e) le 19 avril 2013 Bonjour, Oui sauf que passé une nombre d'objets sélectionné les Grips ne s'affichent plus sur nos postes (variable?) . Cela reste une solution à creuser toutefois . Merci. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 19 avril 2013 Posté(e) le 19 avril 2013 Bonjour, Oui sauf que passé une nombre d'objets sélectionné les Grips ne s'affichent plus sur nos postes (variable?) . Cela reste une solution à creuser toutefois . Merci. GRIPOBJLIMIT à voir en jouant avec cette variable... Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 19 avril 2013 Posté(e) le 19 avril 2013 Après un test fructueu de la routine si dessu sur 350000 entités dans un plan, ça fonctionne mais c'est TRES long, donc je vais tenter de faire autrement (des series de ssget avec des zones serait peu être plus rapide que de parcourir toute les entités. Re, Pendant ma pause déjeuné, je me suis amusé à générer un fichier à 246225 entités en décomposant des hachures, en réglant la variable GRIPOBJLIMIT à 0 et tester avec un (sssetfirst nil (ssget "_X")) cela fonctionne, mais c’est également très très long à toi de voir ce qui te va le mieux, je n’ai pas l’expérience suffisante des fichiers aussi lourd dans mon domaine d’activité.. A+ Apprendre => Prendre => Rendre
alala Posté(e) le 22 avril 2013 Auteur Posté(e) le 22 avril 2013 Bonjour, Merci pour cette variable, je vais voir à l'usage si c'est plus ou moins rapide.Pour "le sport" je vais tout de même continuer a dévelloper un peu cette routine, j'étais persuadé de pouvoir faire des sélections proches sans avoir à passer tous les objets en revue (le ssget necessite d'avoir les objets à l'écrans). Encore merci! C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
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