AutoCAD - Francais

AutoCAD - Francais

Répondre
Contributor
Mélanie_
Envois : 20
Inscrit : ‎03-11-2014
Message 21 sur 31 (219 visites)

Re : Création d'un lisp pour placer des points altimétriques

04-01-2014 12:37 AM en réponse à : _gile

Merci beaucoup, j'ai réussit à le faire fonctionner.

 

Pourrais-tu m'expliquer comment on fait la mise à jour automatique des attributs ? Car une fois que j'ai copier mes blocs j'aimerais modifier la valeur de l'attribut sans modifier les valeurs des premiers attributs

*Expert Elite*
_gile
Envois : 2 103
Inscrit : ‎04-29-2006
Message 22 sur 31 (212 visites)

Re : Création d'un lisp pour placer des points altimétriques

04-01-2014 09:34 AM en réponse à : Mélanie_

Si tu as une version 2012 ou supérieure, tu peux utiliser les nouvelles fonctions GetPropertyValue et SetPropertyValue.

Pour récupérer la valeur de l'attribut dont l'étiquette est : "VALEUR" dans le bloc assigné à la variable 'bloc'

(GetPropertyValue bloc "VALEUR")

Pour attribuer la valeur "toto" à l'attribut dont l'étiquette est : "VALEUR" dans le bloc assigné à la variable 'bloc'

(SetPropertyValue bloc "VALEUR" "toto")

 

Si tu n'as pas 2012, ça va être plus compliqué, il va falloir récupérer l'entité attribut à l'intérieur de bloc avec entnext et traiter directement cette entité par ses propriétés DXF avec entmod.

entnext retourne le nom d'entité (ENAME) de l'entité créé juste après l'entité qui lui est passée en argument. Dans le cas de blocs avec attribut(s)

(entnext bloc) retourne le premier attribut dans le bloc (pour les attributs suiavnt, il faut faire une boucle avec while).

Tu as de la chance, ton bloc n'a qu'un attribut.

Donc pour récupérer l'attribut, on fait :

(setq att (entnext bloc))

 On obtient les propriétés DXF de l'entité en faisant :

(setq propList (entget att))

 La valeur de l'attribut correspond au code de groupe 1 dans la liste :

(setq val (cdr (assoc 1 propList)))

 Pour modifier une valeur d'attribut, il faut passer à entmod la liste de propriétés DXF modifiée. Pour modifier la liste, il faut substituer au groupe 1 existant (c'est une paire pointée du type : (1 . "laValeur")) un nouveau groupe 1 avec la fonction subst.

(setq porpList (subst (cons 1 "nouvelleValeur") (asso 1 propList) propList))
(entmod propList)

 

 

Gilles Chanteau
Contributor
Mélanie_
Envois : 20
Inscrit : ‎03-11-2014
Message 23 sur 31 (202 visites)

Re : Création d'un lisp pour placer des points altimétriques

04-02-2014 07:12 AM en réponse à : Mélanie_

  J'ai une version 2014, du coup j'ai essayer GetPropertyValue et SetPropertyValue. Vue que GetPropertyValue permet de prendre la valeur de l'attribut, dans SetPropertyValue on pourrait remplacer la nouvelle par celle de l'ancien + 10 par exemple, non ?

 

	;On le sélectionne le point où seront placés des nouveaux blocs parallèle aux anciens
	(setq pt8 (getpoint "\nSélectionner le point suivant à l'axe :"))
(setq dis (getdist "\nDonner l'écart par rapport au point de base :")) ;Si (if ;Blocs n'est pas vide (/= blocs nil) ;Alors (progn (foreach bloc blocs ;On copie les blocs qui sont dans la liste "Blocs" (command "_copy" bloc "" ptbase pt8 "") (setq lst (entlast)) (setq val (GetPropertyValue lst "VALEUR")) (setq nvval (+ val dis)) (SetPropertyValue lst "VALEUR" nvval) );End foreach );end progn nil );End if

 Car je voudrais que toute les nouvelles valeurs ne deviennent pas que 10 ou "toto".


  Dès que j'enlève les guillemets à la nouvelle valeur pour mettre un nombre cela me met une erreur.

*Expert Elite*
_gile
Envois : 2 103
Inscrit : ‎04-29-2006
Message 24 sur 31 (195 visites)

Re : Création d'un lisp pour placer des points altimétriques

[ modifié ]
04-02-2014 12:42 PM en réponse à : Mélanie_

Encore un fois (et je risque de finir par me lasser) choisis des noms de variables qui correspondent à ce que contient la variable : pt, pt1, pt2 pour des points, lst, lst1, lst2, pour des listes, ptLst pour une liste de points, mais pas :

(setq lst (entlast))

(entlast) retourne un nom d'entité (type ENAME) donc fait plutôt :

(setq ent (entlast))

ou

(setq bloc (entlast))

ton code sera ainsi beaucoup plus lisible et compréhensible, même pour toi.

 

Une valeur d'attribut est toujours une chaîne de caratère (type STR)

L'expression :

(GetPropertyValue lst "VALEUR")

retourne donc un chaîne de caractère qu'il va falloir convertir en nombre (réel ou entier) pour pouvoir lui ajouter 10, puis convertir le résultat en chaîne pour pouvoir le passer en argument à SetPropertyValue.

 

Regarde l'aide pour les fonctions de conversion de chaîne en nombre : atoi et atof  et pour les conversion de nombre en chaîne itoa et rtos (que tu as déjà utilisé).

 

Gilles Chanteau
Contributor
Mélanie_
Envois : 20
Inscrit : ‎03-11-2014
Message 25 sur 31 (174 visites)

Re : Création d'un lisp pour placer des points altimétriques

[ modifié ]
04-09-2014 06:51 AM en réponse à : Mélanie_

Merci beaucoup Gile pour ton aide, mon lisp fonctionne bien.

Maintenant je vais essayer de l'améliorer.

Je voulais savoir comment on fait si un jour on veut modifier d'un seul coup toutes les valeurs d'attribut, juste en modifiant la valeur du premier attribut à la main et que du coup les autres changent automatiquement.

Par exemple 3 jours après avoir fait mon plan avec ma fonction alti, je veux changer les valeurs de mes attributs car elles sont toutes augmentées de 5.

Il y a-t-il une possibilité de faire ceci ?

*Expert Elite*
_gile
Envois : 2 103
Inscrit : ‎04-29-2006
Message 26 sur 31 (163 visites)

Re : Création d'un lisp pour placer des points altimétriques

04-09-2014 02:28 PM en réponse à : Mélanie_

Ce que tu demandes est possible en utilisant les réacteurs. Mais la manipulation des réacteurs demande une maitrise du LISP (et des fonctions Visual LISP) qui dépasse, à mon avis, largement le niveau que tu semble avoir.

 

Par contre, tu peux essayer de faire un commande qui demande à l'utilisateur la valeur à ajouter (elle peut être négative) puis, le programme sélectionne tous les blocs et modifie leurs attributs en conséquence.

Gilles Chanteau
Contributor
Mélanie_
Envois : 20
Inscrit : ‎03-11-2014
Message 27 sur 31 (126 visites)

Re : Création d'un lisp pour placer des points altimétriques

04-23-2014 05:36 AM en réponse à : _gile

Désolée de répondre que maintenant mais j'ai été assez occuper dernièrement.

Si je comprend mieux en créant une nouvelle fonction qui utiliserai le même principe que :

(GetPropertyValue bloc "VALEUR")
(SetPropertyValue bloc "VALEUR" "toto")

 Il va forcément retrouver les bons blocs ?

Ou il faut que je rappelle à un moment le nom de mon bloc ?

Et que si on reprend le nom de la liste cré dans l'autre fonction cela marche ?

 

Car j'ai commencé à essayer mais apparemment il ne trouve pas les blocs qui sont sur mon dessin

 

Merci d'avance 

Contributor
Mélanie_
Envois : 20
Inscrit : ‎03-11-2014
Message 28 sur 31 (93 visites)

Re : Création d'un lisp pour placer des points altimétriques

05-05-2014 09:11 AM en réponse à : Mélanie_

Bonjour, 

Cela fait plusieurs jours que j'essaye de faire un lips pour mettre à jour automatiquement les attributs de mes blocs, en vain...

Je n'arrive pas à utiliser correctement les DXF, je me mélange un peu...

 

Est-ce quelqu'un pourrait aider au moins pour le début ?

 

Merci d'avance

*Expert Elite*
_gile
Envois : 2 103
Inscrit : ‎04-29-2006
Message 29 sur 31 (72 visites)

Re : Création d'un lisp pour placer des points altimétriques

05-09-2014 07:14 AM en réponse à : Mélanie_

Salut,

 

Essaye d'expliquer le plus clairement possible ce que tu souhaites faire. Décrire une procédure de manière logique est la première étape incontournable du développement. Il ne faut jamais perdre de vur que programmer c'est s'adresser à une machine qui, quoi que dotée d'une grande puissance de calcul, est parfaitement dénuée d'intelligence et ne fera que ce qu'on lui demande à condition de lui fournir tous les éléments nécessaire pour le faire.

 

Et poste ce que tu as déjà écrit comme code en essayant de faire en sorte que le code soit propre et lisible par ceux qui seraient susceptibles de t'aider.

Gilles Chanteau
*Expert Elite*
_gile
Envois : 2 103
Inscrit : ‎04-29-2006
Message 30 sur 31 (59 visites)

Re : Création d'un lisp pour placer des points altimétriques

05-13-2014 05:55 AM en réponse à : _gile

Je n'ai pas le temps de faire plus que de te donner un code tout fait avec des commentaires.

 

(defun c:MajVal	(/ add jeuSel index bloc valAtt valNum) ; déclaration des variables locales

  ;; on demande à l'utilisateur de spécifier la valeur à ajouter (ou soustraire)
  ;; et le programme ne continue que si l'utilisateur donne une réponse
  (if (setq add (getreal "\nEntrez la valeur à ajouter à tous les attributs: "))
    (progn

      ;; sélection automatique de tous les blocs "blocaltimel" de l'espace objet
      (setq jeuSel (ssget
		     "X"		      ; option "X" pour tout sélectionner
		     (list		      ; filtre de sélection :
		       (cons 0 "INSERT")      ; référence de bloc
		       (cons 2 "blocaltimel") ; nom du bloc
		       (cons 410 "Model")     ; espace objet
		     )
		   )
      )

      ;; on vérifie que des blocs "blocaltimel" ont été sélectionnés
      (if jeuSel

	;; alors...
	(progn
	  ;; initialisation de l'index
	  (setq index 0)

	  ;; tant que le jeu de sélection contient une entité à l'index spécifié
	  (while (setq bloc (ssname jeuSel index))

	    ;; on récupère la valeur de l'attribut "VALEUR"
	    (setq valAtt (getPropertyValue bloc "VALEUR"))

	    ;; si la valeur représente bien une valeur numérique...
	    (if	(setq valNum (distof valAtt))
	      ;; ...on modifie la valeur de l'attibut
	      (setPropertyValue bloc "VALEUR" (rtos (+ valNum add)))
	    )

	    ;; on incrémente l'index pour passer au bloc suivant
	    (setq index (1+ index))
	  )
	)

	;; sinon...
	(prompt "\nAucun bloc 'blocaltimel' dans le dessin.")
      )
    )
  )
  (princ) ;_ sortie silencieuse
)

 

Gilles Chanteau
Post to the Community

Have questions about Autodesk products? Ask the community.

New Post