Aller au contenu

Zoom sur des zones d'objets regroupés


alala

Messages recommandés

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 nul

Cette 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!

Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

 

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

Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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!

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é