Aller au contenu

LISP et Visual LISP, les différences entre AutoCAD et ZWCAD


Messages recommandés

Posté(e)

Bonsoir,

 

Après m'être un peu cassé la tête à faire marcher un de mes lisp sur ZWCAD, je me suis dit que ça pourrait être intéressant de tenir à jour une liste des différences entre le LISP/VLISP d'AutoCAD et celui de ZWCAD.

Ça éviterait une perte de temps à ceux qui auraient besoin de créer ou rendre compatible un lisp pour ZWCAD.

 

Voici les différences que j'ai constatées sur les versions actuelles (AutoCAD et ZWCAD 2011), si vous en connaissez ou trouvez d'autres, merci de partager l'info ! ;)

 

 

1) (vlax-get-acad-object)

 

L'équivalent ZWCAD est (vlax-get-zwcad-object), mais à ce jour (v2011) les deux fonctionnent.

 

 

2) vlax-invoke, vlax-invoke-method, vla-get...

 

Il y a des différences significatives entre les deux logiciels.

 

Exemple pour récupérer les attributs d'un bloc :

 

(vlax-invoke bloc 'GetAttributes) retourne :

 

- directement une liste dans AutoCAD

 

- un safearray dans ZWCAD

-- pour obtenir une liste (vlax-safearray->list (vlax-invoke bloc 'GetAttributes))

 

 

(vlax-invoke-method bloc 'GetAttributes) retourne :

 

- un variant contenant un safearray dans AutoCAD

-- pour obtenir un safearray, (vlax-variant-value (vlax-invoke-method bloc 'GetAttributes))

-- pour obtenir une liste, (vlax-safearray->list (vlax-variant-value (vlax-invoke-method bloc 'GetAttributes)))

 

- un safearray dans ZWCAD

-- pour obtenir une liste (vlax-safearray->list (vlax-invoke bloc 'GetAttributes))

 

(vla-GetAttributes bloc) retourne :

 

- un variant contenant un safearray dans AutoCAD (idem que vlax-invoke-method )

 

- un safearray dans ZWCAD (idem que vlax-invoke et vlax-invoke-method )

 

Sur ce coup-là, ZWCAD me paraît plus logique, les 3 méthodes renvoient le même type...

mais malheureusement aucune de ces 3 méthodes n'est compatible avec les deux logiciels simultanément. :(

 

 

3) vla-get-objectname

 

- dans AutoCAD, retourne le type d'objet en string (hihihi...) : "AcDbLine", "AcDbText", "AcDbBlockReference"...

 

- dans ZWCAD, cette méthode s'appelle [/b]vla-get-entityname[/b], et retourne des chaînes différentes : "Line", "Text", "BlockInsert"...

 

 

4) vla-get-effectivename

 

- dans AutoCAD, permet de récupérer le nom de la définition de bloc plutôt que celui de la référence (dans le cas d'un bloc dynamique)

 

- dans ZWCAD, vla-get-effectivename n'existe pas, les blocs dynamiques n'étant pas encore supportés.

 

 

5) vla-delete

 

Utilisée sur un jeu de sélection, la méthode delete provoque une erreur.

 

 

6) Type des polylignes 3D

 

Dans ZwCAD, la propriété Type (permettant de savoir/définir si la polyligne est lissée) n'est pas disponible pour les polylignes 3D.

 

 

To be continued (si nécessaire)... :P

 

 

 

[Edité le 27/3/2011 par bryce]

Posté(e)

Salut,

 

Bonne initiative (surtout pour ceux qui utilisent ZWCAD).

 

Je n'ai pas fait de tests poussés mais il semble qu'il y ait aussi des problèmes avec les fonctions vlr-* (réacteurs).

Sur ZWCAD 2010, par exemple, la fonction VLR-Miscellaneous-Reactor est reconnue (!VLR-Miscellaneous-Reactor retourne : ) mais elle est inopérante.

 

En ce qui concerne les variants et safearrays

 

Un safearray est un tableau (array) qui, dans l'interface COM (plus fortement typée qu'AutoLISP) doit contenir des objets du même type.

Un variant est un container qui permet d'emballer des des objets de types différents pour qu'il ait le même type (type variant) et permet donc de construire des safearrays de variants contenant des objets de types différents.

 

Sur ce coup-là, ZWCAD me paraît plus logique, les 3 méthodes renvoient le même type...

Les fonctions vlax-put, vlax-get et vlax-invoke d'AutoCAD datent des tous débuts du Visual LISP (versions 14 et 2000) et ont été conservées pour des problèmes de compatibilité.

Elles restent très intéressantes, à mon avis, parce qu'elles acceptent ou retournent directement des listes LISP, de plus elles semblent plus rapides que leurs homologues vla-, vlax-put-property, vlax-get-property et vlax-invoke-method.

 

mais malheureusement aucune de ces 3 méthodes n'est compatible avec les deux logiciels simultanément.

Ces problèmes de compatibilité entre AutoCAD et ZWCAD devraient pouvoir être surmontés assez facilement si on n'utilise pas les fonctions vlax-put, vlax-get et vlax-invoke (qui n'ont aucun intérêt dans ZWCAD).

 

Quand on injecte des données avec vlax-put-property, vlax-invoke-method ou vla-*, sous forme de safearray, AutCAD accepte aussi bien un variant contenant un safearray (comme indiqué dans l'aide) que directement un safearray (comme ZWCAD).

 

Quand on récupère des données sous forme de variant ou de safearray, la routine LISP ci-dessous permet de transformer aussi bien un safearray de variants qu'un variant contenant un safearray de variants en une liste LISP quel que soit le niveau d'imbrication (une matrice est [un variant contenant] un safearray de variants contenants chacun [un variant contenant] un safearray de doubles.

Cette routine devrait donc fonctionner aussi bien avec AutoCAD qu'avec ZWCAD.

 

;; gc:VariantToLispData
;; Convertit un variant ou un safearray en donnée LISP
;;
;; Argument : var variant ou safearray

(defun gc:VariantToLispData (var)
 (cond
   ((= (type var) 'variant)
    (gc:VariantToLispData (vlax-variant-value var)))
   ((= (type var) 'safearray)
    (mapcar 'gc:VariantToLispData (vlax-safearray->list var))
   )
   (T var)
 )
)

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

Posté(e)

Salut (gile),

 

Merci pour les infos sur les réacteurs, de mon côté je n'y ai pas encore touché, que ce soit sur AutoCAD ou ZWCAD.

 

une matrice est [un variant contenant] un safearray de variants contenants chacun [un variant contenant] un safearray de doubles

Celle-là j'ai dû la relire plusieurs fois ! :P

 

La fonction récursive est très intéressante, en l'utilisant systématiquement elle permettrait de faire plus facilement des lisp compatibles avec les deux logiciels.

Je pensais faire un truc comme ça, mais je me serais limité à un niveau, je n'aurais pas pris en compte les imbrications...

Merci beaucoup ! :D

Posté(e)

Bonjour,

 

en effet, il y a des différences sur les fonctions vla, vlr etc.. Des améliorations sont arrivées dans la v2011 de janvier.

En règle générale, lorsque vous avez un Lisp qui vous pose problème, vous nous l'envoyez et un développeur de ZWSOFT le corrige (en général 24h) en suggérant les améliorations et en mettant en évidence les différences (commentaires en anglais).

 

Autrement, sur le site, nous prévoyons d'ajouter dans très peu de temps une rubrique "lisp" qui proposera au téléchargement les classiques (Talus, Profilés IPN/IPE.., anse de panier etc..).

Pour certains d'entre eux, il nous faudra néanmoins l'autorisation des auteurs (Gile, Maxence Delannoy, Patrick_35) pour la publication afin de respecter les droits d'auteur... donc je lance un appel.

L'idée est de regrouper dans un même lieu bibliothèques dwg propres (claque 0, unité, pt base) et routines lisps utiles pour les utilisateurs.

 

 

 

ZW France est le distributeur de ZWCAD, ZW3D et ARCHLine en France, Belgique francophone, Suisse francophone, et Afrique francophone.

www.zwfrance.fr

Posté(e)

Joli boulot les gars.

Jamais eu 5 minutes pour y taper (alert "hello") !

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Les variables sont identiques

 

Interressant !!!

 

Peut on donc considérer que toutes les variables d'Autocad 2004 sont compatible ?

 

je sent que je faire l'essais de ce logiciel

 

avec le string récupérée par (vlax-product-key), facile de rendre compatible un lisp avec un simple if en cas d'utilisation de fonctions récalcitrantes :exclam:

 

et les variables d'environement?

 

je suis impatient de farfouillé dans le registre de ZWCAD

 

je vais l'installer cette nuit

 

Merci Bryce :D

Posté(e)

Bonjour,

 

En règle générale, lorsque vous avez un Lisp qui vous pose problème, vous nous l'envoyez et un développeur de ZWSOFT le corrige (en général 24h) en suggérant les améliorations et en mettant en évidence les différences (commentaires en anglais).

 

Ça tombe bien, je crois que j'ai trouvé un bug... :P

 

Dans l'archive ci-dessous, il y a 2 fichiers lsp et un dwg de test.

 

Le but est de lancer la commande TEST, d'entrer une valeur quelconque, de sélectionner un des rectangles, pour renseigner les attributs des blocs situés dans le rectangle.

Puis recommencer pour le rectangle d'à côté avec une valeur différente.

 

Le fichier test.lsp fonctionne dans AutoCAD et ZWCAD.

 

Le fichier vltest.lsp doit faire la même chose que test.lsp, mais en utilisant des fonctions Visual Lisp au lieu de fonctions AutoLisp.

Il fonctionne parfaitement dans AutoCAD, mais bugge dans ZWCAD (ça fonctionne à la première utilisation, mais ensuite il change systématiquement les attributs de tous les blocs, au lieu de changer uniquement ceux dans le rectangle sélectionné).

 

http://file.ahst.fr/get.php?id=4d657ed84dfad

 

 

 

[Edité le 23/2/2011 par bryce]

Posté(e)

Ok, je regarde cela :cool:

 

Par contre chez moi, j'ai test.lsp qui buggue dès le lancement (sur AutoCad et ZWCAD). J'ai raté un truc ?

 

 

[Edité le 23/2/2011 par ZWCAD-France]

ZW France est le distributeur de ZWCAD, ZW3D et ARCHLine en France, Belgique francophone, Suisse francophone, et Afrique francophone.

www.zwfrance.fr

Posté(e)

Bonsoir à toutes et tous,

 

j'ai test.lsp qui buggue dès le lancement. J'ai raté un truc ?

 

Moi aussi :

 

 

Commande: TEST

error: bad argument type

(VLA-GET-ACTIVEDOCUMENT OBJ)

(SETQ ACDOC (VLA-GET-ACTIVEDOCUMENT OBJ))

(C:TEST)

 

Par contre avec vltest, j'ai =>

 

Commande:

Command is TEST.

Input a value and select a rectangle.

Then repeat the command, input a different value, and select the other rectangle.

Commande: test

Input value: 12

Select rectangle:

 

Et =>

 

http://img.ahst.fr/data/images/testzwcad.jpg

 

 

ZWCAD 2011

 

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Salut,

 

C'est pas gagné !...

 

Il y a une erreur dans le code de test au début, il faut remplacer :

(setq acdoc (vla-get-ActiveDocument zwobj))

par

(setq acdoc (vla-get-ActiveDocument obj))

 

Avec test (sur ZWCAD 2010), j'ai d'abord une erreur avec :

(vlax-safearray->list vpt1)

vpt1 est un variant.

J'ai remplacé vlax-safearray->list par gc:VariantToLispData et ça fonctionne pour ces expressions.

 

Mais, plus loin dans le code, j'ai encore une erreur avec :

(vlax-safearray->list var)

dans gc:VariantToLispData appelé par :

(PutAttValue block "TEST" val)

var contient à ce moment là le safearray retourné par:

(vla-GetAttributes object 'GetAttributes)

 

En clair, le safearray retourné par (vlax-invoke-method block 'GetAttributes) ou (vla-getAttributes block) ne supporte pas la fonction vlax-safearray->list.

 

Pour moi, c'est un bug, peut-être est-il réparé avec la version 2011 (il faudrait que je la télécharge pour essayer).

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

Posté(e)

Re,

 

peut-être est-il réparé avec la version 2011

 

Je l'ai mais je ne me sens pas capable de modifier le code,..

 

EDIT: En faisant ce que tu dis Gilles, sur vltest.lsp, j'ai maintenant (Sur V2011) =>

 

Commande: test

error: bad argument type

(VLA-GET-ACTIVEDOCUMENT OBJ)

(SETQ ACDOC (VLA-GET-ACTIVEDOCUMENT OBJ))

(C:TEST)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Je me suis trompé, c'est l'inverse.

 

Dans test, remplacer :

(setq zwobj (vlax-get-acad-object))

(setq acdoc (vla-get-ActiveDocument obj))

par

(setq obj (vlax-get-acad-object))

(setq acdoc (vla-get-ActiveDocument obj))

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

Posté(e)

Oups désolé, à force de tester et commenter/décommenter des lignes, j'avais effectivement oubié de remplacer une variable zwobj qui traînait encore...

J'ai réuploadé les fichiers :

http://file.ahst.fr/get.php?id=4d657ed84dfad

 

(gile), le bug que tu as rencontré avec

(vlax-safearray->list vpt1) et (vlax-safearray->list var) n'existe plus dans la 2011.

 

lili2006, oui test.lsp fonctionne très bien dans AutoCAD et ZwCAD (une fois mon oubli réparé).

 

C'est vltest.lsp qui fait des trucs bizarres sur ZwCAD 2011 (sans aucune erreur, je soupçonne un bug avec vla-get-activeselectionset), alors qu'il fonctionne très bien sur AutoCAD.

Posté(e)

Re,

 

C'est vltest.lsp qui fait des trucs bizarres sur ZwCAD 2011

 

Oui, je l'ai constaté aussi !

 

Lorsque je sélectionne une valeur et le rectangle de gauche (par exemple), tout fonctionne comme il faut !

 

Ensuite, je saisi une autre valeur sur l'autre rectangle elle s'applique également sur le rectangle non sélectionné.

 

Autre remarque : le retour en arrière (u ou ctrl + z) ne fonctionne pas,'Sur AutoCAD, pas de pb,...???!!!)

 

Pour Civil3D 2011 (version dont je dispose actuellement), tout fonctionne parfaitement en effet,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Bonjour,

 

J'ai réussi à faire fonctionner vltest.lsp sur ZwCAD.

Depuis le début je pensais que le problème venait de la sélection créée par vla-get-activeselectionset, qui n'était pas libérée (les jeux de sélection se cumulaient).

J'avais essayé de libérer la sélection avec vlax-release-object, mais ça ne changeait rien.

 

Mais [/b]quand on utilise vla-clear sur la sélection[/b], tout rentre dans l'ordre ! :)

 

(defun c:test (/ obj acdoc val rectangle vlrectangle vpt1 vpt2 pt1 pt2 blocks vlblocks block val )

(vl-load-com)

(setq obj (vlax-get-acad-object))
(setq acdoc (vla-get-ActiveDocument obj))

(initget 1)
(setq val (getstring "\nInput value: "))

(while 
	(not
		(and
			(setq rectangle (car (entsel "\nSelect rectangle: ")))
			(eq "LWPOLYLINE" (cdr (assoc 0 (entget rectangle))))
		)
	)
	(princ"\nNot a rectangle !")
)

(setq vlrectangle (vlax-ename->vla-object rectangle))
(vla-getboundingbox vlrectangle 'vpt1 'vpt2)
(setq pt1 (gc:VariantToLispData vpt1))
(setq pt2 (gc:VariantToLispData vpt2))

(vla-zoomwindow obj vpt1 vpt2)

(setq blocks (ssget "_W" pt1 pt2 '( (0 . "INSERT") )) )

(setq vlblocks (vla-get-activeselectionset acdoc))
(vlax-for block vlblocks
	(PutAttValue block "TEST" val)
)
[surligneur](vla-clear vlblocks)[/surligneur]

(vla-zoomprevious obj)
(vla-regen acdoc acActiveViewport)
(princ)
)

(defun PutAttValue ( object tag val )
(mapcar
  (function
	(lambda ( attrib )
	  (and
		(eq tag (vla-get-TagString attrib))
		(vla-put-TextString attrib val)
	  )
	)
  )
  (gc:VariantToLispData (vlax-invoke-method object 'GetAttributes))
)
val
)

;; gc:VariantToLispData
;; Convertit un variant ou un safearray en donnée LISP
;;
;; Argument : var variant ou safearray
(defun gc:VariantToLispData (var)
 (cond
   ((= (type var) 'variant)
    (gc:VariantToLispData (vlax-variant-value var)))
   ((= (type var) 'safearray)
    (mapcar 'gc:VariantToLispData (vlax-safearray->list var))
   )
   (T var)
 )
)

(princ "\nCommand is TEST.\nInput a value and select a rectangle.\nThen repeat the command, input a different value, and select the other rectangle.")
(princ)

 

Par contre je suis de nouveau tombé sur un comportement bizarre :

si j'utilise vla-delete sur le jeu de sélection au lieu de vla-clear, ça provoque une erreur...

 

Pourtant en faisant un vlax-dump-object sur le jeu de sélection, la méthode delete est censée être supportée. :casstet:

Posté(e)

Bonjour,

 

voila le VLisp qui fonctionne correctement, corrigé par ZWSOFT.

http://www.zw-cad.fr/telechargement/vltest.zip

Désolé pour le retard, j'étais absent hier lundi ...

 

La commande est testv

Comme je ne suis pas (du tout) spécialiste de la chose, je vous le livre tel quel, et il marche bien :)

 

[Edité le 1/3/2011 par ZWCAD-France]

ZW France est le distributeur de ZWCAD, ZW3D et ARCHLine en France, Belgique francophone, Suisse francophone, et Afrique francophone.

www.zwfrance.fr

Posté(e)

Bonjour,

 

Merci pour le retour.

 

La correction proposée par ZWSOFT est la même que celle que j'ai trouvée tout seul, càd faire un vla-clear sur le jeu de sélection.

 

Par contre il faudrait leur demander maintenant pourquoi un vla-delete sur un jeu de sélection provoque une erreur, alors que normalement c'est une méthode supportée par ce type d'objet.

 

Voici un petit code de test à soumettre à nos amis Chinois : :P

 

(defun c:test ()
(vl-load-com)
(setq	acdoc (vla-get-ActiveDocument (setq
		obj (vlax-get-acad-object)))
)
(if (setq ss (ssget "X"))
	(progn
		(setq ss (vla-get-activeselectionset acdoc))
		(vla-delete ss)
	)
)
(princ)
)

 

Fonctionne sans problème dans AutoCAD, mais provoque une erreur dans ZwCAD.

Pourtant dans l'aide il est écrit:

 

The SelectionSet object represents one or more drawing entities which can be operated on as a single unit. To create a selection set, use the Add method. To access the SelectionSet object, use the following methods and properties:

 

Methods

AddItems

Clear

Copy

[surligneur]Delete[/surligneur]

...

  • 4 semaines après...
  • 2 mois après...
Posté(e)

Salut à tous

 

Du coup on se dirrige vers deux langages de programmation

 

autolisp et visual lisp pour autoCAD

 

et zwlisp pour zwCAD

 

pourquoi ne pas créer carrément un forum zwlisp, ce serait plus clair - je pense.

 

Vu que zwCAD à l'air d'être moins élaborer que autoCAD

 

@+

P.S.: le tracking n'a pas l'air de fonctionner sur ZWCAD 2009, quelqu"un aurait t'il une idée pour le faire fonctionner?

 

  • 1 an après...
Posté(e)

Salut,

 

J'ai un problème et je voudrais savoir si ça vient de moi ou s'il y a un bug.

 

Dans AutoCAD, l'expression suivante crée un tableau de 4 rangées et 3 colonnes inséré en 0,0.

Avec ZWCAD+ 2012, j'ai systématiquement une erreur "Erreur Automation. Aucune description n'a été entrée."

 

Merci de me dire si c'est aussi le cas chez vous, et, mieux, de me dire comment insérer un tableau en LISP si vous y arrivez.

 

(vl-load-com)
(vla-addTable
 (vla-get-ModelSpace
   (vla-get-ActiveDocument
     (vlax-get-acad-object)
   )
 )
 (vlax-3d-point '(0.0 0.0 0.0))
 4
 3
 20.0
 100.0
)

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

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é