Infinicad Posté(e) le 22 mai 2014 Posté(e) le 22 mai 2014 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 enfinmet 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
(gile) Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 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
GEGEMATIC Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 salut,incroyables ces 4 fonctions :• • dumpallpropertiesRetrieves an entity’s supported properties. • • getpropertyvalueReturns the current value of an entity’s property. • • ispropertyreadonlyReturns the read-only state of an entity’s property. • • setpropertyvalueSets the property value for an entity. est-ce que, à l'instar des fonction non documentées vlax-put et vlax-getelle retournes et acceptent des arguement de type "lisp" plutôt que de type "object" ? Gérald ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
(gile) Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 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
bonuscad Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 (modifié) 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é le 23 mai 2014 par bonuscad Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 Salut bonuscad, Ces 4 nouvelles fonctions ne sont disponibles qu'à partir d'AutoCAD 2012 (avec l'arrivée d'AutoCAD for MAC 2012). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
GEGEMATIC Posté(e) le 23 mai 2014 Posté(e) le 23 mai 2014 salut, ce qui est rigolo, c'est que le dump pour mac donne beaucoup d'infos supplémentaires, un mixd'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.frBlog: http://g-eaux.over-blog.com
Infinicad Posté(e) le 23 mai 2014 Auteur Posté(e) le 23 mai 2014 Un grand merci,puisque j'ai réussi à faire ce que voulais en comprenant presque tout.Je tente maintenant de le faire pour plusieurs nom de bloc... :blink: Merci
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant