Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. (gile)

    Copie multiple

    En LISP, c'est vraiment un exercice facile ! (defun c:mcopy (/ mcopy_err v1 v2 ss pt1 pt2 nb) (defun mcopy_err (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (setvar "cmdecho" v1) (setvar "osmode" v2) (setq *error* m:err m:err nil ) (princ) ) (setq m:err *error* *error* erreur v1 (getvar "cmdecho") v2 (getvar "osmode") ) (setq ss (ssget)) (initget 1) (setq pt1 (getpoint "\nSpécifiez le décalage, premier point: ")) (initget 1) (setq pt2 (getpoint pt1 "\nDeuxième point: ")) (initget 1) (setq nb (getint "\nNombre d'éléments: ")) (setvar "cmdecho" 0) (setvar "osmode" 0) (repeat (1- nb) (command "_copy" ss "" '(0 0) '(0 0)) (command "_move" ss "" pt1 pt2) ) (setvar "cmdecho" v1) (setvar "osmode" v2) (setq *error* m:err m:err nil ) (princ) )
  2. Si tu modifies ton fichier LISP dans l'éditeur VisualLISP tu peux le recharger directement depuis l'éditeur bouton "Charger la fenêtre d'édition active". Si tu ne l'utilises pas (et je pense que c'est dommage) tu peux taper à la ligne de commande (load "MonProg.lsp") si MonProg.lsp est dans un dossier du chemin de recherche, sinon, il faut donner le chemin complet (load "C:\\MesProgs\\MonProg.lsp").
  3. (gile)

    Remplacer blocs/entmake

    Bravo pour la gestion des erreurs ! Pour ce qu'il en est des créations de jeux de sélections en VisualLISP, je donnais ça à titre anecdotique et pour essayer de comprendre de mon côté comment fonctionnaient les filtres de sélections. Si tu fais une recherche dans les forums avec vla-get-selectionsets il n'y a que 10 messages dont 3 pour ce sujet ! La plupart des vlispeurs (sur CADxp en tous cas) utilisent (ssget ...) et traduisent ensuite les entités en vla-object, c'est beaucoup moins lourd !
  4. (gile)

    Remplacer blocs/entmake

    Merci Patrick_35, j'ai appris comment faire un filtre en "pur VisualLISP" et ça ne fait que me conforter dans ce que je disais : AutoLISP est beacoup plus souple pour ce genre de choses ! Pour traduire le LISP de Bred en "pur VisualLISP" : Pour la sélection du premier bloc, comme je n'ai pas trouvé l'équivalent de (ssget "_:S:E" ...) pour ne sélectionner qu'un objet, on peut passer par l'équivalent de (entsel ...) en remplaçant le filtre par un test en boucle. Remplacer : (princ "\n------------------------------\n Sélection du Bloc à Remplacer:") (while (= bloc_sel nil) (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))) Par : (while (not (and Bloc_sel (= (vla-get-ObjectName Bloc_sel) "AcDbBlockReference") ) ) (vl-catch-all-apply ;_ nécessaire si sélection nulle 'vla-getEntity (list (vla-get-Utility ;_ Pointeur vers l'objet "Utility" (vla-get-ActiveDocument (vlax-get-acad-object)) ) 'Bloc_sel ;_ vla-object 'p_pt ;_ pick-point "\nSélectionnez le bloc à remplacer" ) ) ) Pour remplacer: (if (= Quest "Oui")(progn (setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0)))))) (ssadd (ssname bloc_sel 0) Group_bloc_sel) (setq bloc_sel Group_bloc_sel))) On crée le jeu de sélection (vide) : (setq Group_Bloc_Sel (vla-add (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object)) ) "Group_Bloc_Sel" ) ) On le remplit si Choix Multiple = Oui : (if (= Quest "Oui") ;; Sélection à l'écran (vla-SelectOnScreen Group_Bloc_Sel (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbInteger '(0 . 1) ) '(0 2) ) (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbVariant '(0 . 1) ) (list "INSERT" (vla-get-Name Bloc_sel)) ) ) ) On y ajoute bloc_sel : (vla-addItems Group_Bloc_Sel (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbObject '(0 . 0) ) (list Bloc_sel) ) ) Et on peut traiter le jeu de sélection avec un (Vlax-for ...) (vlax-for obj Group_Bloc_Sel (vla-put-layer (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vla-get-InsertionPoint obj) (findfile (strcat bloc_R ".dwg")) (vla-get-XScaleFactor obj) (vla-get-YScaleFactor obj) (vla-get-ZScaleFactor obj) (vla-get-rotation obj) ) (vla-get-layer obj) ) (vla-delete obj) ) Il faut supprimer l'objet "jeu de sélection" de la collection des jeux de sélection pour pouvoir le recréer lors d'un autre appel du LISP (les entité contenues dans le jeu ne sont pas supprimées) : (vla-delete Group_Bloc_Sel) On doit pouvoir éviter de faire certains variants en utilisant (vlax-invoke ...) à la place de certains (vla-...) voir ce sujet.
  5. (gile)

    Remplacer blocs/entmake

    Pour les jeux de sélection, je fais comme toi en AutoLISP et traduction des entités en vla-object dans la boucle qui traite le jeux de sélection, si tu veux le faire en "vlisp pur" c'est beaucoup plus ingrat (voir "lourdingue"). Il faut ajouter un nouvel objet "jeu de sélection" à l'objet "collection des jeux de sélections" de l'objet "document actif" de l'objet "acad application" : (setq Group_Bloc_Sel (vla-add (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object)) ) "Group_Bloc_Sel" ) ) Et ensuite utiliser (vla-SelectOnScreen Group_Bloc_Sel) pour une sélection à l'écran, et/ou (vla-addItems ...) pour y ajouter des objets (sous forme de variant). Je dois dire que je n'ai toujours pas bien compris comment faire un filtre de sélection avec vla-SelectOnScreen et je trouve que transformer des listes d'objets en variants est fastidieux.
  6. (gile)

    Fmult comment faire?

    Salut, Juste une idée qui vaut ce qu'elle vaut. Tu procèdes à l'inverse, dans l'EP tu fais une fenêtre, ta mise à l'échelle et mise en place (pan). Ensuite, tu dessines la poly ce contour, tu la transformes en fenêtre, zoom étendu et remise à l'échelle si nécessaire, suppresion de la première fenêtre.
  7. (gile)

    Remplacer blocs/entmake

    Salut, Pour mettre un objet en surbrillance, tu peux utiliser (vla-Highlight ...) Remplace (sssetfirst nil bloc_sel) par : (setq obj (vlax-ename->vla-object (ssname bloc_sel 0))) (vla-Highlight obj 1) pour enlever la surbrillance : (vla-Highlight obj 0) De plus en traduisant le bloc sélectionné en vla-object dès le début du LISP, tu peux utliser (cons 2 (vla-get-name obj)) à la place de : (assoc 2 (entget (ssname bloc_sel 0))) Sinon, dans l'état ton LISP ne fonctionne qu'avec des wblocs, peut-être devrait tu essayer d'utiliser la proposition faite ici.
  8. (gile)

    Scripting.FilesystemObject

    Ok, merci.
  9. (gile)

    Scripting.FilesystemObject

    Merci, je n'ai pas voulu copier bêtement celui donné par Jeff Mishler, alors je l'ai un peu modifié en faisant une bétise (je corrige). J'avoue ne pas comprendre quelles peuvent être les utilisations de WScript.Shell (à part activer ou désactiver le pavé numérique), j'ai fait un (vlax-dump-object ...) qui ne m'apprend pas gand chose ... [Edité le 18/7/2006 par (gile)]
  10. L'erreur est réparée voir EDIT au dessus. Il faut effectivement spécifier le chemin complet si le bloc n'est pas dans la collection du dessin. Il est possible de faire un test pour savoir si le bloc est présent dans la collection, mais attention, (vla-item ...) ne retourne pas nil mais une erreur si l'item n'est pas trouvé, il faut donc utiliser les fonctions vl-catch-all-error-p et vl-catch-all-apply. Si le bloc n'est pas dans la colection on peut chercher son chemin avec (findfile bloc_R) : (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) bloc_R ) ) ) (setq bloc_R (findfile bloc_R)) ) Dans ce cas bloc_R doit avoir été spécifié avec l'extension .dwg et être dans un dossier du chemin de recherche d'AutoCAD. Il peut être prudent de faire ce test avant le (vla-put-layer (vla-InsertBlock ...)) et même de ne lancer celui-ci qu'après un (if bloc_R ...)
  11. (gile)

    Remplacer blocs/entmake

    Il me semble qu'on ne peut pas insérer un wbloc avec entmake, le code de groupe 2 est celui du nom du bloc, et n'accepte pas de chemin vers un fichier .dwg. Je ne vois de possibilités qu'avec (command "_.insert" ...) ou (vla-InsertBlock ...).
  12. C'est mon côté "maniaque", mais je préfère les codes où ne sont pas mélangés les styles. Si tu te mets au vlisp, oublie les entget, récupérer les propriétés d'un objet est beaucoup plus évident en vlisp. Il faut d'abord transformer le nom d'entité (ename) en vla-object : (setq obj (vlax-ename->vla-object ent)) En faisant un (vlax-dump-object obj) tu pourras voir toutes les propriétés accessible pour l'objet. tu peux récupérer ces propriétes aves un (vla-get-property obj) ou les modifier avec un (vla-put-property obj [arg ...]) Si tu fais (vlax-dump-object obj T) tu auras aussi toutes les "méthodes" applicables à l'objet avec un (vla-method [arg...]) Le test sur la présence ou non du bloc dans la collection ne me semble pas utile vla-Insert fonctionne aussi bien avec un nom de bloc (si le bloc est dans la collection) ou un chemin complet (si le chemin est valide): (if (vla-item (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)) ) bloc_R ) (findfile (strcat bloc_R ".dwg")) ) Volà ce que ça pourrait donner : (defun c:bbb (/ bloc_sel bloc_R) (princ "\n------------------------------\n Sélection du Bloc à Remplacer :" ) (while (= bloc_sel nil) (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))) ) ;; Changement du nom d'entité en vla-object (setq obj (vlax-ename->vla-object (ssname bloc_sel 0))) (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : ")) (if (= bloc_R "") (progn (while (= bloc_R "") (setq bloc_R (ssget "_:S:E" '((0 . "INSERT")))) ) (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0))))) ) ) (vla-put-layer (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vla-get-InsertionPoint obj) Bloc_R (vla-get-XScaleFactor obj) (vla-get-YScaleFactor obj) (vla-get-ZScaleFactor obj) (vla-get-rotation obj) ) (vla-get-layer obj) ) (vla-delete obj) ) EDIT : remplacé (vla-delete bloc) par (vla-delete obj). [Edité le 18/7/2006 par (gile)]
  13. (gile)

    Ombres

    Oui sûrement, ce qui concerne l'affichage dépend directement de la carte graphique et 2007 est beaucoup plus gourmand que les versions précédentes (voir la liste des Cartes graphiques certifiées par autodesk). Un rendu (qui, lui, ne dépend pas de la carte graphique) devrait donner de bien meilleurs résultats.
  14. Ça a peut-être rapport avec ce sujet Juste une suggestion où NOM est le nom du bloc et CHEM le chemin complet d'un wbloc (vla-insertblock (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point pt) (if (vla-item (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) NOM) NOM CHEM ) 1 1 1 0 ) [Edité le 18/7/2006 par (gile)]
  15. Jeff Mishler donne ici un moyen en vlisp bien pratique pour jongler avec les fichier et dossiers (créer, supprimer, copier, déplacer ...). D'après une rapide recherche dans CADxp, seuls quelques VBAistes utilisent Scripting.FilesystemObject. Par exemple, pour copier le contenu d'un dossier dans un autre (si le dossier de destination n'existe pas, il est créé) : (defun CopyFolder (source destination / fso) (setq FSO (vlax-create-object "Scripting.FilesystemObject")) (if (= -1 (vlax-invoke fso 'folderexists source)) (vlax-invoke fso 'copyfolder source destination) ) (vlax-release-object fso) ) [Edité le 18/7/2006 par (gile)]
  16. (gile)

    Ombres

    Salut, Il faut d'abord activer l'accélération matérielle Outils >> Options... >> Système >> Paramètres de performance >> Ajuster manuellement et cocher "Activer l'accélération matérielle". Et ensuite dans les styles visuels du tableau de bord choisir "Ombres pleines".
  17. (gile)

    Remplacer blocs/entmake

    Il me semble plutôt que je n'ai pas compris ta demande (le LISP ci-dessus ne fait que changer le nom du bloc) S'il s'agit de remplacer une référence de bloc par une autre, ça serait plutôt ce genre là : (la définition de bloc doit exister dans le dessin, même si aucune référence n'est insérée. On teste avec tblsearch) (defun c:bbb (/ bloc_sel List_Info_Bloc bloc_r bloc_sel2) (princ "\n------------------------------\n Sélection du Bloc à Remplacer :" ) (while (= bloc_sel nil) (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))) ) (setq List_Info_Bloc (vl-remove-if-not '(lambda (x) (member (car x) '(8 10 41 42 43 50))) (entget (ssname bloc_sel 0)) ) ) (while (or (not bloc_R) (not (tblsearch "BLOCK" bloc_R))) (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : " ) ) (if (= bloc_R "") (progn (while (= bloc_sel2 nil) (setq bloc_sel2 (ssget "_:S:E" '((0 . "INSERT")))) ) (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_sel2 0))))) ) ) ) (entmake (append (list (cons 0 "INSERT") (cons 2 bloc_R)) List_Info_Bloc)) (entdel (ssname bloc_sel 0)) (princ) )
  18. (gile)

    Remplacer blocs/entmake

    Salut, Si j'ai bien compris, tu ne change que le nom du bloc en gardant tous ses composants. Voici un exemple qui crée une nouvelle définition de bloc comme indiqué par Patrick_35 et qui l'insère à la place du bloc sélectionné : (defun c:bbb (/ bloc_sel bloc_lst) (princ "\n------------------------------\n Sélection du Bloc à Remplacer :" ) (while (= bloc_sel nil) (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))) ) (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant: ")) (while (tblsearch "BLOCK" bloc_R) (setq bloc_R (getstring (strcat "\n Le bloc : \"" bloc_R "\" existe déjà.\nEntrez le nom du bloc Remplaçant: " ) ) ) ) (setq old_bloc (tblsearch "BLOCK" (cdr (assoc 2 (entget (ssname bloc_sel 0)))) ) ) (setq new_bloc (subst (cons 2 bloc_R) (assoc 2 old_bloc) old_bloc)) (setq ent (cdr (assoc -2 old_bloc))) (while ent (setq ent_lst (cons (entget ent) ent_lst) ent (entnext ent) ) ) (entmake new_bloc) (mapcar 'entmake (reverse ent_lst)) (entmake '((0 . "ENDBLK"))) (entmake (subst (cons 2 bloc_R) (assoc 2 (entget (ssname bloc_sel 0))) (entget (ssname bloc_sel 0)) ) ) (entdel (ssname bloc_sel 0)) (princ) )
  19. (gile)

    Cotes ingerables

    Salut, Ça n'explique pas le comment du pourquoi, mais tu trouvreras ici un petit LISP qui permet de changer rapidement l'échelle globale d'une cote et d'appliquer ce changement à tout le style de cote. La cote peut être sélectionnée avant ou après le lancemment du LISP (si PICKFIRST est à 1).
  20. Tu n'utilises pas l'éditeur VisualLISP ? Les symboles protégés y apparaissent en bleu, les autres -fontions (defun), variables- en noir. http://img134.imageshack.us/img134/5573/promptxw2.png [Edité le 18/7/2006 par (gile)]
  21. Salut, Pour la date dans un cartouche, j'utiliserais un champ, il y a plusieurs possibilités : date de création, du dernier enregistrement, du dernier traçage ...
  22. Salut, Comme Patrick_35, je dirais que si tu te mets au vlisp, ÇA VA FAIRE MAL !!! ;) Je n'aurais qu'une autre petite remarque, tu utilise comme varaiable locale un symbole protégé : prompt.
  23. (gile)

    Extraction du nom fichier

    Salut, Le $M n'est pas la définition d'une variable (ça n'existe pas en diesel, il faut passer par les variables système USERSn, USERIn ou USERRn pour stocker de valeurs), c'est l'introduction d'une expression DIESEL dans une macro. Extrait de l'aide : [Edité le 18/7/2006 par (gile)]
  24. J'ai découvert en réparant un dysfonctionnement dans Edit_bloc.lsp que certains blocs de la "Palette de panneaux de signalisation routière" (Téléchargement proposés par l'administrateur >> Blocs, Bibliothèques, Textures >> AutoCAD) contenaient une "AcDbZombieEntity" (Objectname en vlisp). En parcourant les entités de ces blocs avec entnext il s'avère qu'il s'agit d'une ACAD_PROXY_ENTITY. Ces blocs "zombifiés" ne peuvent, par exemple, pas être insérés avec le Design Center, ni placés dans une palette d'outils, ni modifiés dans l'éditeur de bloc (AutoCAD 2006 et 2007). La suppression des "entités zombies" ne semble pas affecter les blocs en questions (blocs B8, C28-1, C28-2 et C4A pour la bibliothèque citée plus haut). Voici donc une petite routine pour supprimer les entités zombies de tous les blocs de la collection : (vlax-for bloc (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object) ) ) (vlax-for ent bloc (if (= "AcDbZombieEntity" (vla-get-ObjectName ent)) (vla-delete ent) ) ) )
  25. (gile)

    Modifier des blocs version 2

    Suite à un échange avec Aviglémy, deux petits bugs ont été décelés et réparés : - Si l'option "sans unités" était sélectionnée : "Erreur: Le serveur ActiveX a renvoyé une erreur: Paramètre non facultatif" Cette option est désormais filtrée lors de la "Mise à jour de l'échelle en cas de changement d'unité". - Si les blocs contenaient des "AcDbZombieEntity" (?!): "Erreur: Erreur Automation Fonction non permise pour cet objet externe" Ces entités sont désormais écartées des modifications. Le LISP (premier message du sujet) est modifié, pour la version dans lesTéléchargement proposés par les membres, un peu de patience, il faut que je recompile tout et que ce cher Patrick ait le temps de changer de version (Version 2.4). Télécharger Edit_blod 2.4 [Edité le 20/7/2006 par (gile)]
×
×
  • 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é