Vincent P. Posté(e) le 27 avril 2018 Posté(e) le 27 avril 2018 Bien le bonjour! Alors me voici pour présenter mon dernier travaille.Le but de ce lisp sera de renseigner en "automatique" l'échelle d'une fenêtre dans le cartouche (dans une présentation, vous l'aurez compris) ;;; Par Vincent P. ;;; Créé un champ automatique affichant l'échelle d'une fenêtre dans un cartouche ou un texte. (vl-load-com) (defun c:EchCart (/ fen cart id ech) (princ "\nSelectionner une Fenêtre") (while (null (setq fen (ssget "_:S:E" '((0 . "VIEWPORT"))))) (princ "\nCe n'est pas une fenêtre")) (setq id (vla-get-ObjectID (vlax-ename->vla-object (ssname fen 0))) ech (strcat "%<\\AcExpr (1000/%<\\AcObjProp Object(%<\\_ObjId " (itoa id) ">%).CustomScale \\f \"%lu2%qf2816\">%) \\f \"%lu2%ps[1/, eme]%zs12%th39\">%")) (setq cart (car (entsel "\nSelectionner un cartouche"))) (if (= cart nil) (command "-TEXTE" (getpoint) "4" "100g" (strcat "Echelle : " ech)) (progn (setpropertyvalue cart "ECHELLE" ech) (command "METTREAJOURCHAMP" cart "")) ) (princ) ) Procédure : lancez la commande (ECHCART), sélectionnez une fenêtre, sélectionnez un bloc cartouche. Un champ est placé dans l'attribut ECHELLE du bloc. Si au lieu de sélectionner le cartouche je valide, alors je peux placer un simple texte contenant cette échelle (pratique pour les zooms/détailles) Ça marche, ... mais!J'ai réussi à consolider la première sélection. Seule une fenêtre (VIEWPORT) sera acceptée comme entité.Mais pas la seconde.Pour la seconde, si je sélectionne autre chose qu'un bloc qui contient un attribut ECHELLE ... bah ça marche plus. Il fraudait que je filtre ma sélection sur un bloc qui contient un attribut ECHELLE.Mais je souhaite conserver la possibilité de placer un texte hors du cartouche. Bon, déjà, une fois que j'aurais ça, je serais content. J'aurais surement de quoi développer après (et donc pauser plus de questions). Par avance, Merci Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
Vincent P. Posté(e) le 23 mai 2018 Auteur Posté(e) le 23 mai 2018 Bien le bonjour a vous. Mon sujet ne soulève pas grand engouement. Pas très grave, ça me force à fouiller comme un grand. ;;; Par Vincent P. ;;; Créé un champ automatique affichant l'échelle d'une fenêtre dans un cartouche ou un texte. (vl-load-com) (defun c:EchCart (/ fen cart id ech ctab) (setq ctab (getvar "Ctab")) ; trouve le nom de la présentation courante (setq fen (ssget "_A" (list (cons 0 "VIEWPORT") (cons 410 ctab)))) ; selectionne toutes les fenêtres de la présentation courante (if (= (sslength fen) 2) ; si la selectione n'a qu'une fenêtre (progn ; oui (redraw (ssname fen 0) 3) ; surbrillance de la fenettre (princ "\nFenêtre auto-selectionnée") ) (progn ; non (princ "\nSelectionner une Fenêtre") (while (null (setq fen (ssget "_:S:E" '((0 . "VIEWPORT"))))) ; selection manuelle de la fenêtre (princ "\nCe n'est pas une fenêtre")) )) (redraw (ssname fen 0) 3) ; surbrillance de la fenettre (setq id (vla-get-ObjectID (vlax-ename->vla-object (ssname fen 0))) ; isoler l'ID de la fenêtre ech (strcat "1/%<\\AcExpr (1000/%<\\AcObjProp Object(%<\\_ObjId " ; créer le champ de l'échelle (itoa id) ">%).CustomScale \\f \"%lu2%qf2816\">%) \\f \"%lu2%zs12%th39\">% eme")) (setq cart (car (entsel "\nSelectionner un cartouche"))) ; selection du cartouche (if (= cart nil) ; si mauvaise selection (command "-TEXTE" (getpoint) "4" "100g" (strcat "Echelle : " ech)) ; création d'un texte contenant l'échelle (progn ; si bonne selection (setpropertyvalue cart "ECHELLE" ech) ; insérer le champ dans l'attribut Echelle du cartouche (command "METTREAJOURCHAMP" cart "")) ; mise à jour des champs du cartouche ) (redraw (ssname fen 0) 4) ; suprime la surbrillance de la fenêtre (princ) ) Je suis asse content de mon code, la sélection automatique de la fenêtre (VIEWPORT) se fait bien lorsqu'elle est seul sur la présentation, si non sélection manuelle.La sélection du bloc cartouche est plus fragile, mais ça ne pose pas de problème particulière.J'aurais aimé établir une gestion d'erreur pour personnaliser le message qui s'affiche, mais je ne maîtrise pas bien le sujet. Diffusé à mes collègues, et ça leur convient en l'état. Si vous avez des idées/pistes pour enrichir, simplifier, renforcer ce programme, n'hésitez pas à proposer! Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
Fraid Posté(e) le 23 mai 2018 Posté(e) le 23 mai 2018 Bonjour, Mon sujet ne soulève pas grand engouement. C'est un peux normal, car le titre du post ne correspond pas à ta demande, il contient des fautes de frappes et ton lisp semble redondant. En tapant champ dans Autocad, on choisi Objets, échelle perso, et le format ainsi que la fenêtre... En tout cas bravo pour tes recherches, c'est comme cela que l'on progresse. J'aurais aimé établir une gestion d'erreur pour personnaliser le message qui s'affiche Sinon de quel message parle tu? et attention, quand on divise, il faut vérifier que le diviseur ne soit pas égal à zéro, sinon c'est fatal. https://github.com/Fraiddd
Vincent P. Posté(e) le 24 mai 2018 Auteur Posté(e) le 24 mai 2018 Bonjour Fraid, Merci pour tes conseilles, j’essaierais de faire plus propre pour le prochain sujet. :unsure: Pour les messages d'erreur, lors de la sectionnelle du bloc cartouche, 3 cas fonctionnent bien : - Je sélection un bloc qui contiens un attribut ECHELLE => mon champ se place dans l'attribut - Je clic dans le vide => créé un texte contenant le champ - Je valide => créé un texte contenant le champ Il reste deux cas qui bug le programme : - Je sélectionne une entité qui n'est pas un bloc (polyligne, fenêtre, etc...) - Je sélectionne un bloc, mais qui ne contient pas d'attribut ECHELLE.erreur: Demande ADS erronéeJ'aurais aimé remplacé ce message par quelque-chose du genre "Entité sélectionnée non valide". Pour la division par zéro, le diviseur est le facteur d’échelle d'une fenêtre, or l'échelle ne peut pas être à 0 (ou alors on tombe dans la 4eme dimension! :blink: ) Merci. Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
Patrick_35 Posté(e) le 24 mai 2018 Posté(e) le 24 mai 2018 Salut Pour vérifier que l'objet sélectionné est un bloc(setq cart (car (entsel "\nSelectionner un cartouche"))) (if (= (cdr (assoc 0 (entget cart))) "INSERT") (alert "C'est un bloc") (alert "Ce n'est pas un bloc") ) Pour vérifier que tu as bien écrit dans ton attribut(if (vl-catch-all-error-p (vl-catch-all-apply 'setpropertyvalue (list cart "ECHELLE" ech))) (alert "Erreur") (alert "OK") ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 24 mai 2018 Posté(e) le 24 mai 2018 (modifié) Bonjour, Le teste du diviseur fait partis des règles en programmation.Il est généralement difficile de prévoir le comportement d'une variable, surtout dans Autocad.Dans certains langages, si on ne prévois pas cette exception, on ne peux pas compiler.Ici, pas de compilation, raison de plus pour faire ce teste. Sinon, je pense que c'est à ce niveau (if (= cart nil) que tu doit mieux tester. ah, Patrick t'as donner la soluce Modifié le 24 mai 2018 par Fraid https://github.com/Fraiddd
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