bseb67 Posté(e) le 19 juillet 2007 Posté(e) le 19 juillet 2007 Salut! J'ai à nouveau un mystère que je cherche à résoudre: Afin de vérifier que le dessin ne comporte que la zone concernée, j'ai fait un lisp qui insère une polyligne fermée (donc un polygone). Cette polyligne me sert à créer une suite de points pour faire un (ssget "_cp" listdepoints), je supprime les entités obtenue par la sélection. Puis je fais un (ssget "x" '((410 . "Model"))), si ce ssget renvoi une sélection c'est qu'il y a des éléments hors zone.Puis j'annule tout afin de retrouver le dessin d'origine. Pour connaitre les éléments hors zone, je lance un autre lisp qui zoom sur chacun d'eux. Pour l'instant, je pensais que cela marcherai, mais mon 2ème ssget me renvoie des éléments contenus dans le polygone, mais ceux sont des éléments "invisibles": càd bloc avec attributs invisibles, mtext vides ou avec des "{". Ma question est: est-ce normal que le ssget cp ne sélectionne-t-il pas ces éléments? PS: j'ai essayé une méthode plus longue, avec un test d'appartenance au polygone en comptant le nombre d'intersection entre les bords du polygone et le segment formé d'un point extérieur et celui du point d'insertion de l'objet invisible => mais elle ne marche pas à 100% :( Merci. [Edité le 23/7/2007 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
stephan35 Posté(e) le 19 juillet 2007 Posté(e) le 19 juillet 2007 Salut ! A vérifier:Pour connaitre les éléments hors zone, je lance un autre lisp qui zoom sur chacun d'eux. Il me semble que l'on peut faire des soustraction dans les filtres ..... Et je suis curieux de voir cet autre lisp .... A+
bseb67 Posté(e) le 20 juillet 2007 Auteur Posté(e) le 20 juillet 2007 Salut stephan! Je veux bien mettre mon lisp, mais je ne connais pas la balise pour le code :casstet: Si tu peux me la donner (j'ai cherché sous "balise" "code", mais rien trouvé) je poste le lisp. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
stephan35 Posté(e) le 20 juillet 2007 Posté(e) le 20 juillet 2007 Envoie moi un mail à buchholz point s at free point fr Je l'afficherai en post ...a+ Ok le voici : ;------------------------------------; ; nom: ahz ; ; role: affiche la liste des éléments; ; qui sont hors zone ; ; param: aucun ; ; retour: aucun ; ; date: 12/07/2007 ; ; BLAES Sébastien ; ;------------------------------------; (defun c:ahz( / lg cpt s cercle) (if VAR_ELEM_HZ (progn (setq lg (car VAR_ELEM_HZ) cpt VAR_CPT_AHZ s (cdr VAR_ELEM_HZ)) (cond (VAR_CPT_AHZ ; on charge le fichier dcl (setq dcl_id (load_dialog "C:/seb/H-138/hors_zone")) ; on test si restart_hors_zone_dialog existe (if (not (new_dialog "restart_hors_zone_dialog" dcl_id)) (exit)) ; on défini les actions sur la dcl (action_tile "accept" "(setq accept t)(DONE_DIALOG)") (action_tile "cancel" "(setq accept nil)(DONE_DIALOG)") ; on lance l'affichage de la dcl (start_dialog) ; on ferme la dcl (unload_dialog dcl_id) ; l'utilisateur veut repartir du premier élément hors zone (if (= accept nil) (setq VAR_CPT_AHZ 0 cpt 0) ); if ) ; si affichage déjà effectué ) ; cond (while (< cpt lg) (print (setq el (entget (ssname s cpt)))) (setq p1 (getP1 el)) (command "_circle" p1 3.0) (setq cercle (entlast)) (if (/= (cdr (assoc 0 (entget cercle))) "CIRCLE") (progn (command "annuler") (exit (alert "erreur pour le positionnement de la vue sur élément hors zone")) ) ; progn ) ; if (command "zoom" "objet" cercle "") ; on charge le fichier dcl (setq dcl_id (load_dialog "C:/seb/H-138/hors_zone")) ; on test si hors_zone_dialog existe (if (not (new_dialog "hors_zone_dialog" dcl_id)) (exit)) ; on défini les actions sur la dcl (action_tile "accept" "(setq accept t)(DONE_DIALOG)") (action_tile "cancel" "(setq accept nil)(DONE_DIALOG)") (set_tile "ahz_txt" (strcat (itoa (1+ cpt)) "/" (itoa lg) " de type: " (cdr (assoc 0 el)))) ; on lance l'affichage de la dcl (start_dialog) ; on ferme la dcl (unload_dialog dcl_id) ; l'utilisateur à choisit d'annuler (if (= accept nil) (setq VAR_CPT_AHZ cpt cpt lg) ); if (entdel cercle) (setq cpt (1+ cpt)) ) ; while ) ; progn (alert "il faut d'abord lancer hors zone pour pouvoir afficher les éléments") ) ; if (princ) ); c:ahz [Edité le 20/7/2007 par stephan35]
bseb67 Posté(e) le 20 juillet 2007 Auteur Posté(e) le 20 juillet 2007 C fait, les variables en MAJUSCULES sont des variables globales Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
stephan35 Posté(e) le 20 juillet 2007 Posté(e) le 20 juillet 2007 Il manque le dcl mon mignon ! ;) C'est pas grave, je regarde comme ça ! ...a+
Bred Posté(e) le 20 juillet 2007 Posté(e) le 20 juillet 2007 Salut,Je veux bien mettre mon lisp, mais je ne connais pas la balise pour le codehttp://xs117.xs.to/xs117/07295/2007-07-20_094558.jpg Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bseb67 Posté(e) le 20 juillet 2007 Auteur Posté(e) le 20 juillet 2007 VOilà le dcl restart_hors_zone_dialog : dialog { label = ""; : boxed_row { label = "Voulez-vous reprendre l'affichage à partir du dernier arrêt?"; ok_cancel; } // boxed_row } hors_zone_dialog : dialog { label = ""; : boxed_row { label = "Vue centrée sur l'élément hors zone"; : text { key = ahz_txt; value = ""; } // text } // boxed_row : boxed_row { label = "Voulez-vous continuez l'affichage?"; ok_cancel; } // boxed_row } Ahz ne sert que pour "voir" les éléments, mon pb c'est la sélection qui bug. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bseb67 Posté(e) le 20 juillet 2007 Auteur Posté(e) le 20 juillet 2007 J'oubliais, merci bred pour l'info ;) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 20 juillet 2007 Posté(e) le 20 juillet 2007 SalutJ'ai du mal à saisir. Tu peux faire une sélection globale (_x ou avec les variables extmin et extmax et _w), un autre avec _cp et ensuite utiliser ssdel pour enlever ce qui te gêne :casstet: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 23 juillet 2007 Auteur Posté(e) le 23 juillet 2007 Salut patrick! Le but est de trouver ce qui est "hors zone", c'est-à-dire qu'en fonction du nom du fichier, je cherchele cadre (fichier contenant une polyligne) qui correspond à cette partie, je l'insère en tant que bloc, je l'explose afin de récupérer les points de contour. Je simule l'effacement de éléments contenus dans le cadre et donc en faisant une sélection après l'effacement je devrai récupèrer ce qui est en dehors du cadre, afin que le dessinateur puisse virer ce qui dépasse. voici le code pour hors_zone: ;----------------------------------------; ; nom: hors_zone ; ; role: test si des éléments sont ; ; hors zone ; ; param: niveau => niveau du cadre ; ; ex: "U" ; ; zone => zone du cadre ; ; ex "02" ; ; retour: (nb_elem . sélection d'entités); ; nb_elem = ; ; >0 si éléments trouvés ; ; 0 si aucun élément ; ; nil s'il y a eu un problème ; ; sélection d'entités = ; ; non vide si éléments trouvés ; ; vide sinon ; ; date: 10/07/2007 ; ; BLAES Sébastien ; ;----------------------------------------; (defun hors_zone ( niveau zone / iu ech cadre polycadre lpolycadre listpoints cpt lg s news diff) ; on pose une marque pour annuler (command "_undo" "m") (if (or (/= (type niveau) (type "c")) (/= (type zone) (type "c"))) (progn (alert "les types des paramètres sont incorrects!") (cons nil nil) ) ; progn (progn ; on test si le répertoire niveau existe dans CADRES_PATH (if (= (dos_dirp (strcat CADRES_PATH "/" niveau)) nil) (progn (alert "répertoire de niveau non existant!") (cons nil nil) ); progn (progn ; on test si le fichier de découpage de la zone existe (if (= (dos_filep (strcat CADRES_PATH "/" niveau "/Découpage " niveau zone ".dwg" )) nil) (progn (alert "fichier de découpage de zone non existant!") (cons nil nil) ); progn (progn ; on passe en espace objet (command "objet") ; on fait un zoom étendu (command "zoom" "etendu") ; on stocke le mode d'accrochage aux objets (setq var_osmode (getvar "OSMODE")) (setvar "OSMODE" 0) ; on calcul d'abord l'échelle d'insertion (setq iu (getvar "insunits")) (cond ; même unités donc échelle de 1 ((= iu 6) (setq ech 1)) ((= iu 5) (setq ech (/ 100.0 1000.0))) ((= iu 4) (setq ech (/ 10.0 1000.0))) ((= iu 3) (setq ech (/ 1690000.0 1000.0))) ((= iu 2) (setq ech (/ 304.8 1000.0))) ((= iu 1) (setq ech (/ 25.4 1000.0))) (t (exit (alert "insunits non gérée"))) ) ; cond ; on insère le cadre de découpage (command "_insert" (strcat CADRES_PATH "/" niveau "/Découpage " niveau zone ".dwg" ) "0,0,0" ech ech 0) ; on récupère le cadre (setq cadre (entlast)) ; on l'explose (command "_explode" cadre) ; on récupère la polyligne (setq lpolycadre (entget (setq polycadre (entlast)))) ; on annule l'explosion (command "u") ; on annule l'insertion (command "u") ; on sauvegarde l'état des calques (sauve_calques) ; maintenant on supprime les éléments se trouvant à l'intérieur du cadre ; on fabrique la liste des points du cadre (setq listpoints '() lg (length lpolycadre) cpt 0 ) (while (< cpt lg) ; si le cpt-ième élément à pour code 10 (point 3D) on le garde (if (= (car (nth cpt lpolycadre)) 10) (setq listpoints (append (list (list (cadr (nth cpt lpolycadre)) (caddr (nth cpt lpolycadre)))) listpoints)) ) ; if (setq cpt (1+ cpt)) ) ; while ; on fait un ssget sur les éléments contenus dans le polygone (setq cadresel (ssget "_CP" listpoints )) ; on les supprime (while (and cadresel (> (sslength cadresel) 0)) (setq ent (ssname cadresel 0)) (entdel ent) (ssdel ent cadresel) ) ; while ; on fait un ssget pour attraper ce qui reste (setq s (ssget "X" '((410 . "Model")))) ; on annule tout (command "_undo" "f" "_undo" "r" "o") (if s (cons (sslength s) s) (cons 0 nil) ) ; if ) ; progn ) ; if ) ; progn ); if ) ; progn ) ; if ) ; hors_zone (defun c:hz() (setq VAR_ELEM_HZ nil VAR_CPT_AHZ 0) ;(setq Chemin (getvar "DWGPREFIX")) (setq NomDessin (getvar "DWGNAME")) (setq niveau (substr NomDessin 13 1) zone (substr NomDessin 14 2)) (setq VAR_ELEM_HZ (hors_zone niveau zone)) (cond ((= (car VAR_ELEM_HZ) nil) (print "il y a eu une erreur")) ((= (car VAR_ELEM_HZ) 0) (print "il n'y aucun élément hors zone")) (t (print (strcat "il y a " (itoa (car VAR_ELEM_HZ)) " éléments hors zone"))) ) ; cond (princ) ) ; c:hz Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bseb67 Posté(e) le 23 juillet 2007 Auteur Posté(e) le 23 juillet 2007 Salut à tous! Bon, ben j'ai résolu mon problème en utilisant ma deuxième méthode:test d'appartenance au polygone. Elle ne marchait qu'à 80%, j'ai nettoyé mon plan de test, pour ne garder que les éléments qui posaient problèmes = > c'est à nouveau un put... de problème de chiffres après la virgule :mad: J'ai contourné le pb en mettant une marge d'erreur. Je mettrai le lisp complet un peu plus tard (pour ceux qui sont intéressé) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
stephan35 Posté(e) le 23 juillet 2007 Posté(e) le 23 juillet 2007 En fait, ce que tu cherches à faire, c'est une vue sur tes objets, genre espace papier, avec une zone graphique non cubique ???? :casstet:
bseb67 Posté(e) le 23 juillet 2007 Auteur Posté(e) le 23 juillet 2007 salut stephan, euh, non. apparement je ne suis pas très bon pour les explications :cool: Le but final est de zoomer en gros sur l'objet posant problème , s'il y en a bcpc'est plus pratique de pouvoir stopper et relancer "l'affichage". Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 23 juillet 2007 Posté(e) le 23 juillet 2007 SalutJe ne sais pas si ça répond exactement à ta demande, mais tu peux toujours essayer ceci (defun c:test(/ ent js1 js2 n) (setq ent (entget (car (entsel "\nVeuillez sélectionner la poly : "))) js1 (ssget "_cp" (mapcar 'cdr (vl-remove-if-not '(lambda (x) (eq (car x) 10)) ent))) js2 (ssget "_c" (getvar "extmin") (getvar "extmax")) n 0 ) (while (setq ent (ssname js1 n)) (if (ssmemb ent js2) (ssdel ent js2) ) (setq n (1+ n)) ) (princ (strcat "\nvous avez " (itoa (sslength js1)) " éléments dans la zone sélectionnée, et " (itoa (sslength js2)) " hors zone.")) (princ) ) ps : l’inconvénient du (ssget "x") est qu'il prend tout le dessin. Alors s'il y a des éléments que l'on veut conserver qui se trouvent sur un calque gelé, c'est gênant Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 23 juillet 2007 Posté(e) le 23 juillet 2007 euh, non. apparement je ne suis pas très bon pour les explications Il est souvent très difficile d'exprimer son besoin ..... je connais ;) Le but est de trouver ce qui est "hors zone", c'est-à-dire qu'en fonction du nom du fichier, je cherchele cadre (fichier contenant une polyligne) qui correspond à cette partie, je l'insère en tant que bloc, je l'explose afin de récupérer les points de contour. Je simule l'effacement de éléments contenus dans le cadre et donc en faisant une sélection après l'effacement je devrai récupèrer ce qui est en dehors du cadre, afin que le dessinateur puisse virer ce qui dépasse. Bref, Pourquoi simuler l'effacement ??? Pourquoi ne pas faire une selection, puis retirer de cette selection ce qui est correcte ???? Pourquoi virer ce qui est en dehors d'une zone ??? Parceque ça dépasse du cartouche ???? Si oui, je reviens vers mon espace "papier" .... car tu peux définir une zone de travail grace à un polygone .... qui affichera uniquement les entités de l'espace "objet" .... contenus dans cette zone ! Si je n'ai rien compris, dit le moi svp ... ;)
bseb67 Posté(e) le 23 juillet 2007 Auteur Posté(e) le 23 juillet 2007 Resalut! La zone correspond plus ou moins à la présentation de l'espace papier.Comme on travail sur des batiments, mais par niveau et par zone, le fichierne doit contenir que ce qui appartient au niveau et à la zone. et non celle d'a coté. Je simule l'effacement afin que la sélection de tous l'espace objet ne renvoie que ce qui est en-dehors. Sauf que la commande effacer ou le ssget sur un "cadre" rate les éléments non visibles :mad: . C'est pourquoi je cherchai de l'aide la-dessus. après j'ai intégré la méthode, que j'avais utiliser en C++ lors d'un projet à la fac, qui est de prendre un point que l'on sait être en-dehors du polygone (Pref), de prendre le point à tester (Ptest). Puis on compte le nombre de fois que le segment [Pref-Ptest] intersecte les bords du cadre. Si le nombre d'intersection est impair, ptest est dans le polygone, sinon non. Enfin, bref. mon truc marche. Si j'ai le temps je fais une vidéo sur mon dessin de test et je la mettrai(faut que je trouve comment) en ligne. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
stephan35 Posté(e) le 23 juillet 2007 Posté(e) le 23 juillet 2007 La zone correspond plus ou moins à la présentation de l'espace papier.Comme on travail sur des batiments, mais par niveau et par zone, le fichierne doit contenir que ce qui appartient au niveau et à la zone. et non celle d'a coté. Ok, Mais .... Dans ce type de cas, il est d'usage, et fortement conseiller de travailler avec les Xrefs ...surtout si c'est un projet neuf .....Sans vouloir me mettre à dos les archis, tes plans de base risquent d'être souvent retouchés, et donc toutes tes modifs seront à reprendre autant de fois que tu recevras de correctificatifs. Sinon ... bon courrage ! A+
Patrick_35 Posté(e) le 23 juillet 2007 Posté(e) le 23 juillet 2007 Pour le fun, avec zoom sur l'objet hors zone et possibilité de l'effacer ou pas (defun c:test(/ ent js1 js2 mip map n) (vl-load-com) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) (setq ent (entget (car (entsel "\nVeuillez sélectionner la poly : "))) js1 (ssget "_cp" (mapcar 'cdr (vl-remove-if-not '(lambda (x) (eq (car x) 10)) ent))) js2 (ssget "_c" (getvar "extmin") (getvar "extmax")) n 0 ) (while (setq ent (ssname js1 n)) (if (ssmemb ent js2) (ssdel ent js2) ) (setq n (1+ n)) ) (princ (strcat "\nvous avez " (itoa (sslength js1)) " éléments dans la zone sélectionnée, et " (itoa (sslength js2)) " hors zone.")) (setq n 0) (while (setq ent (ssname js2 n)) (vla-getboundingbox (vlax-ename->vla-object ent) 'mip 'map) (vla-zoomwindow (vlax-get-acad-object) (vlax-3d-point (trans (mapcar '(lambda(x) (* 0.90 x)) (vlax-safearray->list mip)) 0 1)) (vlax-3d-point (trans (mapcar '(lambda(x) (* 1.10 x)) (vlax-safearray->list map)) 0 1)) ) (redraw ent 3) (initget "Oui Non") (if (eq (getkword "\nVoulez-vous l'effacer O/N : ") "Oui") (entdel ent) (redraw ent 4) ) (setq n (1+ n)) ) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (princ) ) Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 24 juillet 2007 Posté(e) le 24 juillet 2007 Dans ce vieux SUJET Un code dont la partie finale pourrait peut être t'intéresser.Il permet d'inverser les objets sélectionnés par un simple click. A mettre au goût du jour... pour ton besoin. Sorti du contexte du code, en considérant "ss1" comme la sélection originale de départ (setq l_ent (if ss1 (ssnamex ss1)) js_all (ssget "_X") ) (foreach n l_ent (if (eq (type (cadr n)) 'ENAME) (setq ss2 (ssdel (cadr n) js_all)))) (if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) (progn (princ "\n pour inverser la sélection; /[Espace]/Click+droit pour finir!.") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25)) (sssetfirst nil ss1) (cond ((eq (car key) 3) (setq tmp ss1 ss1 ss2 ss2 tmp) ) ) ) ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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