Aller au contenu

rensigner un attribut avec un lisp


Infinicad

Messages recommandés

Bonjour,

Voilà, je cherche à faire un lisp qui à la suite d'une insertion d'un bloc, récupère les coordonnées du point d'insertion (jusque là ça va... enfin je crois)puis additionne ces coordonnées (ça devrai aller aussi...) et enfin

met le résultat dans un des attributs du bloc(là je sèche..)

Même en regardant ça:

 

(defun c:maj(/ att bl js n val)
 (if (setq js (ssget "x" (list (cons 0 "insert") (cons 2 "Cart_A3_Hyd") (cons 66 1))))
   (progn
     (setq n 0)
     (while (setq bl (ssname js n))
       (setq att (entget (entnext bl)))
       (while (/= (cdr (assoc 0 att)) "SEQEND")
         (if (= (cdr (assoc 2 att)) "DATE_DE_L'OFFRE")
           (progn
             (setq att (subst (cons 1 "Nouvelle Date") (assoc 1 att) att))
             (entmod att) 
             (setq att (list (cons 0 "SEQEND")))
           )
           (setq att (entget (entnext (cdr (assoc -1 att)))))
         )
       )
       (setq n (1+ n))
     )
   )
   (alert "le Bloc Cart_A3_Hyd n'est pas unique dans le dessin\n Abandon")

 )
)

 

Je nage...

Je comprends à peu prêt la sélection mais pas la boucle, je suis même pas sur que se soit la bonne direction.

Si vous avez des petites pistes à me donner....

Merci

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

L'expression : (setq att (list (cons 0 "SEQEND"))) est inutile.

 

L'expression qui devrait te faire passer à l'entité suivante dans le bloc est placée comme expression "sinon" dans le :

(if (= (cdr (assoc 2 att)) "DATE_DE_L'OFFRE") ...)

elle ne sera donc exécutée que si l'étiquette est différente de "DATE_DE_L'OFFRE", mais ne le sera jamais quand cette étiquette sera trouvée et on entre alors dans une boucle infinie.

 

Ton LISP corrigé :

 

(defun c:maj(/ att bl js n val)
 (if (setq js (ssget "x" (list (cons 0 "insert") (cons 2 "Cart_A3_Hyd") (cons 66 1))))
   (progn
     (setq n 0)
     (while (setq bl (ssname js n))
       (setq att (entget (entnext bl)))
       (while (/= (cdr (assoc 0 att)) "SEQEND")
         (if (= (cdr (assoc 2 att)) "DATE_DE_L'OFFRE")
           (progn
             (setq att (subst (cons 1 "Nouvelle Date") (assoc 1 att) att))
             (entmod att) 
           )
         )
  (setq att (entget (entnext (cdr (assoc -1 att)))))
       )
       (setq n (1+ n))
     )
   )
   (alert "le Bloc Cart_A3_Hyd n'est pas unique dans le dessin\n Abandon")
 )
)

 

Si tu veux quitter la boucle dès que l'attribut "DATE_DE_L'OFFRE" est trouvée dans le bloc, il faut ajouter une condition dans la boucle while avec un drapeau (T ou nil), exemple :

 

(defun c:maj (/ js n bl loop ent att)
 (if (setq js (ssget "x" '((0 . "insert") (2 . "Cart_A3_Hyd") (66 . 1))))
   (repeat (setq n (sslength js))
     (setq bl	 (ssname js (setq n (1- n)))
    loop T
    att	 (entget (entnext bl))
     )
     (while (and loop (= "ATTRIB" (cdr (assoc 0 att))))
(if (= (cdr (assoc 2 att)) "DATE_DE_L'OFFRE")
  (progn
    (entmod (subst (cons 1 "Nouvelle Date") (assoc 1 att) att))
    (setq loop nil)
  )
)
(setq att (entget (entnext (cdr (assoc -1 att)))))
     )
   )
   (alert
     "le Bloc Cart_A3_Hyd n'est pas unique dans le dessin\n Abandon"
   )
 )
)

 

Mais depuis la version 2012 et les nouvelles fonctions LISP créées pour AutoCAD for MAC (qui sont utilisables avec AutoCAD windows), changer la valeur d'un attribut est devenu beaucoup plus simple.

Les fonctions getpropertyvalue et setpropertyvalue, utilisées avec un bloc contenant des attributs, considèrent les étiquettes d'attributs comme une propriété dont la valeur est celle de l'attribut. Il n'y a donc plus besoin de faire une boucle avec entnext.

 

(defun c:maj(/ att bl js n val loop)
 (if (setq js (ssget "x" (list (cons 0 "insert") (cons 2 "Cart_A3_Hyd") (cons 66 1))))
   (progn
     (setq n 0)
     (while (setq bl (ssname js n))
(setpropertyvalue bl "DATE_DE_L'OFFRE" "Nouvelle Date")
       (setq n (1+ n))
     )
   )
   (alert "le Bloc Cart_A3_Hyd n'est pas unique dans le dessin\n Abandon")
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

salut,

incroyables ces 4 fonctions :

• • dumpallproperties

Retrieves an entity’s supported properties.

• • getpropertyvalue

Returns the current value of an entity’s property.

• • ispropertyreadonly

Returns the read-only state of an entity’s property.

• • setpropertyvalue

Sets the property value for an entity.

 

est-ce que, à l'instar des fonction non documentées vlax-put et vlax-get

elle retournes et acceptent des arguement de type "lisp" plutôt que de type "object" ?

 

Gérald

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Oui, certainement puisque ces fonctions sont là pour palier un peu à l'impossibilité d'accéder à l'API COM depuis l'OS MAC.

 

L'utilisation de ces fonctions ressemble à celle de vlax-get et vlax-put avec le même inconvénient dû à l'utilisation de chaînes de caractère pour nommer les propriétés (risque de fautes d'ortographe ou de frappe qui ne seront pas signalées par l'éditeur visual LISP).

 

En tous cas, pour lire ou écrire des propriétés, elles simplifient les choses par rapport à l'utilisation des listes DXF, notamment pour les valeurs d'attributs comme montré ci-dessus.

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour moi qui suis sous une version 2011

(setpropertyvalue bl "DATE_DE_L'OFFRE" "Nouvelle Date")

ne fonctionne pas, alors qu'avec la ligne suivante à la place j'arrive à modifier l'attribut

(vla-put-TextString (car (vlax-invoke (vlax-ename->vla-object bl) 'GetAttributes)) "Nouvelle Date")

 

Bon je n'ai fais qu'un attribut, je n'ai pas testé avec plusieurs...

 

En fin de compte, avec plusieurs, il faudrait plutôt ceci

(foreach el (vlax-invoke (vlax-ename->vla-object bl) 'GetAttributes)
(if (eq (vla-get-TagString el) "DATE_DE_L'OFFRE")
	(vla-put-TextString el "Nouvelle Date")
)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

salut,

ce qui est rigolo, c'est que le dump pour mac donne beaucoup d'infos supplémentaires, un mix

d'info événementielles, voir pour le polylignes, des infos de type vlax curve

 

il faudra un peu de temps pour voir les conséquences positives éventuelles de ces fonctions :

ci dessous un comparatif d'un vlax-dump-object et d'un dumpallproperties

(pour le visualiser, copier-coller dans un tableur avec ; comme séparateur)

Gérald

 

 
(vlax-dump-object (eobj));(dumpallproperties (enam) )
IAcadLWPolyline2: Interface AutoCAD Lightweight Polyline;
Valeurs de propriétés:;
  Application (RO) = #<VLA-OBJECT IAcadApplication 000000014090a1d8>;(class: AcDbPolyline)
;Annotative (type: bool)  (LocalName: Annotatif) = Failed to get value
;AnnotativeScale (type: AcString)  (RO)  (LocalName: Echelle annotative) = 
;Failed to get value
  Area (RO) = 51752.8;Area (type: double)  (RO)  (LocalName: Aire) = 51752.793979
;BlockId (type: AcDbObjectId)  (RO) = 7ffff6039f0
;CastShadows (type: bool) = 0
  Closed = 0;Closed (type: bool)  (LocalName: Fermé) = 0
;CollisionType (type: AcDb::CollisionType)  (RO) = 1
;Color (type: AcCmColor)  (LocalName: Couleur) = DUCALQUE
  ConstantWidth = 0.0;ConstantWidth (type: double)  (LocalName: Largeur globale) = 0.000000
  Elevation = 0.0;Elevation (type: double)  (LocalName: Elévation) = 0.000000
;EndParam (type: double)  (RO) = 3.000000
;EndPoint/X (type: double)  (RO)  (LocalName: Extrémité X) = Failed to get value
  Coordinate = ...Contenu indexé masqué...;EndPoint/Y (type: double)  (RO)  (LocalName: Extrémité Y) = Failed to get value
  Coordinates = (754.125 1135.2 1382.56 1419.34 1392.54 1312.17 ... );EndPoint/Z (type: double)  (RO)  (LocalName: Extrémité Z) = Failed to get value
  Document (RO) = #<VLA-OBJECT IAcadDocument 000000002547c3f0>;ExtensionDictionary (type: AcDbObjectId)  (RO) = 0
;
"   EntityTransparency = ""DuCalque""";Transparency (type: AcCmTransparency)  (LocalName: Transparence) = 0
"   Handle (RO) = ""BE4""";Handle (type: AcDbHandle)  (RO) = be4
  HasExtensionDictionary (RO) = 0;HasBulges (type: bool)  (RO) = 0
;HasFields (type: bool)  (RO) = 0
;HasSaveVersionOverride (type: bool) = 0
;HasWidth (type: bool)  (RO) = 0
  Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0000000038c489b8>;Hyperlinks (type: AcDbHyperlink*)
;IsA (type: AcRxClass*)  (RO) = AcDbPolyline
;IsAProxy (type: bool)  (RO) = 0
;IsCancelling (type: bool)  (RO) = 0
;IsEraseStatusToggled (type: bool)  (RO) = 0
;IsErased (type: bool)  (RO) = 0
;IsModified (type: bool)  (RO) = 0
;IsModifiedGraphics (type: bool)  (RO) = 0
;IsModifiedXData (type: bool)  (RO) = 0
;IsNewObject (type: bool)  (RO) = 0
;IsNotifyEnabled (type: bool)  (RO) = 0
;IsNotifying (type: bool)  (RO) = 0
;IsObjectIdsInFlux (type: bool)  (RO) = 0
;IsOnlyLines (type: bool)  (RO) = 1
;IsPeriodic (type: bool)  (RO) = 0
;IsPersistent (type: bool)  (RO) = 1
;IsPlanar (type: bool)  (RO) = 1
;IsReadEnabled (type: bool)  (RO) = 1
;IsReallyClosing (type: bool)  (RO) = 1
;IsTransactionResident (type: bool)  (RO) = 0
;IsUndoing (type: bool)  (RO) = 0
;IsWriteEnabled (type: bool)  (RO) = 0
"   Layer = ""0""";LayerId (type: AcDbObjectId)  (LocalName: Calque) = 7ffff603900
  Length (RO) = 1159.55;Length (type: double)  (RO)  (LocalName: Longueur) = 1159.548792
  Lineweight = -1;LineWeight (type: AcDb::LineWeight)  (LocalName: Epaisseur de ligne) = -1
"   Linetype = ""ByLayer""";LinetypeId (type: AcDbObjectId)  (LocalName: Type de ligne) = 7ffff603950
  LinetypeGeneration = -1;Plinegen (type: bool)  (LocalName: Génération du type de ligne) = 1
  LinetypeScale = 1.0;LinetypeScale (type: double)  (LocalName: Echelle du type de ligne) = 1.000000
;LocalizedName (type: AcString)  (RO) = Polyligne
"   Material = ""ByLayer""";MaterialId (type: AcDbObjectId)  (LocalName: Matériau) = 7ffff603ec0
;MergeStyle (type: AcDb::DuplicateRecordCloning)  (RO) = 1
  Normal = (0.0 0.0 1.0);Normal/X (type: double) = 0.000000
;Normal/Y (type: double) = 0.000000
;Normal/Z (type: double) = 1.000000
  ObjectID (RO) = 151;ObjectId (type: AcDbObjectId)  (RO) = 7ffff617140
  ObjectID32 (RO) = 151;
"   ObjectName (RO) = ""AcDbPolyline""";
  OwnerID (RO) = 152;OwnerId (type: AcDbObjectId)  (RO) = 7ffff6039f0
  OwnerID32 (RO) = 152;
"   PlotStyleName = ""ByLayer""";PlotStyleName (type: AcString)  (LocalName: Style de tracé) = ByLayer
  Thickness = 0.0;Thickness (type: double)  (LocalName: Epaisseur) = 0.000000
  TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000038c48e90>;ReceiveShadows (type: bool) = 0
;ShadowDisplay (type: AcDb::ShadowFlags)  (RO)  (LocalName: Affichage des 
;ombres) = Failed to get value
;StartParam (type: double)  (RO) = 0.000000
;StartPoint/X (type: double)  (RO)  (LocalName: Départ X) = Failed to get value
;StartPoint/Y (type: double)  (RO)  (LocalName: Départ Y) = Failed to get value
;StartPoint/Z (type: double)  (RO)  (LocalName: Départ Z) = Failed to get value
;
;
;Vertices (type: AcDbPolylineVertex)
;Item 0:
;    Bulge (type: double) = Failed to get value
;    EndWidth (type: double) = Failed to get value
;    Id (type: int) = Failed to get value
;    IsA (type: AcRxClass*)  (RO) = AcRxBoxedValueOnStack
;    LocalizedName (type: AcString)  (RO) =
;    Point/X (type: double) = Failed to get value
;    Point/Y (type: double) = Failed to get value
;    StartWidth (type: double) = Failed to get value
;Item 1:
;    Bulge (type: double) = Failed to get value
;    EndWidth (type: double) = Failed to get value
;    Id (type: int) = Failed to get value
;    IsA (type: AcRxClass*)  (RO) = AcRxBoxedValueOnStack
;    LocalizedName (type: AcString)  (RO) =
;    Point/X (type: double) = Failed to get value
;    Point/Y (type: double) = Failed to get value
;    StartWidth (type: double) = Failed to get value
;Item 2:
;    Bulge (type: double) = Failed to get value
;    EndWidth (type: double) = Failed to get value
;    Id (type: int) = Failed to get value
;    IsA (type: AcRxClass*)  (RO) = AcRxBoxedValueOnStack
;    LocalizedName (type: AcString)  (RO) =
;    Point/X (type: double) = Failed to get value
;    Point/Y (type: double) = Failed to get value
;    StartWidth (type: double) = Failed to get value
;Item 3:
;    Bulge (type: double) = Failed to get value
;    EndWidth (type: double) = Failed to get value
;    Id (type: int) = Failed to get value
;    IsA (type: AcRxClass*)  (RO) = AcRxBoxedValueOnStack
;    LocalizedName (type: AcString)  (RO) =
;    Point/X (type: double) = Failed to get value
;    Point/Y (type: double) = Failed to get value
;    StartWidth (type: double) = Failed to get value
  Visible = -1;Visible (type: AcDb::Visibility) = 0

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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é