-
Compteur de contenus
397 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Serge
-
purge des filtres des calques nommés ?
Serge a répondu à un(e) sujet de melino dans AutoCAD 2000 à 2002
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 -
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
-
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
-
Edition limitée de l\'ouvrage AutoCAD 2000 à 2002
Serge a répondu à un sujet dans AutoCAD 2000 à 2002
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 -
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
-
modifier le chemin d\'images inserer dans autocad
Serge a répondu à un(e) sujet de bruno_l dans Pour aller plus loin en LISP
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 -
Ludwig, N'oublie pas que ton dessin doit contenir au moins une présentation. Je te lasisse chercher un peu. Serge
-
Même si c'est tardif, merci pour ces réponses. Serge
-
Augmentation du nombres de caractères
Serge a répondu à un(e) sujet de man dans AutoCAD Architecture
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 -
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
-
Enlever puis remettre une variable dans un bouton
Serge a répondu à un(e) sujet de LUDWIG dans Personnalisation, macros, DIESEL
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 -
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
-
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
-
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]
-
Tester le nom d\'un bloc
Serge a répondu à un(e) sujet de dr.loveless dans Pour aller plus loin en LISP
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 -
Remplacement de cercles par des blocs
Serge a répondu à un(e) sujet de bucheron dans Débuter en LISP
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 -
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
-
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
-
RECHERCHONS Formateur Indépendant
Serge a répondu à un(e) sujet de VISUEL dans Emploi, monde du travail
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 -
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
-
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
-
Renvoie moi donc un message en privé
-
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
-
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
-
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
