Aller au contenu

4 nouvelles fonctions AutoLISP dans A2012


(gile)

Messages recommandés

Salut,

 

Quatre nouvelles fonctions AutoLISP sont apparues dans la version 2012 pour palier un (tout petit) peu à l'absence des fonctions vla(x) dans AutoCAD pour Mac. Ces fonctions sont aussi accessibles avec les versions Windows (voir ici) :

- dumpallproperties : liste les propriétés pour l'entité (vlax-dump-object).

- getpropertyvalue : obtient la valeur de la propriété (vlax-get-property).

- ispropertyreadonly : évalue si la propriété est en lecture seule (vlax-property-available T).

- setpropertyvalue : définit la valeur de la propriété (vlax-put-property).

 

Ceci montre bien que si Autodesk le voulait, AutoLISP pourrait évoluer sans dépendre d'interface propriétaire comme COM/ActiveX et exposer directement des fonctionnalités ObjectARX...

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

Lien vers le commentaire
Partager sur d’autres sites

Salut Gile,

 

Je prend note de l'info.

 

Je n'ai pas encore eu l'occasion de travailler avec la 2012...

Mais maintenant que j'ai mon nouveau PC, je vais tenter de passer

de 2010 à 2012.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Ceci montre bien que si Autodesk le voulait, AutoLISP pourrait évoluer sans dépendre d'interface propriétaire comme COM/ActiveX et exposer directement des fonctionnalités ObjectARX...

 

Oui j’ai déjà lu ce genre de propos notamment celui-ci http:// http://forums.augi.com/showthread.php?p=1138397#post1138397 avec un traducteur automatique, d’ailleurs je ne sais qu’en penser, notamment sur une possible (et réelle) évolution du VLisp, qu’imposerai les problèmes de compatibilité avec AutoCAD pour Mac.

 

Même si je n’utilise pas Mac un avis éclairé m’intéresserait..

A+

 

(Ps : Depuis que j’ai modestement regardé d’autres versions Lisp, il y a bien 2 ou 3 fonctionnalités que je souhaiterai retrouver dans AutoLisp, peut être serait-ce l’occasion?)

 

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ce que ça peut laisser présager (on peut toujours espérer) c'est une extension d'AutoLISP.

 

Pour l'instant, ces nouvelles fonctions ne sont qu'un moyen d'écrire plus simplement et plus lisiblement ce qu'on pouvait déjà faire en AutoLISP avec entget et entmod sans en avoir toute la puissance.

Par exemple, la propriété Normal d'un cercle est en lecture seule alors qu'on peut modifier le groupe 210 de sa liste DXF avec entmod...

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

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...

Salut,

 

Je déterre un peu ce sujet parce que, même si je ne "lispe" plus trop souvent, j'ai eu l'occasion de me repencher sur ces fonctions lors de formations ou de réponses sur des forums.

Par ailleurs, il devrait y avoir aujourd'hui beaucoup plus d'utilisateurs d'AutoCAD 2012 ou ultérieur, donc potentiellement intéressés.

 

Ces fontions qui sont donc au départ une alternative aux fonctions vla(x), se révèlent aussi être plus simple à utiiser que les listes DXF :

(setq circle (entmakex '((0 . "CIRCLE") (10 20.0 30.0 0.0) (40 . 15.0))))

Pour obtenir le centre du cercle,

(getpropertyvalue circle "Center")

est équivalent à:

(vlax-get (vlax-ename->vla-object circle) "Center")

ou :

(cdr (assoc 10 (entget circle)))

les trois retournent : (20.0 30.0 0.0)

 

Ou pour modifier le rayon du cercle:

(setpropertyvalue circle "Radius" 20.0)

fonctionne comme :

(vlax-put (vlax-ename->vla-object circle) "Radius" 20.0)

ou :

(entmod (subst '(40 . 20.0) (assoc 40 (entget circle)) (entget circle)))

 

Pour certaines entités, comme les références de bloc, ceci va beaucoup plus loin.

Les valeurs d'attribut peuvent être obtenues et/ou modifiées directement depuis le bloc où chaque étiquette d'attribut est considérée comme une propriété du bloc.

Par exemple, si la variable 'bloc' contient le nom d'entité d'une référence de bloc avec un attribut dont l'étiquette est "ID", on obtient directement la valeur de cet attribut en faisant :

(getpropertyvalue bloc "ID")

et on la modifie avec :

(setpropertyvalue bloc "ID" "007")

 

On obtient et/ou modifie aussi directement les propriétés dynamiques des blocs dynamiques.

Par exemple, si le bloc dynamique contenu dans la variable 'blocDyn' a une propriété d'étirement nommée Distance, on obtient sa valeur par :

(getpropertyvalue blocDyn "AcDbDynBlockPropertyDistance")

et on la modifie à 100.0 avec :

(setpropertyvalue ent "AcDbDynBlockPropertyDistance" 100.0)

 

Mais plus fort encore, ces nouvelles fonctions permettent d'accéder à des propriétés qui n'étaient jusque là ni exposées en DXF, ni via COM (Visual LISP), notamment certaines propriétés des solides 3D.

Par exemple, la longueur (Length), la largeur (Width) et la hauteur (Height) d'une Boite, ou le rayon (Radius) et la hauteur (Height) d'un cylindre. Ou encore, la hauteur (Height) d'un solides extrudé, la longueur (Length) d'un solide balayé,

 

 

Voilà quelques trucs que j'ai été amené à découvrir, il y en a certainement d'autres, il ne faut donc pas hésiter à faire un :

(dumpallproperties (car (entsel)))

en phase de développement pour voir s'il n'existe pas un moyen plus rapide, plus concis, voire carrément inexistant jusque là de lire ou écrire les propriétés d'une entité...

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile),

 

Merci pour le partage, très intéressant comme retour (même si j'évolue encore sous AutoCAD 2007)

 

[…], même si je ne "lispe" plus trop souvent, […]

Oui, c'est bien ce qu'il me semblait avoir détecté avec tous ces if imbriqué qui apparaissent de plus en plus dans ton code… :D

 

Amicalement Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

En effet, quelle mise à jour intéressante pour attributs, blocs dyn et solides.

 

Chez moi dumpallproperties renvoie nil sur ma 2014. C'est un peu décevant et bloque mes essais.

(tu avais écrit dumpallaproperties (un "a" en trop), je me suis permis de corriger)

 

J'ai toutefois réussi un (setpropertyvalue circle "Center" '(0 0 0)) en notant qu'il faut un point 3D.

 

Je verrai sur la 2015 si le dump veut bien fonctionner...

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

salut à tous,

Gile à bien fait de déterrer ce sujet,

je me rappelle que le setpropertyvalue avait été le seul moyen

de changer la hauteur d'extrusion de solides,

mais le plus dingue, sur une 2012, c'est que ça permet un truc infaisable en .Net (en 2012 du moins)

passer du mode niveau ou attaché une xref

(setpropertyvalue exref "IsFromOverlayReference" 0)

marche nickel

 

en fait c'est vraiment un gros regain d'interret pour le lisp, car pour moi le Net n'avait d’intérêt que lorsque j'étais bloqué par le lisp et par com

Gérald

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

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

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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 ans après...

Difficile à dire sans voir au moins le résultat de dumpallproperties ni même connaître le type d'entité concernée...

Ah oui exact, donc le type d'entité c'est une polyligne et j'essaye de récupérer ces données : https://prnt.sc/ountcj

Je ne peux pas passer par les code dxf car ils me retournent les coordonnées de mon onglet objet or je travaille dans l'espace objet (coordonnées complètement différentes)

Lien vers le commentaire
Partager sur d’autres sites

Essaye de décrire le plus clairement ce que tu cherches à faire parce que là c'est toujours très obscur.

(getpropertyvalue pline "Vertices" 0 "Position")

comme

(cdr (assoc 10 (entget (pline))))

renvoient les coordonnées du premier sommet (0) de la polyline (pline) définies dans le SCO de la polyligne. Le SCO est identique au SCG si la polyligne est dessinée sur le plan XY du SCG.

 

Si tu veux avoir les coordonnées des sommets définies dans le SCU courant (comme dans le palette des propriétés), il faut utiliser la fonction trans :

(trans (getpropertyvalue pline "Vertices" 0 "Position") pline 1)

ou

(trans (cdr (assoc 10 (entget (pline)))) pline 1)

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

Lien vers le commentaire
Partager sur d’autres sites

Essaye de décrire le plus clairement ce que tu cherches à faire parce que là c'est toujours très obscur.

 

En fait, je récupère tout les sommets de ma polyligne, je vérifie si un bloc est attaché à un de ces sommets, si c'est le cas je récupère l'attribut "NOM_BLOC" de ce bloc en question. Et en faisant des test dans l'espace objet onglet présentation, j'ai pu remarquer que les coordonnées des polylignes était complètement différentes.

 

C'est donc pour cela que je cherchais une solution à ce problème, et la fonction "trans" répond exactement à mes besoins, merci!

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é