phil 54 Posté(e) le 3 juillet 2022 Posté(e) le 3 juillet 2022 Bonjour J'ai un lisp qui fait de l’impression par lot de présentation qui peuvent etre en portrait ou en paysage. j'utilise dwg to pdf comme traceur et je ne vois pas d'option de rotation auto... De ce fait je cherche une façon de sélectionner la totalité des éléments de la présentation et detecter si la zone occupée est plus grande en x ou en y. de ce fait je pourrais choisir mon orientation d'impression. pour le moment je sèche... Merci de vos retour Phil
Curlygoth Posté(e) le 4 juillet 2022 Posté(e) le 4 juillet 2022 Je sais qu'on est dans la section LISP Mais bon : si ça peut t'aider en VBA : Dim lay as Layout 'Paysage lay.PlotRotation = ac0degrees 'Portait lay.PlotRotation = ac90degrees Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 4 juillet 2022 Posté(e) le 4 juillet 2022 Bonjour @phil 54 Je ne vois pas de gros souci pour détecter ce que tu demandes. Ce qu'on ne sait pas, c'est toujours pareil dans les questions, l'essentiel n'est pas dit, Ce qu'on ne sait pas, disais-je, est : De quoi dispose-t-on pour tester l'orientation. Je pars du principe que tu as une paire de points décrivant la diagonale, j'espère que c'est ça. Donc en faisant le deltaX et le deltaY et en les comparant on saura que suivant lequel des deux est le plus grand c'est PAysage ou POrtrait. Tu as besoin d'aide encore ou avec cette piste de recherche tu sais faire ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Luna Posté(e) le 4 juillet 2022 Posté(e) le 4 juillet 2022 Coucou, Pour rejoindre les propositions de didier, je te suggère la fonction (LM:ssboundingbox) de LeeMac >>ici<< en lien avec ton souhait de récupérer le contour de tes objets sur chaque présentation pour récupérer la diagonale et l'exploiter. Cela retourne les coordonnées de la diagonale (en bas à gauche et en haut à droite dans mes souvenirs) à partir d'un jeu de sélection. Tu peux également essayer de traiter la propriété CanonicalMediaName, obtenue via (vlax-get VLA-OBJECT 'CanonicalMediaName) avec VLA-OBJECT correspondant au nom d'entité VLISP de ta présentation que tu peux obtenir avec (vlax-for layout (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-Name layout) layout) lst)) ) (reverse lst) Avec la ligne (vlax-for) ci-dessus tu vas obtenir un truc du genre (("Model" . #<VLA-OBJECT IAcadLayout 0000024e41f79ff8>) ("Présentation1" . #<VLA-OBJECT IAcadLayout 0000024e41f7a088>) ("Présentation2" . #<VLA-OBJECT IAcadLayout 0000024e41f78cd8>)) Donc il s'agit d'une liste d'association où tu peux aller récupérer le VLA-OBJECT de ta présentation en recherchant son nom (via les fonctions (cdr) et (assoc) ). La ligne juste au dessus, permet d'obtenir ceci par exemple : "ISO_full_bleed_A4_(297.00_x_210.00_MM)" Ainsi (si le nom des formats d'impression sont bien faits) tu peux récupérer les valeurs entre parenthèses pour connaître ton format de papier car c'est toujours la longueur horizontale x verticale 🙂 Bisous, Luna
phil 54 Posté(e) le 4 juillet 2022 Auteur Posté(e) le 4 juillet 2022 Bonjour 0 vous Merci de vos réponses. @Didier, si je n'ai pas dis l'essentiel, j'en suis désolé. je pensais avoir été clair. Sur une présentation j'ai un certain nombre d'objet, cadre polygone ou non, parfois bloc, fenêtres de présentations diverses, cartouches à différent endroit, donc rien qui soit commun à toutes les présentations de tout les plans, je n'ai donc pas de diagonale fiable est systématique pour déterminer la surface papier occupé par les différents éléments. Je pensais intuitivement qu'il pouvait exister une propriété dans un jeu de sélection qui permettait de déterminer les bornes de la surface occupé par ce jeu de selection. En sélectionnant tout ce qu'il y a sur l'espace papier à partir de là, si la zone est plus large que haute, je sais appliquer portrait ou paysage dans la commande traceur... @curlygoth mon probleme est de determiner si je choisis portrait ou paysage en fonction de la surface papier occupée.... @Luna, je ne connais pas ce que tu decris je vais me pencher dessus et voir si je m'en sors. Mais pour que je recupere la mise en page papier d'une presentation , il faut qu'elle ait été créée avant non? c'est pas toujours le cas... En vous remerciant. Philippe
phil 54 Posté(e) le 4 juillet 2022 Auteur Posté(e) le 4 juillet 2022 @ Luna Je viens de regarder LM:ssboudingbox, ça correspond à ce que je recherche. je vais tester. Merci Philippe
Luna Posté(e) le 4 juillet 2022 Posté(e) le 4 juillet 2022 Coucou, La fonction (LM:ssboundingbox) répond mot pour mot à ta demande il y a 3 minutes, phil 54 a dit : Sur une présentation j'ai un certain nombre d'objet, cadre polygone ou non, parfois bloc, fenêtres de présentations diverses, cartouches à différent endroit, donc rien qui soit commun à toutes les présentations de tout les plans, je n'ai donc pas de diagonale fiable est systématique pour déterminer la surface papier occupé par les différents éléments. Je pensais intuitivement qu'il pouvait exister une propriété dans un jeu de sélection qui permettait de déterminer les bornes de la surface occupé par ce jeu de selection. En sélectionnant tout ce qu'il y a sur l'espace papier à partir de là, si la zone est plus large que haute, je sais appliquer portrait ou paysage dans la commande traceur... Mais question n°1 : as-tu la moindre connaissance en LISP ? Si oui alors l'argument de cette fonction est un jeu de sélection, sinon cela va être plus délicat de te donner des pistes de recherches et il serait alors plus rapide de te fournir des programmes tout fait... Ensuite je rebondis sur ce que tu dis il y a 6 minutes, phil 54 a dit : Mais pour que je recupere la mise en page papier d'une presentation , il faut qu'elle ait été créée avant non? c'est pas toujours le cas... Dans ce cas-ci, comment espères-tu déterminer si la présentation est en paysage ou en portrait ? N'est-ce pas le traceur qui détermine cette info ? Si ce n'est pas le cas à chaque fois, alors concentre toi sur ma première piste de recherche (sélection des entités de la présentation et détermination des coins inférieurs gauche et supérieur droit du contour rectangulaire de ton jeu de sélection), sinon l'autre méthode est aussi faisable (mais il s'agit de DEUX méthodes DIFFERENTES !!) Bisous, Luna
didier Posté(e) le 4 juillet 2022 Posté(e) le 4 juillet 2022 Bonjour @phil 54 Tu comprends qu'on ne peut pas être dans ta tête, relis tes messages et mets-toi à la place d'un inconnu le lisant. Souvent donner un DWG avec des explications textuelles est un bon moyen de transmettre les questions. Je repose la question : de quoi dispose-t-on ? Je suis parti avec l'hypothèse que tu avais une paire de points, maintenant tu dis qu'on part d'une sélection graphique hétéroclite. Le programme de Lee Mac est, comme tout ce que fait ce Monsieur, un bijou. Mais si tu lances une sélection globale, il te trouvera la boîte englobante globale et je ne pense pas qu'on soit avancé. Donne un exemple de ce qu'il y a à faire s'il te plaît. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
phil 54 Posté(e) le 4 juillet 2022 Auteur Posté(e) le 4 juillet 2022 En pj un exemple représentatif de différent cas de figure que je peux rencontrer dans les presque 15000 plans de la base... J ne peux pas mettre en ligne un plan de la base. Je dois générer un pdf de chaque présentation de certains fichier, pour mettre à disposition une base plan pdf à une population non technicien. ( pas d'autocad , pas de viewer) La base plan etant ce qu'elle est je dois faire avec. je suis conscient que bosser de cette façon pour imprimer des plans n'est pas la meilleurs mais je n'ai pas le choix. En pj un exemple représentatif de ce que je peux trouver dans un plan. Bien sur les mises en page ne sont pas faites, l'imprimante n'est pas defini et le format papier non plus. Tout ce qui est sur , c'est que les impressions doivent se faire en a3 avec une echelle papier au niveau du traceur 1:1. Parce que l'espace papier est occupé par un ensemble d'entité qui tiennent sur un format a3 , echelle 1:1. Boucler sur les présentation du plans et lancer une commande traceur en lisp je sais faire, je choisis le mode etendu echelle1:1 Mode centré. Ca fonctionne. la seule inconnu est de determiner si mon impression doit être en mode portrait ou paysage en fonction de l'occupation de l'espace papier.... Sinon l'impression est tronquée Je cherche donc le moyen de déterminer la forme de la surface hors tout de tous les éléments de la présentation pour en déduire l'orientation (x plus grand que y c'est du paysage, y plus grand que x c'est du portrait) Dans certains cas j'ai un cadre présent (contour de folio en cyan dans l'exemple) , mais il n'est pas présent partout. @Luna Même si j'ai fait quelques trucs sympa il y a qq années, je suis dans la catégorie débutant. J'ai bien compris que tu me parlais de deux méthodes différentes. Philippe exemple.dwg
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 100 fois sur le metier, remet ton ouvrage... ça n'a jamais été aussi vrai... Bonjour à tous. Je teste LM:ssboudingbox qui correspond bien à ce que je cherche. Sauf que: si je teste avec une selection à la souris, même tres large, j'ai le résultat attendu. (defun c:test ( / box obj sel spc ) (if (and (setq sel (ssget)) Si je teste avec cette selection, la boite englobante est plus large que les entités visibles (defun c:test ( / box obj sel spc ) (if (and (setq sel (ssget "X" (list (cons 410 (getvar "CTAB")) (cons 67 1)))) dans mon esprit la sélection prend toute les entités de l'espace papier de la présentation courante, calque gelé ou non. sur le fichier exemple j'ai ce résultat inattendu. Qu'est ce qu'il y a en plus dans la sélection que je ne sais pas voir? En vous remerciant. Philippe exemple.dwg test.lsp
didier Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 De quel résultat inattendu parle-t-on ? Je ne comprends pas comment on choisit paysage ou portrait dans toutes ces données. Je veux bien des explications... Éternel débutant... Mon site perso : Programmer dans AutoCAD
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Bonjour Didier "De quel résultat inattendu parle-t-on ? " >> la boite englobante est plus large que les entités visibles "Je ne comprends pas comment on choisit paysage ou portrait dans toutes ces données. " >>>> déduire l'orientation (x plus grand que y c'est du paysage, y plus grand que x c'est du portrait) je parle de x et y de la boite englobante. Désolé Didier, mais là je ne peux pas être plus clair, tout est ecrit plus haut. J'ai fourni le lisp et un fichier exemple comme demandé. Quoi d'autre? Maintenant c'est peut être moi qui passe à coté d'un truc qui est essentiel et que vous maitrisez totalement au niveau de l'impression, dans ce cas expliquez moi. Philippe
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 La question posé est celle ci: pourquoi la selection (ssget "X" (list (cons 410 (getvar "CTAB")) (cons 67 1))) semble prendre des entités non visible que je n'arrive pas à identifier alors que (ssget) ne le fait pas? Philippe
didier Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Ce que je voudrais savoir, c'est : Est-il possible que dans l'objet présentation il y ait plusieurs formats à imprimer ? par exemple deux A4 en portrait et un A3 en paysage. Il y a tellement d'entités qui ne sont pas vraiment délimitées qu'un étranger*** à ta façon de faire ne peut comprendre. Dans toute forme de programmation il faut que le programme comprenne ce qu'attend l'utilisateur, si on a du mal à l'exprimer en langage naturel, le langage machine sera confus. Réponse à ton dernier message apparu pendant que je répondais. C'est la définition même de la méthode de sélection du ssget, X signifie la totalité des entités, calque actif ou non, gelé ou non, la totale ! Il faut penser à aller voir les aides fournies sur le net, rien que sur mon site, j'explique ça en long et en large… je ne pensais pas avoir fait tout ça pour rien. Amicalement *** il faut admettre que les autres ne sont pas dans ta tête Éternel débutant... Mon site perso : Programmer dans AutoCAD
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Merci Didier Est-il possible que dans l'objet présentation il y ait plusieurs formats à imprimer ? >> réponse plus haut, "Tout ce qui est sur , c'est que les impressions doivent se faire en a3 avec une echelle papier au niveau du traceur 1:1. Parce que l'espace papier est occupé par un ensemble d'entité qui tiennent sur un format a3 , echelle 1:1. " Plus haut egalement: "Boucler sur les présentation du plans et lancer une commande traceur en lisp je sais faire, je choisis le mode etendu echelle1:1 Mode centré. Ca fonctionne. la seule inconnu est de determiner si mon impression doit être en mode portrait ou paysage en fonction de l'occupation de l'espace papier.... Sinon l'impression est tronquée" X signifie la totalité des entités, calque actif ou non, gelé ou non, la totale ! je l'ai dit plus haut plus haut >>> "dans mon esprit la sélection prend toute les entités de l'espace papier de la présentation courante, calque gelé ou non. (ssget "X" (list (cons 410 (getvar "CTAB")) (cons 67 1))) j'ai testé evec "A" le resultat est le même. Si tu veux bien prendre le temps de tester le fichier exemple que tu m'as demandé et que j'ai fourni, tu verras qu'il n'y a pas de calque gelé, d'ou mon incompréhension du resultat. il faut penser à aller voir les aides fournies sur le net, rien que sur mon site, j'explique ça en long et en large… je ne pensais pas avoir fait tout ça pour rien. >> Tu n'as pas fait ça pour rien puisque je m'en suis dejà inspiré plusieurs fois pour d'autres problème à resoudre, et j'ai relu attentivement le chapitre ssget. Je te remercie au passage du partage. Il est rare que je pose une question sur un forum, en général je cherche et je trouve par moi même. si j'en arrive à poster c'est que je ne trouve pas la solution. "Dans toute forme de programmation il faut que le programme comprenne ce qu'attend l'utilisateur, si on a du mal à l'exprimer en langage naturel, le langage machine sera confus." >> POur situer mon personnage qui à 60ans, j'ai commencé la prog en assembleur sur apple2e. Je te fais grâce de toutes mes autres experiences. Lisp n'est pas mon coeur de metier, et je n'y reviens que tres épisodiquement lorsqu'il y a un probleme à resoudre, d'ou mes dificultés . Et c'est pas comme le velo , si tu pratiques pas tu recommences tout. Philippe
didier Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Ah !!! je crois que je viens de comprendre, ouais en même temps je suis sûr de rien. Ce ne serait pas le sens d'insertion du cartouche qui va définir le sens portrait ou paysage. C'est dans quel onglet de présentation que le résultat est inattendu ? Dans la présentation1(4), il faut faire une rotation pour imprimer en paysage sans rogner, ce n'est pas le traceur qui déconne, c'est la présentation. Éternel débutant... Mon site perso : Programmer dans AutoCAD
Olivier Eckmann Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Bonjour, Dans une présentation, il y a toujours 1 fenêtre qui est la présentation en elle-même, puis les autres fenêtres. La dimension "anormale", c'est cette fenêtre. Dans la présentation 1(4) elle possède le Handle 435 Commande: LS LISTE Sélectionner des objets: (handent "435") <Nom d'entité: 23b824caed0> 1 trouvé(s) 1 était la fenêtre de l'espace papier. Par contre je ne sais pas comment la distinguer des "vraies" fenêtres pour la filtrer dans l'évaluation du boundingbox. Olivier
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Bon, je lache l'affaire... Merci Luna qui a compris dés mon premier message mon problème et qui m'a tout de suite donné la solution. Je vais continuer a cherché le pourquoi du resultat du ssget. Je vous remercie tous. Sujet clos. Philippe
didier Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 soit ! Éternel débutant... Mon site perso : Programmer dans AutoCAD
Luna Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 @Olivier Eckmann, Il y a 1 heure, Olivier Eckmann a dit : Par contre je ne sais pas comment la distinguer des "vraies" fenêtres pour la filtrer dans l'évaluation du boundingbox. Pourquoi ne pas faire un traitement post-sélection (à priori le nombre d'objets n'est pas démentiel sur chaque présentation) pour filtrer par rapport aux codes DXF 40 et 41 ? Certes dans un cas général, cela ne servirait absolument à rien et je ne vois pas non plus comment la filtrer de la sélection, mais dans ce cas spécifique on a comme donnée d'entrée : Il y a 2 heures, phil 54 a dit : Tout ce qui est sur , c'est que les impressions doivent se faire en a3 avec une echelle papier au niveau du traceur 1:1. Parce que l'espace papier est occupé par un ensemble d'entité qui tiennent sur un format a3 , echelle 1:1. Donc on peut vérifier pour chaque entité de type VIEWPORT si ses propriétés de hauteur (DXF 41) et/ou de largeur (DXF 40) sont supérieures aux propriétés ISO d'un format A3 et supprimer l'entité du jeu de sélection avant l'utilisation de (LM:ssboundingbox) sur le jeu de sélection si c'est le cas... Enfin bon, je ne me suis pas amusé à tester un programme pour voir si cela peut fonctionner ou pas, donc je te laisse voir si chat fonctionne pour toi @phil 54 je n'ai pas trop le temps de vérifier par moi même ^^" Bisous, Luna
Olivier Eckmann Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 @Luna, A priori, la fenêtre correspondant à la présentation possède le drapeau 68 mis à 1 car c'est la 1ère viewport créée lors de la création de la présentation, bien avant que l'on puisse en dessiner d'autres. Je pense que passer par une sélection graphique résoudrait le problème des objets "invisibles" qui risqueraient d'être sélectionné par un ssget "_X" (par exemple un texte contenant simplement un espace, donc sans représentation graphique, non sélectionnable, mais présent dans la base). Un zoom étendu, puis un zoom 0.9X puis un ssget par fenêtre depuis le coin BG=> HD serait plus judicieux, ou alors exclure de la boite englobante les objets qui sortent de l'emprise d'un zoom étendu. Olivier
Luna Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 @phil 54, Si jamais tu as besoin de tester rapidement la représentation du (LM:ssboundingbox), je te suggère d'utiliser la commande d'exemple de LeeMac située en bas de la page de cette fonction. Si besoin, je l'ai passée sous forme de fonction pour pouvoir récupérer le VLA-Object créé et le retour de (LM:ssboundingbox) afin de pouvoir supprimer l'objet facilement ou modifier ses propriétés et également avoir les corner : ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; | | ; ; | HISTORICAL TRACKING FILE OF THE FUNCTION | ; ; | --{ PVBB-Draw }-- | ; ; | | ; ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; []-----------------------[] PVBB-Draw []-----------------------[] ; ;--- Date of creation > 04/01/2017 ; ;--- Last modification date > 04/07/2022 ; ;--- Author > LeeMac ; ;--- Version > 1.3.0 ; ;--- Class > "DtSel" ; ;--- Goal and utility of the main function ; ; For a selection set, it will construct a bounding box surrounding all objects in the selection. ; ; If all objects in the selection are coplanar and reside in a plane parallel to the WCS plane, the following program will construct the 2D ; ; rectangular bounding box in the form of a 2D LWPolyline. ; ; If any object in the selection resides in a different construction plane, the program will construct the 3D cuboid bounding box in the form of ; ; a 3D solid. ; ; ; ;--- Declaration of the arguments ; ; The function (PVBB-Draw) have 1 argument(s) : ; ; --• sel > corresponds to the selection set you want to see its bounding box ; ; (type sel) = 'PICKSET | Ex. : (ssget), (ssget "_I"), ... ; ; ; ;--- List of dependent's functions ; ; --• "DtSel" ---> LM:ssBoundingBox | v1.2.0 - 04/01/2017 (LeeMac) ; ; ; ;--- Return ; ; The function (PVBB-Draw) returns a dotted pair list with the VLA-Object of the new created object representing the bounding box as the key, and ; ; the bottom left and upper right corners coordinates as the value of the dotted pair, nil otherwise. ; ; Ex. : (PVBB-Draw (ssget)) returns (#<VLA-OBJECT IAcad3DSolid 0000024ea35f9428> (-20.7107 -20.7107 0.0) (120.711 120.711 50.0)) or nil ; ; ; ;--- Historic list of the version with their modification status ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v1.3.0 | Adapt the command example from LeeMac site (Selection set Bounding Box) into a function | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v1.2.0 | Creation of the function | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; ; (defun PVBB-Draw ( sel / box obj spc ) (if (and (setq box (LM:ssboundingbox sel)) (setq spc (vlax-get-property (vla-get-activedocument (vlax-get-acad-object)) (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace ) ) ) (if (equal 0.0 (apply '- (mapcar 'caddr box)) 1e-6) (progn (setq obj (vlax-invoke spc 'addlightweightpolyline (apply 'append (mapcar '(lambda ( x ) (mapcar '(lambda ( y ) ((eval y) box)) x)) '( (caar cadar) (caadr cadar) (caadr cadadr) (caar cadadr) ) ) ) ) ) (vla-put-closed obj :vlax-true) (vla-put-elevation obj (caddar box)) obj ) (setq obj (apply 'vlax-invoke (vl-list* spc 'addbox (apply 'mapcar (cons '(lambda ( a b ) (/ (+ a b) 2.0)) box)) (apply 'mapcar (cons '- (reverse box))) ) ) ) ) ) (cons obj box) ) ) @Olivier Eckmann, J'avais aussi pensé au code DXF 68 mais je n'ai pas pris le temps de vérifier si cela est une généralité ou s'il existe des exceptions à la règle... Filtrer la sélection pour ignorer certaines entités sans valeur graphique serait en effet judicieux (car bien souvent, même un texte utile mais avec une largeur/hauteur totalement démesurée par rapport au texte saisi, c'est une erreur récurrente ...) ! Le problème viendrait dans ce cas de la présentation "Présentation1 (2)" car il n'y a pas d'entités graphiques qui englobent les VIEWPORT, c'est pour cela que l'on est un peu contraint d'accepter les VIEWPORT dans la sélection des entités... Je viens de remarquer également autre chose de VRAIMENT intéressant ! Les codes DXF 14 et 15 des entités LAYOUT 😉 En regardant rapidement si les LAYOUT avait des infos utiles, dans la liste DXF ces deux codes représentent tout simplement les coordonnées des corners bas gauche (DXF 14) et haut droit (DXF 15) de la bounding box de la présentation : Citation 14 -> Etendue minimale pour cette présentation (définie par EXTMIN tant qu'elle demeure la présentation courante) : 14 -> Etendue maximale pour cette présentation (définie par EXTMAX tant qu'elle demeure la présentation courante) : Donc reprendre mes exemples de prog pour la propriété "CanonicalMediaName" pour récupérer la liste des VLA-Object des LAYOUT et faire un (enget) sur leur ename (vlax-vla-object->ename) pour récupérer ces valeurs. Pas besoin de passer par (LM:ssboundingbox) ou de filtrer les entités finalement ^^ Bon sur ce, je retourne me coucher je suis épuisée -_- Bisous, Luna
phil 54 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Bonjour à vous Merci d'avoir pris du temps pour me répondre. J'ai testé (LM:ssboundingbox) il répond au besoin et fonctionne correctement lorsque j'utilise l'exemple de Lee mac avec une sélection à la souris. Là ou ça coince c'est quand je remplace (ssget) dans son exemple par (ssget "X" (list (cons 410 (getvar "CTAB")) (cons 67 1))) qui semble prendre des entités invisibles que je ne sais pas identifié. Comme dit dans le site da-code, j'imagine que c'est une entité type VIEWPORT. J'ai provisoirement contourné le problème par une solution peu académique mais qui semble fonctionner correctement dans ce que j'ai testé, toujours dans l'exemple de Lee Mac: (defun c:test ( / box obj sel spc ) (command "select" "tout" "") (if (and (setq sel (ssget "_P")) (setq box (LM:ssboundingbox sel)) (princ box) ; pour vérifier la coherence du retour. ) ..... J'ai pas réussi à intégrer "command" au bout de "setq sel .... " sans erreur à l'execution... le contenu de box me donne les coordonnées de la diagonale de la surface occupée par les entités visibles et je vais pouvoir appliquer le mode portait/paysage en fonction. Je vais également consulter ce que représente les codes dxf que vous avez évoqués et tenter de dormir moins bête ce soir. Avec mes sinceres remerciement. Philippe
Luna Posté(e) le 6 juillet 2022 Posté(e) le 6 juillet 2022 Coucou, Bon à priori mes explications manquent un peu de clarté ^^" (defun PayOrPor (lst / ctb nam ent box DIx DIy fmt ort layouts) (setq lst (mapcar 'strcase lst) ctb (getvar "CTAB") ) (vlax-for lay (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object))) (and (setq nam (vla-get-Name lay)) (member (strcase nam) lst) (setvar "CTAB" nam) (setq ent (vlax-vla-object->ename lay)) (setq box (cons (cdr (assoc 15 (entget ent))) (list (cdr (assoc 14 (entget ent)))))) (setq DIx (abs (apply '- (mapcar 'car box)))) (setq DIy (abs (apply '- (mapcar 'cadr box)))) (not (zerop DIx)) (not (zerop DIy)) (cond ( (and (< DIy DIx) (<= DIx 210) (<= DIy 148)) (setq fmt "A5" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 148) (<= DIy 210)) (setq fmt "A5" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 297) (<= DIy 210)) (setq fmt "A4" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 210) (<= DIy 297)) (setq fmt "A4" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 420) (<= DIy 297)) (setq fmt "A3" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 297) (<= DIy 420)) (setq fmt "A3" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 594) (<= DIy 420)) (setq fmt "A2" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 420) (<= DIy 594)) (setq fmt "A2" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 841) (<= DIy 594)) (setq fmt "A1" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 594) (<= DIy 841)) (setq fmt "A1" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 1189) (<= DIy 841)) (setq fmt "A0" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 841) (<= DIy 1189)) (setq fmt "A0" ort "Portrait")) ) (setq layouts (cons (cons nam (list ort fmt DIx DIy)) layouts)) ) ) (setvar "CTAB" ctb) (reverse layouts) ) Pour me faire pardonner, rentre en ligne de commande (PayOrPor (layoutlist)) Le but du (setvar "CTAB" nam) pour chaque présentation c'est uniquement dans le but de s'assurer que les codes DXF 14 et 15 ont été mis à jour (car si on dessine une entité dans une présentation et que l'on étudie les codes DXF 14 et 15 de cette même présentation sans qu'il y ait eut un régénération de la présentation en question, ils seront faux) Normalement cela devrait te renvoyer une liste de ce genre là : (("Présentation1" "Paysage" "A4" 245.093 179.28) ("Présentation2" "Paysage" "A3" 370.706 285.048)) Avec du coup pour chaque élément de la liste : Si x = ("Présentation1" "Paysage" "A4" 245.093 179.28) Alors on a : (car x) = "Présentation1" (cdr x) = ("Paysage" "A4" 245.093 179.28) (cadr x) = "Paysage" (caddr x) = "A4" (cadddr x) = 245.093 (last (cdr x)) = 179.28 Sur ton .dwg d'exemple on obtient (après avoir supprimé les textes indiquant le résultat désiré) : ( ("Présentation1" "Paysage" "A2" 400.0 300.0) ("Présentation1 (2)" "Paysage" "A2" 400.0 300.0) ("Présentation1 (3)" "Portrait" "A2" 300.0 400.0) ("Présentation1 (4)" "Portrait" "A2" 300.0 369.132) ) Donc il me semble que tu n'as pas le bon format dans ton .dwg d'exemple ou alors mes souvenirs en matière de format de papier sont faux... Bisous, Luna
phil 54 Posté(e) le 6 juillet 2022 Auteur Posté(e) le 6 juillet 2022 Bonjour Luna merci pour tout ça , effectivement les présentations du fichier exemple sont construites sur un rectangle 400x300 qui depasse le a3, le but était au départ d'identifier une géométrie verticale ou horizontale. Les plans de la base ne depassent pas (en theorie) 400x280 mais je ne suis sur de rien... Dans mon contexte ce n'est pas grave. J'ai testé ton code sur un plan base, c'est bien le a3 qui sort bien entendu. Il sera toujours temps de refaire les mises en page sur les plans au fur et à mesure de leur reprise. comme je l'ai dit, ~15000, c'est pas demain la veille que tout sera carré. J'ai compris l'essentiel du code fourni, même si je n'ai quasiment jamais utilisé vlax. J'ai testé hier l'ensemble avec le code lee mac. Ca fonctionne egalement. Je vais adapter une parti de ton code si tu le permet, dans le reste de mon propre code. Ca me permettra de le comprendre. En effet j'ai d'autre contraintes , détection d'un nom de présentation en particulier, détection de la présence d'un gabarit particulier, avec un traitement particulier également, tous les plans ne sont pas formaté d'une maniere homogene. En tout cas je te remercie vivement de ta patiente et du temps passé. Philippe
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