Aller au contenu

Serge

Membres
  • Compteur de contenus

    397
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Serge

  1. melino, Voici une routine plus souple dont l'auteur est connu. ;;; DelSomeFilters ;;; Efface les filtres de calques de façon sélective ;;; ;;; Compatibilité: AutoCAD 2000 et plus ;;; ;;; Instructions: ;;; 1) Charger ce fichier ;;; 2) Tapez DSF sur la ligne de commande ;;; ;;; Par Serge Camiré, CadNovation, 2003/03/16 ;;; http://www.cadnovation.com/fr ;;; (vl-load-com) (defun DelSomeFilters ( mask / lext-dict ldict lay_entity lay_filters filter_name) (vl-load-com) (setq lext-dict (entget (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object)))) ))) (setq lay_entity (if (member (cons 3 "ACAD_LAYERFILTERS") lext-dict) (cdr (assoc 360 lext-dict)) nil )) (if lay_entity (setq lay_filters (entget lay_entity))) (if lay_filters (setq lay_filters (member (assoc 3 lay_filters) lay_filters))) (while lay_filters (setq filter_name (cdar lay_filters)) (if (wcmatch filter_name mask) (dictremove lay_entity filter_name) ) (setq lay_filters (cddr lay_filters)) ) (princ) ) ;;; Exemples: ;;; (DelSomeFilters "*[1-9]*") ; Tous les calques avec des nombres ;;; (DelSomeFilters "*") ; Tout ;;; (DelSomeFilters "???,~*m*,N*") ; Tous les calques ayant 3 caractères ET ceux n'ayant pas de 'm' ET ceux ne débutant pas par N ;;; (DelSomeFilters "*") (defun c:dsf () (DelSomeFilters "*") (princ)) (princ "\nTapez DSF pour effacer tous les filtres de calques") (princ) Serge
  2. Serge

    Palette de couleur en VBA

    Patrick, Ça te prend le contrôle AcadColor.ocx. Il ex existe une version pour 2000 et une pour 2004. Je te l'envoi séparément. Serge
  3. Serge

    Dimensions d\'un block

    Roland 9 En présumant que tu as un bloc nommé "test", voici en quelques lignes comment connaitre les limites de ce bloc. Valable en R14.01 Dim blockRefObj As AcadBlockReference Dim minExt As Variant Dim maxExt As Variant Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "test", 1#, 1#, 0) blockRefObj .GetBoundingBox minExt, maxExt Serge
  4. Tramber, C'est très bien. Si jamais je vais en France au début avril, je t'apporterai le guide de VisualLisp (j'ai un collègue de graduation qui travaille à Strasbourg) Serge
  5. Serge

    pas d\'îcone dans nouveau menu

    nicus, Qu'il s'agisse de lsd (Lucy in the Sky with Diamond ?) ou de sld, il faut impérativement que ces fichiers soient trouvés par les chemins de recherche d'AutoCAD. On ne peut malheureusement inclure de chmin relatif ou absolu. Serge
  6. bruno_l, Pourquoi ne pas utiliser le "Gestionnaire des références" ou "Reference Manager" Il se trouve dans : Démarrer (de Windows) -> Programmes -> Autodesk -> AutoCAD 2004/2005 -> Gestionnaire des références Ou directement à "C:\Program Files\AutoCAD 200xxx\AdRefMan.exe" Serge
  7. Ludwig, N'oublie pas que ton dessin doit contenir au moins une présentation. Je te lasisse chercher un peu. Serge
  8. Serge

    info sur lisp

    Même si c'est tardif, merci pour ces réponses. Serge
  9. Man, Que veux-tu dire ? On peut écrire au maximum 256 caractères sur la ligne de commande. Est-ce pour passer une macro ? Si oui, je te conseille de l'écrire dans un fichier puis de charger ce fichier. Serge
  10. Patrick, Il faut écrire "Esope reste ici et se repose". Alors Mirrtext fonctionne bien à 0 ou 1. Battman n'est plus ce qu'il était ! Bush est réélu ! Le Terminator est avec lui ! Superman est mort ! Je retourne dans mon abri nucléaire. J'aurais mieux fait de rester silencieux. Serge
  11. Ludwig, Bien que je n'aime pas tout coder dans un bouton, voici quand même ceci: ^C^C^P(if (not (member "geom3d.arx" (arx))) (arxload "geom3d")) (setq oldOsmode (getvar "osmode")) (setvar "osmode" 165) (command "_align") ^P(while (> (getvar "cmdactive") 0) (command pause)) (setvar "osmode" oldOsmode)^P Note: il faut s'assurer que la commande ALIGN soit disponible, donc vérifier si geom3d.arx est chargée. Serge
  12. Serge

    Image Raster les + légères ?

    Didier, Eeeeh! Es-tu déjà debout ou tu n'es pas encore couché :-)))) Le LayoutRegenCtl à 2 accélère, et c'est son but, mais demande beaucoup plus de RAM, d'ù le risque de plantage. Serge
  13. Serge

    entsel

    Tramber, Il y a aussi ce code (ne s'applique qu'aux polylignes optimisées). Tient compe des arcs. À noter une variante pour la détection des sommets. (defun c:test ( / dist n place pline plinesel point selectedDist sommet sommets vlaPline ) (setq plinesel (entsel "\nSélectionnez la polyligne:")) (setq pline (car plinesel)) (setq point (osnap (cadr plinesel) "_nearest")) (setq vlaPline (vlax-ename->vla-object pline)) (if (= (vla-get-objectname vlaPline) "AcDbPolyline") (progn (setq selectedDist (vlax-curve-getDistAtPoint vlaPline point)) (setq sommets (safearray-value (variant-value (vla-get-Coordinates vlaPline)))) (setq n (1- (length sommets))) (setq place nil) (while (> n 0) (setq sommet (list (nth (1- n) sommets) (nth n sommets))) (setq dist (vlax-curve-getDistAtPoint vlaPline sommet)) (if (and (not place) (< dist selectedDist)) (setq place (/ (1+ n) 2))) (setq n (- n 2)) ) ;; Note: L'index du premier sommet est 1. (princ (strcat "\nLe point choisi se situe entre les sommets " (itoa place) " et " (itoa (1+ place)) " de " (itoa (/ (length sommets) 2)) " sommets." )) )) (princ) ) Tout ce que j'ignore, je le dois à mes connaissances (l'inverse se dit aussi). Serge
  14. Serge

    info sur lisp

    Drizzt, Une autre bouteille à la mer ... J'ai demandé subtilement aux membres de ce forum (et des 2 autres) s'il pourrait y avoir un intérêt pour un livre de Lisp. Ou bien la réponse est non, ou bien les gens sont timides, ou bien les gens sont polis :-))) J'ai également le livre en question. Mon associé Jean-Pierre Trudel y avait collaboré. http://www.cadnovation.com/fr/cvjp.asp Serge [Edité le 22/10/2004 par Serge]
  15. Je suis définitivement en retard sur le forum. Voici un autre exemple: (defun getBlockQuantityEntry ( blockname / blockTables count1 count2 count3 modelSpace paperSpace ) (princ (strcat "\nRecherche du bloc '" blockname "'.")) (setq blockname (strcase blockname)) (setq modelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) (setq count1 (getBlockQuantity modelSpace blockname)) (princ (strcat "\n" (itoa count1) " en espace objet")) (setq paperSpace (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) (setq count2 (getBlockQuantity paperSpace blockname)) (princ (strcat "\n" (itoa count2) " en espace papier")) (setq blockTables (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))) (setq count3 (getBlockQuantity blockTables blockname)) (princ (strcat "\n" (itoa count3) " imbriqué" (if (> count3 1) "s" ""))) (princ "\n----------------------------") (princ (strcat "\n" (itoa (+ count1 count2 count3)) " au total.")) (princ) ) (defun getBlockQuantity ( space blockname / count ) (setq count 0) (setq blockname (strcase blockname)) (vlax-for item space (if (or (and (= (vla-get-objectname item) "AcDbBlockTableRecord") (= (strcase (vla-get-name item)) blockname) ) (and (= (vla-get-objectname item) "AcDbBlockReference") (= (strcase (vla-get-name item)) blockname) ) ) (setq count (1+ count)) ) ) count ) (defun c:test ( / blockname) (setq blockname (getstring t "\nNom du bloc: ")) (if (/= "" blockname) (getBlockQuantityEntry blockname)) (princ) ) Serge
  16. Bonuscad, Juste un petit truc. Lorsque le nombre de zéros commence à être important, on peut écrire 1e-6 (ou autre), et ce même sur la ligne de commande. De même, le "equal "présume que ce n'est pas le ssget qui filtre mais le programmeur. Patrick_35, Lorsqu'il n'y a que des items reliés par des AND, il n'est pas requis de les spécifier. (setq ss (ssget "_x" (list (cons 0 "circle") (cons 40 0.1)))) aurait suffit et a l'avantage d'être plus lisible. S'écrivent également: (setq ss (ssget "_x" (list (cons 0 "circle") (cons -4 ">=") (cons 40 2.0)))) (setq ss (ssget "_x" (list (cons 0 "circle") (cons -4 ">=") (cons 40 35.0) (cons -4 "<=") (cons 40 40.0)))) Par contre, si on a 2 plages ou 2 types d'objet, il faut utiliser les opérateurs logiques. Didier, La commande Insert s'occupe d'insérer le bloc au besoin. Mais pour être élégant, on pourrait écrire en début de programme: (setq blockname "direct") ; Ou n'importe quel nom. (if (not (tblsearch "block" blockname)) (progn (command "._insert" blockname) (command) )) Serge
  17. Serge

    Image Raster les + légères ?

    Didier, En passant, un de nos clients (le Ministère des Transports pour ne pas le nommer), utilise des images tramées à profusion. L'un de leurs postes plantait systématiquement. La solution que je leur ai proposée et qui a fixée le problème était justement de changer LAYOUTREGENCTL de 2 à 0. Serge
  18. Serge

    Image Raster les + légères ?

    esbe Le format par excellence est le ECW. Il est natif dans AutoCAD MAP mais seulement toléré dans AutoCAD 2004 et + (toléré signifie que l'extension n'est pas présentée mais AutoCAD la reconnaitra). Voir http://www.ermapper.com/ pour plus d'infos Serge
  19. Visuel, C'est dommage, c'est au Québec que l'on retrouve le plus d'indépendant - tistes. C'est ma sortie du vendredi. Serge
  20. Tramber, J'imagine que ça dépend de ce qu'on cherche. La fonction TL affiche le résultat de la commande AREA et est donc forcément plus lente, mais on parle de millisecondes. La seconde fonction traite les polylignes tel que c'était demandé. On peut l'adapter très facilement. Serge
  21. Mathilde, Ou encore cette routine. Une fois chargée, tu tapes COMPUTEAREA. (defun c:computeArea ( / area endPt i n object objectType perimeter ss totalArea totalPerimeter vla-object ) ;; (setq ss (ssget (list (cons 0 "lwpolyline)))) (setq ss (ssget)) (setq i 0 n (if ss (sslength ss) 0)) (setq area nil totalArea 0 totalPerimeter 0) (while (< i n) (setq object (ssname ss i)) (setq vla-object (vlax-ename->vla-object object)) (if (and (vlax-property-available-p vla-object 'area) (not (vlax-erased-p vla-object))) (progn (setq area (vlax-curve-getArea vla-object)) (setq endPt (vlax-curve-getEndParam vla-object)) (setq perimeter (vlax-curve-getDistAtParam vla-object endPt)) (setq objectType (vla-get-ObjectName vla-object)) (princ (strcat "\nAire de l'objet " objectType " ayant le handle <" (vla-get-handle vla-object) ">: " (rtos area 2 4))) (setq totalArea (+ totalArea area)) (setq totalPerimeter (+ totalPerimeter perimeter)) )) (vlax-release-object vla-object) (setq i (1+ i)) ) (if (> totalArea 0) (princ (strcat "\nAire totale: " (rtos totalArea 2 4)))) (if (> totalPerimeter 0) (princ (strcat "\nPérimètre total: " (rtos totalPerimeter 2 4)))) (princ) ) Serge
  22. Renvoie moi donc un message en privé
  23. Didier, Dans un module que tu peux créer, tu vas définir tes variables globales. Exemple: Public gMaVariable as Integer Public gAutreVariable as String Tu noteras le g qui signale que c'est une variable globale. Ça n'ajoute rien à la syntaxe de VB mais ça rend le code plus facile à comprendre. C'est une pratique commune. Autre méthode: tu peux référencer la variable en précisant son conteneur, si celui-ci est toujours actif. Exemple: Debug.Print MonUserForm.MaVariable Debug.Print MonModule.MaVarible Serge
  24. Didier, Désolé pour mes présences aléatoires :-) Pour ce qui est des 257 caractères, cela vient du fait que la fonction est définie dans un dll créé dans un autre langage (le C++) et que cela est de mise de fixer un tampon de mémoire d'avance pour éviter les complications inter-langages. Une fois que tu as la valeur, utilise ceci une fois que tu as récupéré le nom du fichier: Dim texte As String texte = Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, Chr(0)) - 1) Serge
  25. Serge

    fonction de calcul

    Maximilien, Tu semblais hésiter sur la forme à donner à ton code. La forme (defun c:func () ...) Sert à créer une commande, d'où le c: La forme qui te convient le mieux est: (defun func () ....) Comme il me semble que tu sois nouveau avec le lisp, je peux imaginer qu'un jour, tu voudras passer plus de paramètres, ou tantôt moins. Sache qu'AutoLISP n'aime pas varier le nombre de paramètres. Tes vieilles routines qui acceptaient 4 paramètres seront désuètes. Voici une proposition: ;; La fonction de calcul (defun le_calcul ( ;; Recvoir une liste de paramètres dans une seule variable de type LIST liste / variables_locales param1 param2 param3 param4 param5 return ) (setq param1 (nth 0 liste)) (setq param2 (nth 1 liste)) (setq param3 (nth 2 liste)) (setq param4 (nth 3 liste)) (setq param5 (nth 4 liste)) ;; Valeurs par défaut pour compatibilité avec anciennes routines (if (not param3) (setq param3 1)) (if (not param4) (setq param4 1)) (if (not param5) (setq param5 1)) ;;; Faire le calcul ici. Ceci est un exemple (setq return (* param1 param2 (/ (+ param3 param4) param5))) ;; Valeur de retour return ) ;; La commande appelante (defun c:test ( / arg1 arg2 arg3 arg4 arg5 liste resultat ) (setq arg1 (getvar "celtscale")) (setq arg2 (getvar "ltscale")) (setq arg3 (getvar "psltscale")) (setq arg4 (getvar "dimscale")) (setq arg5 (getvar "hpscale")) (setq liste (list (arg1 arg2 arg3 arg4 arg5))) ;; le_calcul reçoit toujours un seul paramètre, mais c'est une liste (setq resultat (le_calcul liste)) (princ "\nLe calcul donne: ") (princ resultat) (princ) ) Serge
×
×
  • 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é