BTO
Membres-
Compteur de contenus
38 -
Inscription
-
Dernière visite
BTO's Achievements
Newbie (1/14)
0
Réputation sur la communauté
-
bonjour, Le chemin du fichier existe-t-il ? S'il n'existe pas alors il faut le créer avant de tenter la sauvegarde, sinon autocad proposera d'enregistrer dans son dossier de travail par. On peut vérifier son existence de plusieurs manières, en voici 2 : (findfile (vl-filename-directory NomeFile)) (vl-file-directory-p (strcat (vl-filename-directory NomeFile) "\\")) Bruno Toniutti
-
Bonjour, je voudrais effacer ce message, merci Bruno Toniutti [Edité le 26/2/2007 par BTO]
-
:o Je viens de le revérifier sur map 3D 2007 (il me semble que c'est apparu avec autocad 2004) (setq objName (vlax-ename->vla-object (setq ename (car (entsel))))) (vla-explode objName) A moins que quelque chose de nouveau m'ait échappé, malheureusement la méthode explode est bugguée et ne fonctionne pas sur les blocs avec une échelle non uniforme (on obtient même une erreur). Bruno Toniutti [Edité le 23/2/2007 par BTO]
-
Simplification code CHEKSUM d\'un DWG
BTO a répondu à un(e) sujet de stephan35 dans Pour aller plus loin en LISP
bonjour en complément, on peut aussi explorer une autre voie, accéder à un fichier via FileSystemObject pour récupérer une multitude d'informations. le principe général : (setq filePath (getfiled "Sélection d'un fichier" "" "" 0)) (setq objWsh (vlax-create-object "Scripting.FileSystemObject")) (setq objFile (vlax-invoke-method objWsh 'GetFile filePath)) (vlax-get objFile 'Attributes) (vlax-get objFile 'DateCreated) (vlax-get objFile 'DateLastAccessed) (vlax-get objFile 'DateLastModified) (vlax-get objFile 'Drive) (vlax-get objFile 'Name) (vlax-get objFile 'ParentFolder) (vlax-get objFile 'Path) (vlax-get objFile 'ShortName) (vlax-get objFile 'ShortPath) (vlax-get objFile 'Size) (vlax-get objFile 'Type) Bruno Toniutti -
Patrick, Si tu parles de l'expression diesel (et non de son résultat à l'écran) c'est le code 1 d'un rtext donc le principe général est : (cdr (assoc 1 (entget (car (entsel))))) Bruno Toniutti [Edité le 14/2/2007 par BTO]
-
bonjour à tous oui ça fonctionne, mais comme c'est l'objet du forum, je vais continuer dans le coté pinaillement :) a) (ssget "_X" '((0 . "*TEXT"))) retourne nil si aucun texte n'est trouvé => ssnamex plante. je ne pense pas qu'on puisse s'affranchir d'une structure classique de sélection : (if (setq ss (ssget "_X" '((0 . "*TEXT")))) ...... b) De manière générale, la fonction mapcar exécute une fonction sur chacun des éléments d'une liste et retourne une liste de même longueur, ce qui veut dire qu'après un mapcar on a en mémoire 2 listes. Même l'écriture : (setq listA (mapcar 'fonction listA)) ocuppe l'espace de 2 listA en mémoire puisque la réaffection à listA de la liste retournée par mapcar intervient après la création de la liste de retour de mapcar. Une liste issue d'une sélection sur l'ensemble d'un dessin peut être très grande (ne considérons plus ce cas particulier des textes à effacer) 10000, 100 000, 1 000 000 d'éléments ? dans une structure : (mapcar 'entdel (mapcar 'cadr (ssnamex (ssget "_X" '((0 . "*TEXT")))) ) ) on a en mémoire : 1 jeu de sélectoin complet 1 liste compléte pour ssnamex 1 liste compléte pour le premier mapcar 1 liste compléte pour le second mapcar la première raison d'être d'un mapcar est de récupérer une liste après le balayage d'une liste, or ici l'objet du balayage de la liste n'est pas de récupérer une liste mais simplement de la parcourir. Donc, on peut au moins fusionner les 2 mapcar via une fonction lambda ou utiliser des structures classiques : (repeat (sslength ss) ..... ) (surtout pas de while qui oblige à un test non justifié quand le nombre de répétitions d'une boucle est connu) oui je sais, c'est moins beau que des mapcars enchainés les uns dans les autres ;) Bruno Toniutti[Edité le 14/2/2007 par BTO] [Edité le 20/2/2007 par BTO]
-
Patrick, des boucles qui contruisent des listes de plus 1000 élèments et plus, il y en a plein :) et quand bien même l'ordre des éléments serait important (ce qui de plus, souvent n'est pas le cas, dont le notre de modification de la couleur), le reverse est négligeable. par exemple : (defun methode1 () (setq a "a" l nil) (repeat 1000 (setq l (cons a l)) ) (reverse l) ) (defun methode2 () (setq a "a" l nil) (repeat 1000 (setq l (append l (list a))) ) ) donne : (METHODE1)......1062 / 59.9 - fastest (METHODE2).....63609 / 1 - slowest pour des listes de 10 éléments l'écart est faible : (METHODE1).....1016 / 1.17 -fastest (METHODE2).....1187 / 1 slowest mais pour des listes de 100 éléments on a déjà des écarts significatifs : (METHODE1).....1219 / 5.68 (METHODE2).....6922 / 1 une lwpolyligne de seulement 2 sommets, correspond à une liste de 23 éléments. Bref c'est juste histoire de discuter du lisp, les cas pour lesquels ça n'a aucune influence sont nombreux, cependant parfois ça peut être critique. Edit 1 : comme tu le précises avec entmake l'ordre de la liste a son importance, mais entmod semble s'accommoder d'un cons. Bruno Toniutti [Edité le 8/2/2007 par BTO]
-
bonjour :) Gile, en fait la manière utilisée dans ton test n'est pas représentative du décalage entre un cons et un append, plus la liste est grande plus l'écart est important. De manière génèrale quand on contruit une liste au cours d'une boucle (ce n'est pas notre cas dans la question initiale, mais autant avoir la solution la plus efficace), au fur et à mesure que la liste grandi, l'écart s'accentue. Un append mal placé peut même rendre un lisp inexploitable. Exemple (defun methode1 () (setq a "a" l nil) (repeat 1000 (setq l (cons a l)) ) ) (defun methode2 () (setq a "a" l nil) (repeat 1000 (setq l (append (list a) l)) ) ) on obtient : Benchmarking ..............Elapsed milliseconds / relative speed for 2048 iteration(s): (METHODE1).......1969 / 56.41 - fastest (METHODE2).....111062 / 1 - slowest ce qui est énorme ;) Bruno Toniutti [Edité le 8/2/2007 par BTO]
-
bonjour, pour aller un peu plus loin un append est beaucoup plus lent qu'un cons, or de manière générale c'est toujours à éviter dans la manipulation des listes. ici je ne vois pas de raison particulière d'utiliser un append, sinon merci de le précisier :yltype: Il me semble préfèrable d'utiliser une écriture de la forme : (setq elst (cons (cons 62 Nouvelle_Couleur) elst)) Bruno Toniutti
-
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]
-
Bonjour, pour vérifier qu'un etat des calques particulier est présent : par exemple (checkLayerStateName "toto") en vlisp : ; bto 1.070201 (defun checkLayerStateName (LayersStateName / objXdict return) (setq objXdict (vla-GetExtensionDictionary (vla-get-Layers (vla-get-activedocument (vlax-get-acad-object))))) (setq return (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (vla-item (vla-Item objXDict "ACAD_LAYERSTATES") LayersStateName)))))) (vlax-release-object objXdict) return ) voila, ça devrait fonctionner Bruno Toniutti [Edité le 1/2/2007 par BTO]
-
ok, parce que je cherchais la différence avec : (if (findfile item) Il doit pas te manquer grand chose, a prioris tu as tout ce qui nécessaire. Des fois il faut laisser reposer, ça ira mieux demain ;) BTO
-
A quoi sert cette partie ? Bruno Toniutti
-
ça ne correspond toujours pas à ce que je diffuse !! Je n'ai pas envi que mes variables contenant l'expression "m a i l " (sans espaces entres les lettres) soit remplacées par "courriel". Résultat la fonction correspondant au defun est fausse ! Bruno Toniutti[Edité le 2/10/2006 par BTO] [Edité le 2/10/2006 par BTO]
-
la version affichée sur le site ne correspond pas à celle que j'ai diffusée !! voici un nouveau message avec les tags du site pour le code : (defun CreateMail (RecipientTxt SubjectTxt MessageTxt PathFileTxt / OutlookObj EmailObj) (setq OutlookObj (vlax-get-or-create-object "Outlook.Application")) (setq EmailObj (vlax-invoke-method OutlookObj 'CreateItem 0)) (vlax-put-property EmailObj 'Body MessageTxt) (vlax-put-property EmailObj 'Subject SubjectTxt) (vlax-put-property EmailObj 'to RecipientTxt) (vlax-invoke-method (vlax-get-property EmailObj 'Attachments) 'Add PathFileTxt) (vlax-invoke-method EmailObj 'Display 1) (mapcar 'vlax-release-object (list OutlookObj EmailObj)) (gc) (princ) ) ; utilisation (CreateMail "toto@fai.fr" "essai" "\ntexte\ndu\nmessage\n" "D:\\_traitement\\toto.txt") Pour Tramber : je ne sais pas d'où vient ton problème mais "c:ab.txt" ça ne fonctionne pas en lisp, tente avec : "c:\\ab.txt" ou "c:/ab.txt" Pour Patrick35 : oui c'est spécifique à outlook et je ne suis pas sur que ça fonctionne avec toutes les versions (en particulier avec la version express) Bruno Toniutti [Edité le 2/10/2006 par BTO]
