Aller au contenu

Vla-Open + SendCommand


Patrick_35

Messages recommandés

Bonjour à vous tous

 

Je n'arrive pas pour l'instant à faire charger correctement un lisp pour l'ouverture d'un dessin :(

 

(setq doc (vla-get-documents (vlax-get-acad-object)))
(setq des (vla-open doc "Un_Dessin"))
(vla-sendcommand des "(load \"Un_Lisp\") ")

 

Le SendCommand transmet bien le load mais c'est un fonctionnement surprenant :casstet:

Le SendCommand me met sur le dessin ouvert, mais je ne vois rien qui se passe, pas de load. Je bascule sur le dessin dans lequel j'ai lancé mon lisp pour voir si tout c'est bien passé et apparemment c'est Ok. Je Rebascule sur le dessin qui a été ouvert et oh surprise, le lisp a été lancé et exécuté :o

Après plusieurs essais, il faut que je bascule d’un dessin à l’autre pour que ça fonctionne. Gênant quand on souhaite faire un traitement par lot de fichiers. Il y a bien la possibilité de passer par le AutoCAD.LSP ou encore d’écrire dans les registres pour _appload avec un lancement automatique, mais je souhaiterai éviter ces extrémités.

Toute sujétion est la bienvenue

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Quand on reste dans le même fichier, sendcommand marche bien.

 

(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) 
"_-insert ")

et peut remplacer (command ...) du lisp.

 

Sinon, dans ton cas, le fonctionnement est effectivement surprenant. On dirait que sendcommand est "asynchrone" et qu'il ne s'exécute que quand tout est bien terminé, c'est à dire quand tu reviens au fichier de départ ???

 

J'ai eu un jour un problème du même ordre et je suis passé par un fichier script (qui contient la commande open et le load) créé par le lisp et lancé à la fin du lisp. Un peu lourd, mais c'est tout ce que j'ai trouvé.

 

(defun openlisp ()
 (setq SCRFILE (strcat (getvar "TEMPPREFIX") "temp.scr"))
 (setq F (open SCRFILE "w"))
 (princ (strcat "_open \"c:\\temp\\toto.dwg\"") F)
 (princ "\n(load \"mon_lisp\")" F)
 (princ "\nmon_lisp " F)
 (close F)
 (command "_script" SCRFILE)
)

 

Notez que tempprefix renvoie

"C:\\Documents and Settings\\USERNAME\\Local Settings\\Temp\\"

et existe dans la version 2004. Pas forcément les précedentes.

 

Amicalement

 

Zebulon_

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse Zebulon_

 

Quand on reste dans le même fichier, sendcommand marche bien.

Oui

 

et peut remplacer (command ...) du lisp.

Et son avantage par rapport au command et qu'il peut être appliqué sur n'importe quel dessin ouvert dans Autocad, sans pour autant avoir activé ce dessin

 

c'est à dire quand tu reviens au fichier de départ ???

Ben oui.

 

je suis passé par un fichier script

C'est quand même dommage d'avoir accès a la table des documents et de passer par ce biais :(

 

Sinon, comme je le disais, il me reste la solution du AutoCAD.lsp avec la variable acadlspasdoc, ou encore dans les registres avec _appload mais j'attends un peu pour voir si quelqu'un à une solution plus perspicace

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Le comportement me semble tout à fait normal

 (setq des (vla-open doc "Un_Dessin"))

ouvre le dessin "Un_dessin" qui, naturellement prend la main ; le dessin original n'a plus la main et donc la ligne suivante

 (vla-sendcommand des "(load \"Un_Lisp\") ")

nest pas exécutée et reste en attente dans l'éditeur du dessin original

quand tu reviens dans le dessin original le lisp se poursuit

pour bien comprendre, tu peux essayer ceci

tu ouvres deux dessins et tu les affiches en mozaique

tu peux très bien commencer une ligne dans le premier dessin, cliquer dans le second, y tracer un cercle puis cliquer à nouveau dans le premier pour finir ta ligne.

pour les lisp c'est pareil.

 

je crois que le script est une bonne idée, effectivement

 

il y a aussi le blackboard qui serait un espace commun à tous les dessins mais je n'ai pas pratiqué.

bon courage

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse

Effectivement le black board pourrait être une solution, mais il ne stocke que des variables, hors l'idée était à partir d'un lisp, faire plusieurs opérations sur d'autres dessins, comme pour un script

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Une idée comme çà mais c'est un peu tiré par les cheveux

dans AutoCAD.LSP tu peux avoir une ligne comme celle ci

 

 (if (findfile "mylisp.lsp") (load "mylisp.lsp") )

 

dans ton appli principale,

- tu génères le fichier "mylisp.lsp" (il doit fermer le fichier à la fin)

- tu lances tous les vla-open que tu veux

- à la fin tu effaces le fichier "mylisp.lsp"

 

c'est un peu tiré par les cheveux mais çà doit marcher

 

Lien vers le commentaire
Partager sur d’autres sites

C'est bien ce que disais, sans passer par le AutoCAD.lsp, ni par les registres.

Car à ce stade, c'est plus de la bidouille qu'autre chose :( , mais si on n'a pas le choix, c'est le résultat qui compte. Tant pis pour la forme

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Le comportement me semble tout à fait normal

(setq des (vla-open doc "Un_Dessin"))

ouvre le dessin "Un_dessin" qui, naturellement prend la main ; le dessin original n'a plus la main et donc la ligne suivante

(vla-sendcommand des "(load \"Un_Lisp\") ")

nest pas exécutée et reste en attente dans l'éditeur du dessin original

quand tu reviens dans le dessin original le lisp se poursuit

 

Si ce comportement est normal, alors à quoi peut bien servir vla-sendcommand ? Si c'est juste pour remplacer (command ...) dans le fichier en cours, c'est un peu dommage.

 

Je pencherai plutôt à dire qu'il s'agit d'un comportement anormal, voire d'un bug. C'est quand même rageant de ne pas arriver à faire avec vlisp ce qu'un vulgaire script sait faire sans problème.

 

Amicalement

 

Zebulon_

 

[Edité le 7/12/2006 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Peut-être peut on voir çà comme un bug

mais il faut peut-être aussi se souvenir que vla-sendcommand n'est pas une fonction LISP, c'est une utilisation détournée par le biais des ActiveX de la méthode VBA sendcommand et que cette méthode sert, si je traduis bien ce qu'en dit l'aide VBA

Envoie une chaine sur la ligne de commande du document à partir d'une application VB ou VBA.

En fait, ce n'est pas SendCommande qui bugue c'est juste l'exécution du LISP dans le document initial qui est arrêtée au moment du Vla-Open ; la preuve, çà fonctionne dès qu'on retourne dans le document d'origine

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
Après plusieurs essais, il faut que je bascule d’un dessin à l’autre pour que ça fonctionne. Gênant quand on souhaite faire un traitement par lot de fichiers.

 

Bonjour Patrick,

pour effectuer un traitement par lot (en ouvrant les fichiers dans AutoCAD) le principe le plus utilisé est le suivant :

- créer un script qui sera répété sur chaque fichier, ça peut être :

 

  [b] exemple 1 :[/b]
(if (= 0 (getvar "tilemode")) (command "espacep"))
zoom
_e
purger
to

n

 [b] exemple 2 :[/b]
ssx

E
wipeout

_erase
_p

(load "DeleteBlockWipeouts.lsp")
DeleteBlockWipeouts

Tu remarques que finalement le fait de passer par un script n'est pas génant puisqu'on peut faire appel à tout ce qu'on veut via un (load....)

 

- créer un moteur.lsp dont les taches sont :

* établir la liste des fichiers à traiter

* sélection du script1(voir au dessus) à répéter

* création d'un megascript.scr de la forme suivante :

ouverture du fichier1.dwg

exécution de script1

save fichier1.dwg

ouverture du fichier2.dwg

exécution de script1

save fichier2.dwg

etc. ça donne par exemple pour megascript.scr :

 
_qnew
_open "D:/_traitement/5eme.dwg"
(if (= 0 (getvar "tilemode")) (command "espacep"))
zoom
_e
purger
to

n
_qsave
_open "D:/_traitement/coupe AA.dwg"
(if (= 0 (getvar "tilemode")) (command "espacep"))
zoom
_e
purger
to

n
_qsave
_open "D:/_traitement/etage courant.dwg"
(if (= 0 (getvar "tilemode")) (command "espacep"))
zoom
_e
purger
to
...
....
..
_qnew
filedia 1
cmdecho 1

et enfin ton moteur.lsp devra finir par le lancement de l'exécution megascript.scr.

 

C'est plus impressionant que compliqué, et ce message et plus long que le moteur.lsp à créer

mais dsl je ne peux pas diffuser ma version.

 

Pour ce qui est des quelques lsp que je charge au début ( très peu car je préfère faire un (load... dans mes menus), je les place dans les fichiers .mnl de mes menus personnalisés, on peut en créer un par .cui et c'est fait pour :)

 

Bruno Toniutti

 

[Edité le 2/2/2007 par BTO]

Lien vers le commentaire
Partager sur d’autres sites

Merci BTO, mais cela je sais le faire ;)

Ce que je recherchais, c'est d'éviter de passer par un script et de reussir un traitement par lot. L'idée était de se servir de la table documents et de lancer les différentes fonctions vlisp/lisp voir quelques commands

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

J'avais gardé cet article sous le coude en attente d'utilisation,

je suis donc maintenant confronté au même problème que vous tous ...

 

Mon cas:

dans mon pseudo explorateur de folio autocad, je visualise mes dwg, et donc je lance des traitements de fond, et mon cas pose problème dès le début,

patrick_35 , certifie que les lisp sont chargé (voir acad2006doc.lsp) ? certain ? (ou alors il y a du filtrage ?)

 

 

Petite suggestion:

Pourquoi ne pas executer une commande lisp avec l'équivalent (load xxxx) en vlisp ou autre (que je ne maitrise pas ...) :P

 

Vous pourriez me la donner cette commande .... ?

 

Bon ben voilà ! c'était pour faire avancé le s.....c

 

Merci

 

Lien vers le commentaire
Partager sur d’autres sites

ou j'avais envie d'y croire ... ;)

C'est une invitation à une embauche ;)

 

Tu fais ce que tu veux

La seul différence avec objectDbx, c'est au lieu de pointer sur (setq doc (vla-get-activedocument (vlax-get-acad-object)) ou (setq doc (vla-item (vla-get-documents (vlax-get-acad-object)) "Un_Dessin.dwg")) s'il est déjà ouvert dans Autocad, tu as la même chose avec la fonction (setq doc (ouvrir_dessin_dbx "c:/Un_dessin.dwg"))

Il ne reste plus qu'à utiliser les fonctions vlisp uniquement.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

aîe aîe aîe , communiquer , compendre et se faire comprendre , toute une affaire ....

 

J'avais bien assimilé le principe d'ouverture de fichier autocad en DBX ...

 

Le but de ma demande était d'obtenir le code pour effectuer le chargement d'un fichier LISP en vlisp ou autre méthode dbx ? :D l'équivalent à (load "prout.lsp") ...

 

Merci patrick_35 ...

 

 

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é