Aller au contenu

Inserer Bloc Avec des Attributs Paramétrables


Messages recommandés

Posté(e)

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_APP

Celui-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

Posté(e)

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_AT3

Ne 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 ...

Posté(e)

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.

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

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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 possible

1

2

3

Etc...

 

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

Posté(e)

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")

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

Posté(e)

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 lisp

j'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)
)

Posté(e)

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).

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

Posté(e)

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.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é