Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

à partir du lisp MAT de Patrick_35, j'ai étudié la possibilité de modifier des valeurs d'attributs pour un ensemble de blocs avec attributs.

J'ai appelé ce lisp battval.

 

Ce que j'aimerai rajouter, c'est la possibilité de saisir un champ. Y a-t-il en lisp une fonction qui permet d'avoir la boite de dialogue de la commande CHAMP et qui renvoie le texte formaté correspondant ? Un peu comme (acad_colordlg ...) ou (acad_truecolordlg ...) qui renvoient la couleur choisie par l'utilisateur.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Super !

 

Je crains que pour les champs il ne faille se le faire "à la main".

Ce qui veut dire récupérer toutes les différentes expressions de champ...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

http://www.cadforum.cz/cadforum_en/qaID.asp?tip=3676

 

J'ai trouvé un mini listing. Difficile d'en trouver un complet mais peut-être seras-tu le premier.

 

http://www.bestshareware.net/download/autofield-for-autocad.htm

à craquer :cool:

 

Autant essayer d'ouvrir les ARX et DLL d'AutoCAD.

Reflexion faite, ca ira plus vite à la main. (gile) nous le confirmera :P

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonjour

 

Super boulot zeb :D

 

J'aurai juste une remarque

C'est dommage que tu n'utilises pas activeselectionset, cela éviterai des bascules ename->vla

 

Pour les champs, pas de solution miracle

 

@+

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)

J'aurai juste une remarque

C'est dommage que tu n'utilises pas activeselectionset, cela éviterai des bascules ename->vla

 

Ce n'est pas parce que je n'aime pas : on ne peut pas ne pas aimer ce qu'on ne connait pas (hou là, c'est un peu lourd comme phrase). Donc, comme je ne suis pas réactionnaire, je m'y suis intéressé et, quand on utilise vlisp, c'est effectivement bien mieux d'éviter les vlax-ename->vla-object à tout bout de champ. Merci pour le tuyau.

 

Pour les champs, c'est dommage qu'il n'y ait pas une combine ...

 

C'était un exercice intéressant pour voir que les possibilités en DCL (Désuet Comme Langage) sont, malgré tout, importantes : tabulation dans une list_box (tabs et tabs_truncate), possibilité de double-cliquer dans la list_box (allow_accept = true qui renvoie directement sur le bouton is_default : c'est pour cette raison que mon bouton ok n'est pas is_default et que je n'ai pas pu me servir du ok_cancel; prédéfini)

Cela reste ringard, quand même... et ce n'est pas Tramber qui va nous dire le contraire

 

Amicalement

Vincent

 

 

[Edité le 19/3/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonsoir à toutes et tous,

 

Après quelques tests rapides, je pense ne pas avoir bien compris la différence entre MAT de Patrick_35 et battval de zebulon_,...

 

battval permet de changer depuis n'importe quel blocs de types différents la valeurs d'un attribut de même nature ?

 

Merci d'avance de vos éclaircissements,... ;)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Après quelques tests rapides, je pense ne pas avoir bien compris la différence entre MAT de Patrick_35 et battval de zebulon_,...

 

En fait, il n'y en a pas sur le fond. Seule la forme change. Battval est présenté comme Battman et présente plus d'informations à l'écran que MAT et fait suite à cette discussion.

MAT et Battval permettent de "propager" une valeur d'attribut à l'ensemble des attributs de tous les blocs de même nom.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonjour

 

Zeb

Je pensais que pour l'idée des champs, tu pouvais récupérer la valeur via le choix d'un attribut.

Et tant que tu y est, la possibilité de récupérer toutes les valeurs sur un bloc choisis.

ET pour terminer, la possibilité de choisir un répertoire pour modifier tous les dessins de ce répertoire, comme avec PAT

 

@+

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)

Je pensais que pour l'idée des champs, tu pouvais récupérer la valeur via le choix d'un attribut.

En fait, pour ce qui concerne les champs, je pensais faire lancer la commande champ par le lisp, faire écrire le champ dans un coin du fichier, en récupérer sa définition et la coller dans l'attribut.

Voilà mon idée générale. Je ne sais pas si c'est possible ...

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

J'ai peut-être une piste.

La routine ci-dessous retourne l'expression du champ spécifié dans la boite de dialogue de la commande native ou nil si l'utilisateur a annulé.

 

(defun GetFieldCode (/ txt code)
 (vl-cmdf "_.field")
 (and
   (while (      (while (	(vl-cmdf pause)
     )
     (vl-cmdf '(0. 0. 0.))
   )
   (setq txt (vlax-ename->vla-object (entlast)))
   (setq code (vla-FieldCode txt))
   (vla-delete txt)
 )
 code
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

C'est exactement vers quoi je voulais aller.

Les soucis avec (getfieldcode) sont :

- le fait que pour certains champs, il est possible de sélectionner un objet. La boite de dialogue devrait se fermer pour cliquer sur un objet. Il n'en est rien et je pense qu'une des boucle while n'a plus de condition d'arrêt

- il faut que les boites de dialogue DCL soient fermées quand on exécute (getfieldcode), sinon ça part en vrille et on se retrouve gravement planté.

 

Un autre soucis, concernant les attributs. Une fois que j'ai mis à jour l'attribut avec le code de champ, cela m'affiche une série de ####. C'est à dire que l'attribut nécessite une mise à jour préalable avant de s'afficher correctement. J'ai essayé avec un (vla-regen AcDoc acAllViewports), mais cela ne marche que sur la présentation courante. Les éventuels attributs qui ont été modifiés sur d'autres présentations ne sont pas mis à jour.

J'ai déposé battval modifié au même endroit.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

(gile) : super l'astuce du cmdactive, que je n'avais que vaguement vu quelque part il y a longtemps je ne sais plus où (pour être précis !)

 

Vincent : une énormité mais fieldeval a bien le bit 16 ? Je crois que le AllViewports ne décrit que les fenêtres de l'espace en cours (objet en l'occurence, on sait qu'il peut contenir plusieurs fenetres).

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

(gile) : super l'astuce du cmdactive, que je n'avais que vaguement vu quelque part il y a longtemps je ne sais plus où (pour être précis !)

 

une solution que nous devons à bonuscad. J'y suis un tout petit peu pour quelque chose, c'est pour ça que je m'en souviens ;)

 

Concernant les champs dans les attributs, je cherche l'équivalent de "Mettre à jour le champ" pour que la bonne valeur s'affiche et non pas ####. Pour ce qui est de FIELDEVAL, je ne connaissais pas, mais il est à la valeur 31 donc tous les bits à 1.

 

Amicalement

Vincent

 

 

[Edité le 23/3/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Je trouve que l'usage de cmdactive va incontestablement plus loin ici. Mais tant mieux.

 

Pour les champs, je prendrais bien 1 h pour passer voir comment ca marcherait en Vlisp.

 

Mais :

(command "mettreajourchamp" "tout" "")

ne donne rien ?

 

 

[Edité le 23/3/2010 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Mais :

(command "mettreajourchamp" "tout" "")

ne donne rien ?

 

Uniquement pour la présentation courante... Pas mieux que le (vla-regen AcDoc acAllViewports), donc.

 

2 remarques :

- quand les attributs sont de type "multilignes", la mise à jour se fait toute seule

- j'ai essayé la chose suivant, en sélectionnant un attribut simple

 

(setq e (vlax-ename->vla-object (car (nentsel))))

(vla-put-textstring e "%<\\AcVar Filename \\f \"%tc3%fn2\">%")

 

et j'ai droit à ####.

 

Il y a bien une méthode update applicable à un attribut mais (vla-update e), contrairement à ce que j'espérais, ne fait rien.

 

Amicalement

Vincent

 

 

 

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Je sais. Figures-toi que j'ai regardé vite fait.

Tu remarqueras que e a une extension dictionnary.

En fouillant à fond :

(setq alors(vla-item(vla-item (vla-getextensiondictionary obj) 0)0)) 

je tombe sur acdbField :D

Super utile :cool:

 

Pas évident de trouver des infos ou des idées, faute de temps réel pour moi...

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Merci Tramber,

Je dois dire que j'étais assez content d'avoir trouvé ce truc avec 2 (getvar 'cmdactive) imbriqués combinés avec vl-cmdf qui retourne T ou nil suivant que l'utilisateur achève la commande dans la boite de dialogue ou fasse Annuler.

 

Dommage qu'AutoCAD ne supporte pas les imbrications de fermetures temporaires de boites dialogues.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Eureka

 

J'avais besoins de remplacer une valeur dans champs dans mes attributs (ctab au lieu de clayer en expression diesel et variable autocad)

 

Un extrait du lisp

     (vlax-for blo (setq sel (vla-get-activeselectionset doc))
(foreach att (vlax-invoke blo 'getattributes)
  (and	(eq (vla-get-hasextensiondictionary att) :vlax-true)
	(setq old (entget (cdr (assoc 360 (entget (vlax-vla-object->ename att))))))
	(eq (cdr (assoc 3 old)) "ACAD_FIELD")
	(setq ent
	  (entget (cdr (last
	    (vl-remove-if-not '(lambda(x)(eq (car x) 360))
	      (entget (cdr (assoc 360
		(entget (cdr (assoc 360 old)))
	      )))
	    )
	  )))
	)
    (progn
      (foreach ele (vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent)
	(setq old ele)
	(while (vl-string-search "CLAYER" (strcase (cdr ele)))
	  (setq ele (cons (car ele) (vl-string-subst "ctab" "clayer" (cdr ele))))
	)
	(setq ent (subst ele old ent))
      )
      (entmod ent)
    )
  )
)
     )
     (vla-delete sel)

 

Après quelques tests, cela à l'air de tenir la route

Ils auraient pu faire quelque chose de plus simple chez totodesk :casstet:

 

@+

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)

Au fin fond...

 

J'ai un peu du mal à suivre tant le cheminement est complexe.

 

J'ai toutefois une question concernant la ligne

(vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent)

 

Si j'ai bien suivi, ent contient des codes de ce style

((330 . ) (102 . "}") (330 . )

(100 . "AcDbField") (1 . "_text") (2 . "%<\\_FldIdx 0>%") (90 . 1) (360 .

d'entité: 7eedcea0>) (97 . 0) (91 . 63) (92 . 0) (94 . 5) (95 . 1) (96 . 0)

(300 . "") (93 . 1) (6 . "ACFD_FIELDTEXT_CHECKSUM") (93 . 2) (90 . 2) (140 .

350.0) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 .

"ACFD_FIELD_VALUE") (93 . 3) (90 . 0) (94 . 0) (300 . "") (302 . "") (304 .

"ACVALUE_END") (301 . "") (98 . 0))

 

En quoi c'est intéressant d'analyser la paire (1 . "_text") ? Si on peut se contenter d'analyser la paire de code 2, on pourrait éviter les boucles foreach et while et ne faire qu'un

(setq ent (subst (cons 2 (vl-string-subst ...)) (assoc 2 ent) ent)))

 

Dernière question : la valeur se met-elle à jour toute seule ou bien cela nécessite un regen ?

 

Amicalement

Vincent

 

[Edité le 26/3/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut

 

Voici ce que je trouve en sélectionnant un attribut qui a pour champ une variable autocad

(setq old (entget (cdr (assoc 360 (entget (car (nentsel)))))))
(setq ent
 (entget (cdr (last
   (vl-remove-if-not '(lambda(x)(eq (car x) 360))
     (entget (cdr (assoc 360 (entget (cdr (assoc 360 old))))))
   )
 )))
)

((-1 . ) (0 . "FIELD") (330 . ) (5 . "1003F") (100 . "AcDbField") (1 . "AcVar") (2 . "\\AcVar clayer") (90 . 0) (97 . 0) (91 . 63) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . "") (93 . 1) (6 . "Variable") (93 . 0) (90 . 4) (1 . "clayer") (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 4) (90 . 4) (1 . "05") (94 . 0) (300 . "") (302 . "05") (304 . "ACVALUE_END") (301 . "05") (98 . 2))

(vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent)

((1 . "AcVar") (2 . "\\AcVar clayer") (1 . "clayer") (1 . "05"))

Maintenant, un autre attribut mais cette fois-ci, avec une expression diesel comme champ

((-1 . ) (0 . "FIELD") (330 . ) (5 . "133E5") (100 . "AcDbField") (1 . "AcDiesel") (2 . "\\AcDiesel $(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (90 . 0) (97 . 0) (91 . 63) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . "") (93 . 1) (6 . "DieselExpression") (93 . 0) (90 . 4) (1 . "$(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 4) (90 . 4) (1 . "06") (94 . 0) (300 . "") (302 . "06") (304 . "ACVALUE_END") (301 . "06") (98 . 2))

((1 . "AcDiesel") (2 . "\\AcDiesel $(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (1 . "$(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (1 . "06"))

 

Dernière question : la valeur se met-elle à jour toute seule ou bien cela nécessite un regen ?

Toujours un regen :(

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)

Merci pour les éclaircissements

 

Toujours un regen

c'est bien ce qui m'embête dans mon cas. J'ai remarqué que les attributs de type "multiligne" se mettent à jour tout seuls, contrairement aux attributs classiques.

Je suppose donc que pour les premiers il y a un réacteur qui se met en route pour modifier l'affichage de l'attribut en fonction de l'expression de champ et que pour les deuxièmes il n'y en a pas.

Et comme je ne sais pas de quel réacteur il s'agit, ni quelle méthode il met en branle je me retrouve le bec dans l'eau.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Je suis comme toi, je ne trouve pas.

J'avais trouvé une indication intéressante avec le code dxf 6

(6 . "Variable")

(6 . "DieselExpression")

(6 . "SheetSetCompName")

(6 . "ObjectPropertyName")

et donc la possibilité d'évaluer les différentes formules (ex : Diesel --> (menucmd (strcat "M=" + "code dxf 2")))

J'ai aussi changé les dxf 1,301 et 302 avec un entupd à chaque fois, que nenni

 

@+

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

  • 1 mois aprè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 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é