Aller au contenu

Messages recommandés

Posté(e)

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 :rolleyes:

Lispeur éternel débutant!
Autocad Map3D 2023
Covadis-Autopist 18.2

  • 4 semaines après...
Posté(e)

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

Posté(e)

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.

Posté(e)

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ée

J'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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e) (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é par Fraid

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é