Topheur Posté(e) le 10 juin 2017 Posté(e) le 10 juin 2017 Mesdames, Messieurs, bonjour :) Encore et toujours le casse *** de service qui a besoin de votre science pour coder un lisp :P J'arrive presque au bout mais il y a encore quelques soucis et c'est là que j'ai besoin d'aide. J'aimerais pouvoir insérer un bloc nommé Param_APPCelui-ci est composé de 3 d'attributs (certains visible et d'autre invisible)- NOM_APP (ex. B)- TYPE_LGT (ex. T3)- N_LGT (ex. 1)Ces attributs sont remplis via les demandes utilisateur. J'ai écrit le lisp suivant (qui fonctionne avec les lignes de commandes, c'est pas très pro mais c'est tous se que j'ai trouvé pour essayer de me débrouiller tous seul). (defun c:BLOC_LGT () ;paramétrage des attributs (setq Nom_AT1 (getstring "\nentrer le Nom app :")) (setq Nom_AT2 (getstring "\nentrer le Type d'app :")) (setq Nom_AT3 (getstring "\nentrer le numero de l'APP :")) ;insert le bloc (command "_.insert" "Param_APP" pause "" "" 0) ;affecte les attribut (command "_.attedit" "N" "N" "Param_APP" "NOM_APP" "" "" Nom_AT1 ) (command "_.attedit" "N" "N" "Param_APP" "TYPE_LGT" "" "" Nom_AT2 ) (command "_.attedit" "N" "N" "Param_APP" "N_LGT" "" "" Nom_AT3 ) (princ) ) Le problème de ce code c'est que pour le 1er appartement cela fonctionne mais si j'insère une nouvelle fois mon bloc, il le renseigne correctement MAIS modifie le 1er en inscrivant en plus les infos du 2e ! En plus il m'ouvre la fenêtre de commande... Je cherche donc à faire la même chose mais je ne veux pas qu'il me modifie les blocs déjà insérer. Je précise que ce code fais partie d'un plus gros lisp. Merci de votre aide Citer
didier Posté(e) le 10 juin 2017 Posté(e) le 10 juin 2017 Coucou Je pense qu'avec ce qui suit tu t'en sors... (setq pins (getpoint"\nInsertion ?\n")) (command "_insert" "Param_APP" pins 1 1 0 Nom_AT1 Nom_AT2 Nom_AT3 ) Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 10 juin 2017 Posté(e) le 10 juin 2017 Salut, Attention à la valeur de la variable système ATTREQ quand on insère des blocs avec attributs par (command "_.insert" ...) Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 10 juin 2017 Auteur Posté(e) le 10 juin 2017 Coucou Je pense qu'avec ce qui suit tu t'en sors... (setq pins (getpoint"\nInsertion ?\n")) (command "_insert" "Param_APP" pins 1 1 0 Nom_AT1 Nom_AT2 Nom_AT3 ) Amicalement Bonjour les experts ;) Eh bien non, didier, je ne m'en sors pas. J'ai essayé ton code, il correspond à mon (command "_.insert" "Param_APP" pause "" "" 0) Se qui me permet d'insérer mon bloc, par contre la suite Nom_AT1 Nom_AT2 Nom_AT3Ne fonctionne pas. Il me répond Commande: A001 Commande inconnue (A001 étant la valeur de Nom_AT1) J'ai essayer d'y insérer la ligne (command "_.attedit" "N" "N" "Param_APP" "NOM_APP" "" "" Nom_AT1 )avant et sans les Nom_ATx mais pas mieux. Voilà le code que j'ai tester(defun c:BLOC_INS () ;paramétrage des attributs (setq Nom_AT1 (getstring "\nentrer le Nom app :")) (setq Nom_AT2 (getstring "\nentrer le Type d'app :")) (setq Nom_AT3 (getstring "\nentrer le numero de l'APP :")) ;insert le bloc (setq pins (getpoint"\nInsertion ?\n")) (command "_insert" "Param_APP" pins 1 1 0 Nom_AT1 Nom_AT2 Nom_AT3 ) (princ) ) Une idée de mon erreur ... Citer
(gile) Posté(e) le 10 juin 2017 Posté(e) le 10 juin 2017 Salut, Pour que la méthode donnée par didier fonctionne, il faut que les attributs ne soit pas prédéfinis (propriété "Prédéfini" de la définition d'attribut = "Non"). Tu peux modifier ça dans l'éditeur de blocs. Il faut aussi que la variable ATTREQ soit à 1 et que ATTDIA soit à 0.Quand on modifie des variables système dans un programme, il est de restaurer leur valeurs initiales ensuite. (defun c:BLOC_INS (/ Nom_AT1 Nom_AT2 Nom_AT3 pins attreq attdia) ;; paramétrage des attributs (setq Nom_AT1 (getstring "\nEntrer le Nom app :")) (setq Nom_AT2 (getstring "\nEntrer le Type d'app :")) (setq Nom_AT3 (getstring "\nEntrer le numero de l'APP :")) (setq pins (getpoint "\nInsertion ?\n")) ;; enregistrement des valeurs initiales des variables système (setq attreq (getvar "ATTREQ") attdia (getvar "ATTDIA") ) ;; modification des valeurs courantes des variables système (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ;; insère le bloc (command "_insert" "Param_APP" pins 1 1 0 Nom_AT1 Nom_AT2 Nom_AT3) ;; restauration des valeurs initiales des variables système (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) (princ) ) Sinon, pour que le LISP fonctionne indifféremment avec des attributs prédéfinis ou non, on peut faire quelque chose de proche de ton premier jet. Là encore, il est prudent de forcer temporairement la valeur de ATTREQ à 0 cette fois.Pour assigner les valeurs d'attribut, on peut utiliser la fonction setpropertyvalue (depuis AutoCAD 2012). (defun c:BLOC_INS (/ Nom_AT1 Nom_AT2 Nom_AT3 pins attreq) ;; paramétrage des attributs (setq Nom_AT1 (getstring "\nEntrer le Nom app :")) (setq Nom_AT2 (getstring "\nEntrer le Type d'app :")) (setq Nom_AT3 (getstring "\nEntrer le numero de l'APP :")) (setq pins (getpoint "\nInsertion ?\n")) ;; enregistrement des valeurs initiales de la variable système (setq attreq (getvar "ATTREQ")) ;; modification des valeurs courantes de la variable système (setvar "ATTREQ" 0) ;; insère le bloc (command "_insert" "Param_APP" pins 1 1 0) ;; restauration des valeurs initiales de la variable système (setvar "ATTREQ" attreq) ;; nom d'entité du bloc inséré (setq bloc entlast) ;; assignation des valeurs d'attribut (setpropertyvalue bloc "NOM_APP" Nom_At1) (setpropertyvalue bloc "TYPE_LGT" Nom_At2) (setpropertyvalue bloc "N_LGT" Nom_At3) (princ) ) Tu peux noter la déclaration locale des variables. C'est une bonne habitude à prendre. Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 10 juin 2017 Posté(e) le 10 juin 2017 Coucou Merci (gile) de me remettre dans le droit chemin,Mon utilisation du lisp se limite à des mini-routines qui fonctionnent ce ne sont pas des programmes pour des tiers qui nécessitent toutes les vérifications dont tu parles à juste titre car Topheur ne fait pas fonctionner ce qui marche chez moi.On ne connait pas le niveau de la personne à qui on répond. Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
Topheur Posté(e) le 11 juin 2017 Auteur Posté(e) le 11 juin 2017 Bonjour les experts, Alors verdict, mon bloc a uniquement des attributs qui ne sont pas prédéfini.Du coup le code n°1 fonctionne à merveille. Il ne me reste plus qu'à l'intégrer à mon lisp source. Par contre, comme je pourrais peut être avoir un jour des attributs avec des attributs prédéfini, j'ai testé le second sur mon bloc (même si je n'ai pas d'attributs prédéfini) et celui-ci ne fonctionne pas, j'ai un message d'erreur :erreur: type de données incorrect ou dépassement de données: #<SUBR @000000002a777a20 ENTLAST> Une idée du problème ? Dans tous les cas je vous remercie pour cette épine (une nouvelle fois) retirer de mon lisp. Citer
(gile) Posté(e) le 11 juin 2017 Posté(e) le 11 juin 2017 C'est une erreur de ma part :Remplace : ;; nom d'entité du bloc inséré (setq bloc entlast)par : ;; nom d'entité du bloc inséré (setq bloc (entlast)) Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 13 juin 2017 Auteur Posté(e) le 13 juin 2017 C'est une erreur de ma part :Remplace : ;; nom d'entité du bloc inséré (setq bloc entlast)par : ;; nom d'entité du bloc inséré (setq bloc (entlast)) Salut gile, J'ai essayé avec la modif, et le lisp fonctionne parfaitement. Merci à vous deux Citer
Topheur Posté(e) le 17 juin 2017 Auteur Posté(e) le 17 juin 2017 Bonjour, Mon problème et résolu mais plutôt que d'ouvrir un nouveau sujet, je vais poser la question ici (si je n'obtiens pas de réponse j'ouvrirais une nouvelle discussion). Toujours dans l'optique de gérer mon bloc dynamique, ce dernier à un paramètre de visibilité nommé Couleur et pour choix possible123Etc... Le 1 pour Noir, 2 pour Bleu, 3 pour Rouge Etc... J'ai essayé de taper la syntaxe(setpropertyvalue bloc "Couleur" "1") Évidement cela ne fonctionne pas. Est-ce que quelqu'un aurais la ligne de commande pour gérer le paramètre de visibilité afin que lorsque j'insère mon bloc dynamique celui-ci puisse être modifier ? Merci à vous Citer
(gile) Posté(e) le 17 juin 2017 Posté(e) le 17 juin 2017 Salut, Pour utiliser connaître les propriétés utilisables avec les fonctions getpropertyvalue et setpropertyvalue, tu utilises la fonction dumpallproperties sur un objet de même type :(dumpallproperties (car (entsel)))et tu auras, dans la fenêtre de texte (F2), les propriétés accessibles pour ce type d'entitié.ensuite il faut faire quelques essais. Dans le cas présent, ça devrait être :(setpropertyvalue bloc "AcDbDynBlockPropertyCouleur" "1") Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 17 juin 2017 Auteur Posté(e) le 17 juin 2017 Salut, Pour utiliser connaître les propriétés utilisables avec les fonctions getpropertyvalue et setpropertyvalue, tu utilises la fonction dumpallproperties sur un objet de même type :(dumpallproperties (car (entsel)))et tu auras, dans la fenêtre de texte (F2), les propriétés accessibles pour ce type d'entitié.ensuite il faut faire quelques essais. Dans le cas présent, ça devrait être :(setpropertyvalue bloc "AcDbDynBlockPropertyCouleur" "1") Bonjour Gile, Une fois de plus tu me sauve la mise, par contre je me suis aperçu d'une chose étrange, la méthodologie est la suivante :- l'utilisateur lance le lisp- il donne les infos demandées par le lisp (n° couleur)- il clique pour insérer le bloc Jusque là tous la bien, le lisp remplis la couleur et celle ci change (paramètre de visibilité).MAIS il me reste un attribut que l'on renseigne manuellement et si je double clique pour le renseigné il n'est pas à la bonne place ! Il se positionne sur le point d'insertion (?). Cette attribut et en position verrouiller Pour info il y a un attribut par type de couleur (quand couleur = 1 alors attribut couleur 1 visible et les autres masqués, si couleur 2 = alors attribut couleur 2 et les autres maqués, etc.) De plus, peut on remplir cette attributs en lispj'ai essayé la commande(setpropertyvalue bloc "ATT_COULEUR2" nom_app)mais cela ne marche pas (est ce parce qu'il y a un paramètre de visibilité dessus) Voici le code que j'utilise (defun c:BLOC_INS (/ Nom_AT1 ptins attreq) ;; paramétrage des attributs (setq Nom_AT1 (getint "\nEntrer le n° de couleur du premier app :")) ;boucle tant que numero_tube inférieur à 14 (while (<= Nom_AT1 14) (setq pins (getpoint "\nInsertion ?\n")) ;; enregistrement des valeurs initiales de la variable système (setq attreq (getvar "ATTREQ")) ;; modification des valeurs courantes de la variable système (setvar "ATTREQ" 0) ;; insère le bloc (command "_insert" "BLOC_ETIQUETTE_APP" ptins 1 1 0) ;; restauration des valeurs initiales de la variable système (setvar "ATTREQ" attreq) ;; nom d'entité du bloc inséré (setq bloc (entlast)) ;; assignation de la valeur du paramètre de visibilité Couleur (setpropertyvalue bloc "AcDbDynBlockPropertyCouleur" (itoa Nom_At1) ) ;incrémente le numéro de app (setq Nom_AT1 (1+ Nom_AT1 )) ) (princ) ) Citer
(gile) Posté(e) le 17 juin 2017 Posté(e) le 17 juin 2017 Salut, Pour commencer, ne laisse à l'intérieur de la boucle while que ce qui doit être répété : inutile de modifier ATTREQ deux fois à chaque itération. Sinon, tu peux essayer de modifier l'état de visibilité dans un premier temps puis modifier la valeur de l'attribut qui est visible (ne pas perdre de vue que quand on modifie une propriété dynamique d'un bloc, AutoCAD crée une nouvelle définition de bloc anonyme). Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 18 juin 2017 Auteur Posté(e) le 18 juin 2017 Salut, Pour commencer, ne laisse à l'intérieur de la boucle while que ce qui doit être répété : inutile de modifier ATTREQ deux fois à chaque itération. Sinon, tu peux essayer de modifier l'état de visibilité dans un premier temps puis modifier la valeur de l'attribut qui est visible (ne pas perdre de vue que quand on modifie une propriété dynamique d'un bloc, AutoCAD crée une nouvelle définition de bloc anonyme). Bonjour Gile, J'ai vu une erreur dans mon code est je sais pourquoi je n'arrivais pas à noter mon attribut (j'ai remplacé pins par ptins) Par contre pour palier au fait que mon attribut n'est plus placé au bon endroit, à part le déplacer dans le bloc initiale, je n'ai rien trouvé de mieux. Citer
Messages recommandés