VDH-Bruno
Membres-
Compteur de contenus
1 146 -
Inscription
-
Dernière visite
-
Jours gagnés
20
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par VDH-Bruno
-
Bonjour,, Il me semble que tu fait une petite confusion, que ce soit en Vlisp ou en AutoLisp, il ne faut pas confondre une définition de bloc et une référence de bloc. Dans ton exemple tu pointes la table des blocs AcadBlock (BLOCK en dxf). Normal la tu interroges une référence de bloc AcadBlockReference(INSERTen dxf)... La tu obtiendra le calque d'insertion. A+
-
Pas de soucis, c’est un forum d’entraide,donc même si il y a un ou deux petits disfonctionnements à la marge, c’est déjà beaucoup de prendre sur ton temps pour faire un code pour d'autres. Et à lire la réaction enthousiaste de x_all, cela allait déjà au-dessus de sa demande initiale. :) A+
-
Bonjour, Après une rapide lecture en diagonale du code, il me semble que l’erreur vienne du (close f) qui est mal positionné dans le code (en dehors du progn) et qui n’est donc pas initialisé.. Résultat de close si le f vaut nil $ (close f) ; erreur: type d'argument incorrect: streamp nil alala ta séquence avec le (initget 1 "Oui Non") était bonne, bit 1 pour les saisie null et Oui Non pour les réponses (majuscule, minuscule avec caractère minimum). Même si dans ce cas de figure on pouvait s’affranchir de la variable ecriremessage (car seul oui nous interresse), comme ceci par exemple: (initget "Oui Non") (if (= (getkword "\nEnregistrer dans un fichier ? [Oui/Non] <Non>: ") "Oui") (princ "\nOui!!! -> Lance la fonction d'écriture du rapport") ) (Ps : Au cas où le [Oui/Non] renseigne le menu contextuel) A+
-
incrémenter...et surtout décrémenter!
VDH-Bruno a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Remplace ta version de bono05 par celle qui suit: (defun c:bono05 (/ obj) (vl-load-com) (while (setq obj (car (nentsel))) (if (vlax-property-available-p (setq obj (vlax-ename->vla-object obj)) 'TextString T) (vla-put-TextString obj (decr_txt (vla-get-TextString obj))) (princ "\nSélection non valable... ") ) ) (princ) ) A+ -
incrémenter...et surtout décrémenter!
VDH-Bruno a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Re, Désolé, si j’ai été un peu vite mais il m’avait semblé lire ceci : Pour tester, suit la procédure rappelé par alala… Bonne continuation A+ -
incrémenter...et surtout décrémenter!
VDH-Bruno a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Re, Dans le lisp copie/charge également la fonction donné précédemment par BonusCAD. Je fais fréquemment lorsque je suis en manque d’inspiration, je mets parfois plus de temps à trouver les noms de fonctions qu’à les écrire A+ -
incrémenter...et surtout décrémenter!
VDH-Bruno a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Bonjour bono05, Comme ceci par exemple (defun c:bono05 (/ obj) (vl-load-com) (if (vlax-property-available-p (setq obj (vlax-ename->vla-object (car (nentsel)))) 'TextString T) (vla-put-TextString obj (decr_txt (vla-get-TextString obj))) (princ "\nSélection non valable... ") ) (princ) ) Charge et tape bono05 sur la ligne de commande... BonusCAD, pour (decr_txt "Ab00") -> "Aa99" et les autres cas du même genre du type : _$ (decr_txt "ADF000") "ADE999" _$ (decr_txt "AAAAAA") "9ZZZZZZ" J’aurais plus vu nil, comme valeur en retour, c’est plus facile à détecter pour demander une intervention utilisateur, pour ces cas qui ne peuvent être traité automatiquement (sans informations ou complémentaire). Sinon bravo pour la réponse, j’ai même pas eu le temps pour réfléchir à la question.. A+ -
x_all , pour les épaisseurs des lwpolylignes, regarde l’aide du côté des codes 43, 40 & 41. Si un code 43 est définie (présent dans la liste dxf de l’entitée), c’est que son épaisseur est constante 0.0 ou plus récupérable par assoc. Si le code 43 est absent (assoc renvoie nil) l’épaisseur est variable, là il faut interroger les codes 40 et 41 du segment voulu. alala, je trouve ton code très bon, pour les lignes même sans moi tu t’en serai aperçu à l’usage, pour la petite histoire le conseil pour les opérations sur les bits je le tiens de BonusCAD, quant à l’usage de logand suit ce lien http://cadxp.com/index.php?/topic/16226-mapcar-et-consorts/ en réponse n°7 et n°14, il y a une petite explication de (gile) si cela peut aider à y voir plus clair, j’avais tenté une sur boole logior et logand que je n’ai jamais publié (trop confus), si je la retrouve j’essayerai de la finaliser mais avec les fêtes qui approche, j’ai peu de temps libre.. A+
-
Bonjour alala, Attention aux lignes, elles ne possèdent pas de code 70 donc: _$ (logand nil 1) ; erreur: type d'argument incorrect: fixnump: nil Et donc pour x_all une troisième méthode avec le code de alala, (if (setq ss (ssget '((0 . "LWPOLYLINE,LINE")))) (progn (setq ssa (ssadd)) (setq ssb (ssadd)) (setq i 0) (repeat (sslength ss) (if (zerop (logand (cond ((cdr (assoc 70 (entget (ssname ss i))))) (0)) 1)) (ssadd (ssname ss i) ssa) (ssadd (ssname ss i) ssb) ) (setq i (1+ i)) ) ) ) A+
-
Bonjour, Bon dans ce cas.. On va en abuser, et te proposant 2 méthodes. :D Un équivalent simplifié de ta sélection : (setq ssa (ssget '((0 . "*POLYLINE,LINE")))) Seulement en utilsant * tu vas sélectionner toutes les polylignes : optimisé 2D (lwpolyline), anciennes 2D (polyline) , polylignes 3D (polyline), ainsi que les maillages (polyline) pour éviter cela tu doit affiner ta sélection en utilisant les groupages logiques ("<and", "and>", "<or", "or>", "<xor", "xor>", "<not" et"not>") et les opérateurs binaires ("&" et "&="). Exemple de sélection qui écarte les maillages au moyen du code 70 : (setq ssa (ssget '((-4 . "<OR") (0 . "LINE,LWPOLYLINE") (-4 . "<AND") (0 . "POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>") (-4 . "OR>") ) ) ) Suit ce lien : http://cadxp.com/index.php?/topic/36313-resolufonction-measure-en-vlisp/page__p__197455__fromsearch__1#entry197455 Tu trouveras une discussion récente dans qui traite d'un problème similaire.. Sinon plus simplement, on peut faire l’hypothèse que tu travaille exclusivement en 2D et avec des polylignes optimisées dans ce cas ta sélection est la suivante: (setq ssa (ssget '((0 . "LWPOLYLINE,LINE")))) La sélection étant supposé établie, pour la suite je te propose deux méthodes : 1er méthode Parcourir ta sélection avec une boucle et la fonction ssname et de tester si l’entité et une polyligne et si elle est fermé, si oui placer l’entité dans un nouveau jeu de sélection puis la supprimer de l’ancienne sélection (qui contiendra tous les autre éléments). (defun selection (/ i e e_dxf) ;; Sélection de départ (setq ssa (ssget '((0 . "LWPOLYLINE,LINE")))) ;; Crée un nouveau jeu de sélection (setq ssb nil; Supprime l'ancien pour la phase de teste ssb (ssadd); Crée un nouveau jeu de sélection ) ;; Parcourt du jeu de sélection depuis la fin (repeat (setq i (sslength ssa)) ;; Obtient le nom de l'entité à l'indice spécifié (setq e (ssname ssa (setq i (1- i)))) ;; Extrait sa liste de définition dxf (setq e_dxf (entget e)) ;; Teste si polyligne et si fermé (présence du bit 1 dans le code 70) (if (and (wcmatch (cdr (assoc 0 e_dxf)) "*POLYLINE") (= 1 (logand (cdr (assoc 70 e_dxf)) 1))) (progn (ssadd e ssb) ; ajoute l'entité a la sélection ssb (ssdel e ssa) ; supprime l'entité de la sélection ssa ) ) ) ) Pour tester le code comme les jeux de sélection n’ont pas été localisé dans la fonction (selection), dans la console visual lisp, tape ceci pour visualiser tes différentes sélections: 2ème méthode (la plus simple et celle que tu voulais.. ;) ) Filtrer la sélection de départ, au moyen de la sélection Précédente pour créer la nouvelle sélection puis la parcourir afin de supprimer ses éléments de la sélection précédente. (defun selection (/ i) ;; Sélection de départ (setq ssa (ssget '((0 . "LWPOLYLINE,LINE")))) ;; Sélection les polylignes fermé de la sélection précédente (setq ssb (ssget "_P" '((0 . "*POLYLINE") (-4 . "&") (70 . 1)))) ;; Parcourt du jeu de sélection (repeat (setq i (sslength ssb)) ;; Supprime dans ssa l'entitées présente dans ssb (ssdel (ssname ssb (setq i (1- i))) ssa) ) ) Pour tester c’est comme le code précédent Bon courage pour la suite. A+
-
Fonction d'encadrement d'un nombre réel
VDH-Bruno a répondu à un(e) sujet de bonuscad dans Pour aller plus loin en LISP
Re, Bon dans la foulée et à chaud les fruits de mon extrapolation sur la question des encadrements et leurs relations… Entier inférieur ou égal? ;; n?<=d ;; Retourne l'entier inférieur ou égal au nombre (defun n?<=d (d) ((lambda (n) (if (> n d) (1- n) n)) (fix d) ) ) ;; ou (defun n?<=d (d) (1- (n?>d d))) Entier strictement supérieur? ;; n?>d ;; Retourne l'entier strictement supérieur au nombre (defun n?>d (d) ((lambda (n) (if (> n d) n (1+ n))) (fix d) ) ) ;; ou (defun n?>d (d) (1+ (n?<=d d))) Entier strictement inférieur? ;; n?<d ;; Retourne l'entier strictement inférieur au nombre (defun n?<d (d) ((lambda (n) (if (<= d n) (1- n) n)) (fix d) ) ) ;; ou (defun n?<d (d) (1- (n?>=d d))) Entier strictement supérieur ou égal? ;; n?>=d ;; Retourne l'entier strictement supérieur ou égal au nombre (defun n?>=d (d) ((lambda (n) (if (<= d n) n (1+ n))) (fix d) ) ) ;; ou (defun n?>=d (d) (1+ (n?<d d))) (Ps : En conclusion si on connait n?<=d ou n?>d et n?<d ou n?>=d cela suffit pour définir tous les cas, comme dans les routines floor & ceil de (gile)). A+ EDIT : Simplifié (< 0 (- d n)) par (>= n d) dans les 2 dernières fonctions en comparant avec la fonction ceil de (gile) -
Bonjour, Problème de syntaxe avec vla-saveas cela devrait aller mieux sinon.. Aide aux développeurs d'AutoCAD -> ActiveX and VBA Reference -> Methods -> SaveAs Method Cela n'est pas possible, confère la réponse numéro 6 de (gile) : On ne peut pas appeler les fonctions command ou vl-cmdf depuis la fonction de retro action (callback) d'un réacteur. A+
-
Bonjour, De mémoire, j’y vais de mon petit retour d’expérience, j’ai constaté les problèmes d’écrit le jour où je n’ai plus été administrateur de ma machine au travail, chez moi je n’ai jamais eu aucun soucis de ce type, c’était sous AutoCAD 2002 LT et XP. Actuellement je ne saurais dire car je ne peux ouvrir de fichier en double cliquant sur un fichier via l’explorateur car je suis sous Seven et AutoCAD 2007 est installé pour ce lancer en tant qu’administrateur pour résoudre les problèmes (pas tous)de compatibilité, même si le mieux serai une virtualisation sous XP, mais hélas je n’ai aucun droit sur ma machine pour le faire. En conclusion je crois cela arrive(ou arrivait) parfois en fonction des droits utilisateurs que tu as sur ton poste. A+
-
Fonction d'encadrement d'un nombre réel
VDH-Bruno a répondu à un(e) sujet de bonuscad dans Pour aller plus loin en LISP
Bonjour, Oui tout à fait Bonuscad car il n’y a que ce matin que je viens de réaliser en réfléchissant sur la troncature des nombres réels que (minusp (- d n)) <=> (> n d), des fois c’est avec des évidences que l’on se complique le plus la vie… Donc: (defun foo (d) ((lambda (n) (if (> n d) (cons n (1- n)) (cons (1+ n) n) ) ) (fix d) ) ) Maintenant oui ! ;) A+ -
Fonction d'encadrement d'un nombre réel
VDH-Bruno a répondu à un(e) sujet de bonuscad dans Pour aller plus loin en LISP
Bonsoir, Ma variante sans or ni and ;-) (defun foo1 (d) ((lambda (n) (if (minusp (- d n)) (cons n (1- n)) (cons (1+ n) n) ) ) (fix d) ) ) La même présenté différemment (defun foo2 (d / n) (if (minusp (- d (setq n (fix d)))) (cons n (1- n)) (cons (1+ n) n) ) ) A+ -
Salut Pour la commande _aidimfliparrow Sélectionne une seule flèche puis relance la commande pour la seconde extrémité. Il n’y a pas de quoi, tu verras la modif crée une bascule (0 <->1) de façon à reproduire le comportement de la commande _aidimfliparrow, tout en l’appliquant aux 2 extrémités de la cotations… A+
-
Bonjour -Olivier- Après un petit coup d’œil rapide sur ta fonction ici : (setq ent_dxf (subst (cons n 1) (assoc n ent_dxf) ent_dxf))) J’aurais tendance à préférer cette écriture : (setq ent_dxf (subst (cons n (abs (1- (cdr (assoc n ent_dxf))))) (assoc n ent_dxf) ent_dxf)) Pour que cela soit réversible en cas d’erreur, car la fonction inverse le sens des flèches même pour les cotations dont les flèches sont "bien orienté par défaut". Le code : (defun c:invfl (/ i ss ent_dxf) (and (setq ss (if (cadr (ssgetfirst)) (ssget "_I" '((0 . "DIMENSION"))) (ssget '((0 . "DIMENSION"))) ) ) (repeat (setq i (sslength ss)) (setq ent_dxf (entget (ssname ss (setq i (1- i))))) (entmod (foreach n '(74 75) (setq ent_dxf (subst (cons n (abs (1- (cdr (assoc n ent_dxf))))) (assoc n ent_dxf) ent_dxf)) ) ) ) ) (princ) ) A+
-
Afficher la fenêtre de texte
VDH-Bruno a répondu à un(e) sujet de krunch dans Pour aller plus loin en LISP
Bonjour, A la différence près que tu passe par la fonction command pour les appeler depuis un lisp : (command "_TEXTSCR") (command "_GRAPHSCR") Alors qu’elles sont définie en tant que fonction en AutoLisp : (textscr); Passe d'un affichage graphique à un affichage de texte (graphscr); Passe d'un affichage de texte à un affichage graphique Oui,pour info il y avait également la fonction (textpage) qui est un équivalent.. A+ -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
Re, La déduction découle de source lorsque l’on fait le parallèle avec la fonction entmake Pour illustrer : ((lambda (x) (entmake (list '(0 . "LINE") '(8 . "JeSuisUnNouveauCalque") (cons 10 x) (cons 11 (getpoint x "\n2ème point: ")) ) ) ) (getpoint "\n1er point: ") ) Si cela est le cas j’en suis heureux, car ce n’est qu’un juste retour des choses.. :) A+ -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
Salut, Ho, pour le Méa culpa j’en demandais pas tant, car le progn n’amenait pas de disfonctionnement, c’était plus pour le jeux… :P Une petite précision tout de même sur l’utilisation du code dxf8, il se justifiait par l’emploie de entmod que je trouve très puissant et confortable, entmod crée le calque si il n’existe pas et change l’entité de calque.. (Ps : ce forum n’étant pas spécifiquement orienté lisp j’arrête là ma prose et m’en excuse.) A+ -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
"Humour" ou on ne c'est pas compris :blink: , dans le doute je développe ;) progn ne sert à rien, car en sortie de l’instruction or true est toujours retourné donc à ce stade (vla-put-layer obj ent) sera évalué.. ;; Place tout les Xref du fichier dans le calque de leur nom de respectif (defun c:layXref (/ ent obj ss) (vl-load-com) (ssget "_X" '((0 . "INSERT"))) (vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-ActiveDocument (vlax-get-acad-object)))) (and (vlax-property-available-p obj 'Path) (or (tblsearch "layer" (setq ent (strcat "X-" (vla-get-name obj)))) (vla-add (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))) ent) ) (vla-put-layer obj ent) ) ) (if ss (vla-delete ss)) (princ) ) A+ -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
Salut, Oui merci Patrick_35, tu as 100% raison remarque pertinente. :) Par contre je trouve dommage qu’en retour tu aies laissé trainé ce petit progn qui il me semble n’apporte rien de plus au code… ;) :D Amicalement Bruno -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
Re, Dans ce cas une version plus spécifique à lancer quand tu veux dans ton dessin (et qui évite l’usage de d’objet réacteur), qui met toutes les Xref d’un dessin sur un calque de même nom préfixé de X- , à tester.. ;; Place tout les Xref du fichier dans le calque de leur nom de respectif (defun c:layXref (/ ent obj ss) (vl-load-com) (ssget "_X" '((0 . "INSERT"))) (vlax-for obj (setq ss (vla-get-activeselectionset (vla-get-ActiveDocument (vlax-get-acad-object)))) (if (vlax-property-available-p obj 'Path) (entmod (subst (cons 8 (strcat "X-" (cdr (assoc 2 (setq ent (entget (vlax-vla-object->ename obj))))))) (assoc 8 ent) ent) ) ) ) (if ss (vla-delete ss) ) (princ) ) Cordialement -
Comment attacher un xref avec un calque du même nom
VDH-Bruno a répondu à un(e) sujet de naito073 dans AutoCAD 2010
Salut, Pour le principe, un truc très simpliste écrit en moins de 2 minutes, lance cette fonction layNom immédiatement après avoir insérer ton Xref (ou tout autre objet ayant un code de groupe dxf 2). ;; Place le dernier objet dessiné sur le calque correspondant ;; au code dxf 2 si il existe. (defun c:layNom (/ ent) (if (assoc 2 (setq ent (entget (entlast)))) (entmod (subst (cons 8 (cdr (assoc 2 ent))) (assoc 8 ent) ent)) ) (princ) ) Pour quelque chose de plus abouti et automatique, c’est possible en Vlisp avec une fonction réacteur, mais de retour de congés je n’ai pas le temps matériel pour faire plus pour le moment… Cordialement -
Salut Patrick_35 Tout à fait d’accord avec toi, j’avoue avoir profité d’un contexte et d’un environnement beaucoup plus favorable pour débuter.. Mais je pense que cela doit être un plus et pas un substitue au fait de lire la doc et tester les fonctions dans la console, pour s’imprégner de la logique du language. Pas mieux… :) A+ (Ps : Merci également à toi pour toute tes contributions sur ce forum)
