Aller au contenu

VDH-Bruno

Membres
  • Compteur de contenus

    1 146
  • Inscription

  • Dernière visite

  • Jours gagnés

    20

Tout ce qui a été posté par VDH-Bruno

  1. Bonjour, Je vais te faire une réponse en fonction de ce que je crois avoir compris, les lignes de codes suivantes sont données à titre indicatif, je te laisse le soin de les optimiser et de les adapter à ton cas. Si tu es certain que les blocs des styles de cotes n’ont pas été forcé, tu peux y arriver en filtrant les styles de cote définie avec le bloc recherché, pour construire la liste de filtre il te faut explorer la table des styles de cotations. L’expression suivante retourne la sélection des cotes ayant le bloc "ARCHTICK" (saisir "_ARCHTICK" sur une version anglaise il me semble) (ssget (list '(0 . "DIMENSION,LEADER") (cons 3 (lst2str (StyleCot "ARCHTICK") ",")))) Les routines associés ;; Renvoie la liste des styles de cotation (DIMSTYLE) ;; dont la définition possède le type de bloc spécifié Dimblk. (defun StyleCot (Dimblk / DimStyle NameStyle) (while (setq DimStyle (tblnext "DIMSTYLE" (not DimStyle))) (if (member Dimblk (if (zerop (cdr (assoc 173 DimStyle))) (list (cdr (assoc 5 DimStyle))) (list (cdr (assoc 6 DimStyle)) (cdr (assoc 7 DimStyle))) ) ) (setq NameStyle (cons (cdr (assoc 2 DimStyle)) NameStyle)) ) ) NameStyle ) ;; LST2STR (gile) ;; Concatène une liste et un séparateur en une chaine ;; ;; Arguments ;; lst : la liste à transformer en chaine ;; sep : le séparateur ;; ;; Exemples ;; (lst2str '(1 2 3) ",") -> "1,2,3" ;; (lst2str '("a" "b" "c") " ") -> "a b c" (defun lst2str (lst sep) (if (cadr lst) (strcat (vl-princ-to-string (car lst)) sep (lst2str (cdr lst) sep) ) (vl-princ-to-string (car lst)) ) ) Sinon on peut également filtrer le jeu de sélection après coup et ne garder que les cotations du type désiré, de plus en travaillant directement sur les propriétées ArrowheadBlock Arrowhead1Block Arrowhead2Block avec ActiveX, on prend bien en compte la cotations et plus son style, donc il n'y a plus de soucis avec les objets modifié. Exemple de code (toujours pour retourner la sélection des cotes ayant le bloc "ARCHTICK") : (selection (ssget "_X" '((0 . "DIMENSION,LEADER"))) "ARCHTICK") La routines associés (defun selection (ss Dimblk / ss1 obj ent i) (setq ss1 (ssadd)) (repeat (setq i (sslength ss)) (cond ((vlax-property-available-p (setq obj (vlax-ename->vla-object (setq ent (ssname ss (setq i (1- i)))) ) ) 'ArrowheadBlock ) (if (= (vla-get-ArrowheadBlock obj) Dimblk) (ssadd ent ss1) ) ) (T (if (member Dimblk (list (vla-get-Arrowhead1Block obj) (vla-get-Arrowhead2Block obj) ) ) (ssadd ent ss1) ) ) ) ) ss1 ) Ps : Il ne sert à rien de filtrer sur les codes 100 ce sont des marqueurs de sous classes ignorés dans les filtres de sélection. Cordialement
  2. Re, Dans ce cas (strcat (itoa (fix N1)) (if (= N1 (fix N1)) " banches de 250" " banches de 250 + 1 banche de 125" ) ) A+
  3. Bonjour, Ce n’est pas tellement sur les valeurs de retours que portait mon propos mais plutôt sur ce qui se passait à l’intérieur du cond, si je développe un peu en commentant les lignes de codes : Par exemple si j’ai préalablement affecté la valeur de n à A , j’ai écris A=n alors écrire : ((= A 0) (strcat " impossible ")) Revient à écrire ((= n 0) (strcat " impossible ")) De plus comme A=n, la condition du if (= A n) est toujours "vrai" (le vrai est symbolisé par T) donc: ((= A n) (strcat (rtos N1) "banche de 250? ")) Revient à dire : (T (strcat (rtos N1) "banche de 250? ")) ; ou ((strcat (rtos N1) "banche de 250? ")) Comme cette condition sera toujours vrai la suivante : (T " ne rien faire pour l'instant ") Ne sera jamais atteinte, on peut donc la supprimer. Et comme j’ai supprimé toutes les références à A dans le code, je peux également supprimer la ligne d'affectation (setq n A). Pour un début en lisp, tu sembles t’accrocher et tu insistes avant de passer à un autre sujet c’est bien. Bonne continuation, A+
  4. RE et rapidement, Si je ne me trompe dans ce cas pour que N1=4.8 tu as 4.8x2.5= 12 m de murs banchés, tes 11.25m (c.a.d 4 banche de 250 + 1 banche de 125) de banches ne suffisent pas, il te faudra 5 banches . En fait, ce que tu cherches à savoir c’est si la partie décimal de N1 est >0.5 (tu comptes N1+1 banches) ou <0.5 (tu comptes N1 banche + 1/2 banche), ce qui peut se coder comme ceci : (if (> 0.5 (- N1 (fix N1))) (strcat (rtos (fix N1)) " banches de 250 + 1 banche de 125") (strcat (rtos (1+ (fix N1))) " banches de 250") ) Sinon une réflexion d’ordre plus général comme tu débute en Lisp, tu peux factoriser tes appels à setq en l'appliquant à ton code précédent. Là : (setq L1 (getint "\n Combien y'a t-il de mètre?") n (getint "\n Combien y'a t-il d'arrêt?") A n N1 (/ L1 2.50) N250 (getint "\n Combien y'a t-il de 250") ) Et là : (setq reponse (cond ((> N1 N250) (strcat " test3 ")) ((= A 0) (strcat " impossible ")) ((= A n) (strcat (rtos N1) "banche de 250? ")) (T " ne rien faire pour l'instant ") ) ) De plus dans les lignes qui suivent il y a un problème de logique entre les affectations aux variables et les conditions d’exécution du code.. En toutes logiques l’affectation à A ne sert à rien, et la dernière clause également si tu écris tes conditions comme ceci : (setq reponse (cond ((> N1 N250) (strcat " test3 ")) ((= n 0) (strcat " impossible ")) (T (strcat (rtos N1) "banche de 250? ")) ) ) De plus en appelant astucieusement (initget (+ 1 2)) avant de renseigner n, tu peux encore simplifier ton code.. D’ailleurs à la réflexion je me demande bien ce que signifie pour toi le nombre d’arrêt, et si cela ne peut pas être automatiquement calculé.. Cordialement
  5. Bonjour, Je te souhaite la bienvenu fiesta13310 sur ce forum, car c’est ta première intervention il me semble. Alors avec cond: (cond ((> N1 N2) "(N1> N2) alors faire le programme suivant") ((= A 0) "si (N1< N2 ET A=0) alors ...") ((= A n) "si (N1< N2 et A=n) alors...") (T "Ne rien faire ou faire autre chose à définir..") ) Note: Remplace les expressions entre guillemets par les actions que tu désires entreprendre. Plus que tu ne le crois, mais pour cela il faut encore creuser un peu ;) Cordialement
  6. Bonjour, Je voudrais encadrer et masquer des textes (texmult), je ne trouve pas de commande Pas certain que ce soit ce que tu cherches à faire.. dans le doute tu peux essayer: La commande TEXTERAP sur Actif ou plus directement sa variable QTEXTMODE en réglant sa valeur sur 1, puis ne pas oublier de faire un REGEN Cordialement
  7. VDH-Bruno

    Équivalences à vl-*

    Bonjour, J’ajoute ici une petite contribution à ce fil de discussion, pour remove ma version moins concise mais pas moins performante.. ;;; équivalence à vl-remove ;;; Supprime toutes les occurrences d'un élément d'une liste ;;; (remove 'a '(b c a d a e a)) -> (B C D E) (defun remove (x l) (cond ((null l) nil) ((equal x (car l)) (remove x (cdr l))) (T (cons (car l) (remove x (cdr l)))) ) ) Dans le même esprit on peut facilement donner une variante à la fonction remove-doubles, si on n’accorde évidemment pas une grande importance à l’ordre des éléments.. ;;; Supprime tous les doublons d'une liste ;;; A n’utiliser que si l'ordre des éléments n'a pas d'importance ;;; (remove-doubles '(a b c b d a)) -> (C B D A) (defun remove-doubles (l) (cond ((null l) nil) ((member (car l) (cdr l)) (remove-doubles (cdr l))) (T (cons (car l) (remove-doubles (cdr L)))) ) ) Et en modifiant très légèrement l’expression, on peut également construire un remove sur toutes les profondeurs d’une liste. ;;; Supprime toutes les occurence d'un élément à toutes les profondeurs d'une liste ;;; (remove-prof 'a '(b a d (b (e a g) a) a e)) -> (B D (B (E G)) E) (defun remove-prof (x l) (cond ((null l) nil) ((equal x (car l)) (remove-prof x (cdr l))) ((listp (car l)) (cons (remove-prof x (car l)) (remove-prof x (cdr l)))) (T (cons (car l) (remove-prof x (cdr l)))) ) ) A+
  8. Bonsoir, (command "_insert" "nom-du-bloc" (getpoint) 1 1 0 Surf Peri "") A adapter suivant le nombre d'attribut à renseigner dans ton bloc..
  9. Salut, Pour faire plus propre et un clin d’œil à Patrick_35, la version avec command : ;) ((lambda (/ echo) (setq echo (getvar 'CMDECHO)) (setvar 'CMDECHO 0) (command "_area" "_o" (entlast)) (princ (strcat "\nLe périmètre est de : " (rtos (getvar 'PERIMETER)) "\nLa surface est de : " (rtos (getvar 'AREA)) ) ) (setvar 'CMDECHO echo) ) ) Note : L’appel à la commande _area par rapport à la commande _list offre un comportement plus généraliste à la fonction, elle ne limite plus l’initialisation des variables systèmes PERIMETER & AREA aux seules entitées polylignes. Dexter ta routine est très bien, si tu veux être puriste, tu peux simplifier l’appel aux fonctions princ & strcat, pense éventuellement à rajouter un appel à (vl-load-com) si tu n’es pas familier des fonctions vla- A+
  10. Bonjour, Pour une polyligne fait précéder l’interrogation des variables systèmes area & perimeter, par un appel à la commande _list pour l’entitée dont tu veux récupérer les données. Exemples pour la dernière entitée dessinée (command "_list" (entlast) "") (getvar 'area); renvoie la surface (getvar 'perimeter); renvoie le perimètre Ps : Avec un appel à (graphscr) tu supprimeras l’affichage en premier plan de la fenêtre de texte AutoCAD amené par l’appel à la commande _list A+
  11. Salut, Il me semble que le problème à déjà évoqué dans ce fil de discussion Mise sur le réseau d\'une dll en c# Peut-être, je me trompe j’ai toujours testé en local et les solutions ont peut-être évolué depuis… A+
  12. VDH-Bruno

    Extension pour AutoLISP

    Salut, Patrick, pour info sous vista au boulot je dois débloquer les fichiers d’aide (provenant d'un autre ordinateur) mais pas à mon domicile sous XP(Paramètre de sécurités ou système d’exploitation à voir..) A+
  13. VDH-Bruno

    Extension pour AutoLISP

    Bonjour, Depuis l’annonce sur l’autre post, on peut dire que cela n’a pas trainé ;) Bravo et merci.
  14. Merci (gile), pour les liens et explications dont la clarté m’impressionnera toujours. A+
  15. Bonsoir, (gile) c’est très intéressant de voir que tu peux étendre les fonctionnalités d’AutoLISP en définissant de nouvelles fonctions au moyen de .net. Pour ma culture personnelle j’aurais une ou deux petites questions qui me viennent rapidement à l’esprit, en point .net, tu sais définir des fonctions avec un nombre d’arguments variables et dans la même veine des fonctions à argument optionnel. Je serais également curieux de savoir avec quoi tu créer tes fichiers d’aide CHM. A+ et merci,
  16. VDH-Bruno

    + et - cotation ordonnée

    Bonjour, Je pense que pour ce que tu souhaites c.a.d. ajouter la modification du point de référence aux cotes ordonnées, il vaut mieux le faire dans une routine spécialisée, plutôt que de modifier la version de Bryce qui est très bien. En repartant de ses lignes de codes, il est très facile de substituer les actuelles coordonnées du point de référence (code DXF 10) par des nouvelles coordonnées utilisateur : ;; Modifie le point de référence des cotes ordonnées (defun c:baseord (/ acdoc filter ss i base lst) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) filter '((0 . "DIMENSION") (-4 . "&=") (70 . 6)) ) (if (cadr (ssgetfirst)) (setq ss (ssget "_I" filter)) (progn (prompt "\nSélectionnez les cotes à modifier ou <entrée pour toutes> : " ) (or (setq ss (ssget filter)) (setq ss (ssget "_X" filter)) ) ) ) (vla-startundomark acdoc) (if (and ss (setq base (getpoint "Spécifiez le nouveau point de référence pour les cotes séléctionnées: " ) ) ) (repeat (setq i (sslength ss)) (entmod (subst (cons 10 base) (assoc 10 (setq lst (entget (ssname ss (setq i (1- i)))))) lst ) ) ) ;repeat ) (vla-endundomark acdoc) (princ) ) De plus comme dans son code Bryce a pris soin d’autoriser la sélection par grippe, il est très facile d’envelopper les 2 commandes dans une troisième bien qu’elles soient définie avec C: ;; Modifie le point de base et ajoute (ou met à jour) un préfixe +/- sur les cotes ordonnées sélectionnées (defun c:ludord () (cond ((cadr (ssgetfirst)) (c:baseord) (c:signord)) (T (c:baseord) (sssetfirst nil (ssget "_P")) (c:signord) (command))) (princ) ) Voilà à tester en théorie cela devrait pas trop mal fonctionner.. A+
  17. VDH-Bruno

    + et - cotation ordonnée

    Bonsoir, oui, bryce le filtre sur le code 70 passe bien sur une version récente comme sur une ancienne, bien vu..
  18. VDH-Bruno

    + et - cotation ordonnée

    Bonjour Tramber, Sympa l’emploie de la fonction boole faudrait vraiment que je m’y intéresse plus à à l'avenir, sinon pour : (prompt"\nChoisissez des objets ou <tout> :") (and (setq i 0 ss (ssget '((0 . "DIMENSION")(100 . "AcDbOrdinateDimension"))) ss (ssget "x" '((0 . "DIMENSION")(100 . "AcDbOrdinateDimension"))) ) Tu ne souhaitais pas plutôt faire un truc dans le genre : (and (setq i 0 ss (cond ((ssget '((0 . "DIMENSION") (100 . "AcDbOrdinateDimension")))) ((ssget "x" '((0 . "DIMENSION") (100 . "AcDbOrdinateDimension")))) ) ) Ps : Bizarrement sur une version 2007 ton filtre sur les cotes ordonnées ne fonctionne pas, il prend tous les cotes, désolé j’ai pas trop le temps pour me pencher sur le problème.. Amicalement Bruno
  19. Bonsoir, Cela arrive avec certaines configurations (vista en ce qui me concerne), comme tout le code se colle sur une seul ligne toutes les expressions suivant un commentaire sont grisées.. Ma parade je ne fais plus de copier coller en directe, je copie-colle sous un traitement de texte puis je copie-colle dans Visual Lisp. A+
  20. Bonjour, Dommage que je n’ai vraiment pas une minute à moi en ce moment pour fournir une réponse très détaillé, donc faute d’un long discourt je vais essayer de te donner un exemple qui te donnera peut être un élément de réponse… Dans ta console Visual Lisp ou sur ta ligne de commande AutoCAD tape par exemple l’instruction suivante : (setq CE '(10.0 10.0 10.0)) Et maintenant relance ta commande spirale tu devrais voir une des manifestations de la problématique que tu te poses.. Cordialement
  21. Bonjour, A titre d’information tu peux toujours consulter ma réponse ici A+
  22. VDH-Bruno

    AUTOCAD 14

    Bonjour Lai, Oui c’est vieux, à l’époque il fallait un dongle (une clef physique) pour l’activer ta version (le numéro de série ne suffit pas), même si les antiquités font sourire certains sur le forum, je m’en souvient comme d’une bonne version pour son époque.. Je le crois aussi mais avant de faire cela n’oublie pas de sauvegarder les fichiers d’aide et éventuellement certaines routines Lisp. La je vais rappeler un petit détail historique qui va faire saliver plus d’un Lispeur amateur ou qui voudrais le devenir… Sur AutoCAD R14 Fr dans les fichiers d’aide Toute la partie consacrée à AutoLISP est en français ainsi que le descriptif de toutes les fonctions (depuis il n’y a eu que très peu d’évolution). A l’époque le Visual LISP n’était pas intégré donc vous n’y trouverez pas les fonctions vl- n’y d’informations sur IDE Visual LISP. Par contre le VBA existait déjà et la section consacrée à l’automation ActiveX traduite dans son intégralité, je pense particulièrement au Manuel de Référence contenant toute la description des objets, méthodes, propriétés etc.. Bien sûr depuis il y a certainement quelques écarts dans la description de l’interface .COM de la version actuelle mais pour débuter et si on n’entend rien à l’anglais c’est pratique. De plus comme cette partie n’existe plus dans l’aide AutoCAD depuis 2011, c’est pas moins convivial que de travailler avec l’aide en anglais de la version 2010 pour VBA. Pour l’adaptation de la syntaxe VBA à Visual LISP il y a le topic de (gile) ici Voilà en quoi à mon sens la version R14 garde son intérêt, maintenant si Lai à l’occasion de mettre ses fichiers d’aide en téléchargement, je pense qu’il fera des heureux.. Sinon il y peut être un moyen sur le net. Personnellement une partie de mes fichiers que j’avais gardé précieusement, dont je me suis bien servi pour débuter en LISP sont corrompue (fausse manip ???) et les autres ne s’ouvrent plus sous vista (il doit y avoir un moyen mais je n’ai pas cherché car j’en ai moins l’utilité). Sinon vous pensez bien que je les aurais mis à disposition depuis longtemps.. En espérant avoir suscité la curiosité de certains sur le forum. A+ Bruno
  23. Tramber c’est gentil de te justifier, blague à part je te comprends très bien, l’on a tous nos priorités et l’on compose avec comme l’on peut.. Merci pour tes lignes de codes je regarde. Ca devrai, le soleil commence seulement à se voiler sur la Picardie donc en Alsace cela devrai tenir jusqu’à la fin de journée. Merci à Patrick_35 et à (gile) d’entrouvrir la porte, je vais tester les codes de (gile) pour mieux comprendre la syntaxe et le mécanisme de fonctionnement des retro-appels. Merci à vous
  24. Bonjour Tramber, Dans ce cas je vais te lire avec un grand intérêt :D , car je ne me suis pas encore intéressé au reacteur, je pensais y venir prochainement, ce sera peut-être l’occasion de regarder cela plutôt que prévu… Amicalement Bruno Ps : En espérant trouver dans le post à venir une porte d’entrée (tout confort) dans l’univers des réacteurs..
  25. Re, La preuve que cela fait avancer, car si j’avais été cohérent avec moi-même, j’aurais dû en toute logique tester, s’il y a un objet de sélectionné.. ((lambda (/ obj res) (while (not (if (and (setq obj (car (entsel))) (vlax-method-applicable-p (setq obj (vlax-ename->vla-object obj)) 'GetAttributes ) ) (setq res (mapcar 'vla-get-TextString (vlax-invoke obj 'GetAttributes) ) ) ) ) (prompt "Sélection non valable... ") ) res ) ) A+ Edit : code corrigé oubli sur la valeur en retour..
×
×
  • 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é