Aller au contenu

JPhil

Membres
  • Compteur de contenus

    207
  • Inscription

  • Dernière visite

  • Jours gagnés

    6

Tout ce qui a été posté par JPhil

  1. JPhil

    Diffuseur sur gaine verticale

    Tu as cette solution ( https://villagebim.typepad.com/villagebim/2016/02/comment-transformer-une-famille-hebergee-dans-un-plafond-mur-sol-en-une-famille-hebergee-par-une-face.html ) qui permet de basculer une famille avec un hôte en par face. Sinon tu créés directement ta famille avec modèle générique par face. La méthode consiste à créer ton objet (pour le cas présent un diffuseur) dans une famille avec modèle générique sans hôte (et sans face) avec catégorie "neutre", puis d'insérer cette famille générique dans une famille avec modèle générique par face et tu en profites pour choisir ta catégorie de famille. Il ne faut pas hésiter à imbriquer des familles car cela te permet de basculer de type à occurrence (et inversement) ou d'avoir les 3 axes de rotation, chose impossible à faire dans une seule famille.
  2. JPhil

    Diffuseur sur gaine verticale

    Ne faut-il pas placer le diffuseur en mode "vue par face" ? La famille diffuseur doit être créée dans ce sens sinon ça ne fonctionne pas. Et là tu poses ton diffuseur dans toutes les sens que tu veux. En gros faut pas utiliser le mode mur ou plafond lors de la création de la famille.
  3. Bien vu Luna, On est presque au bout car il affiche même les cdv vides : Le résultat de la commande : (mapcar '(lambda (x) (cons (car x) (length (cdr x)))) doublons) est : Un coup de baguette magique pour enlever les vides et voici le lisp final : (defun c:TestControleRFL10 () ;; grouper les références de bloc du jeu de sélection par valeur d'attribut "NUMCDV") (setq blocsParCdv nil) (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "JOINT_VOIE*")))) (repeat (setq i (sslength ss)) (setq bloc (ssname ss (setq i (1- i))) cdv (getpropertyvalue bloc "NUMCDV") blocsParCdv (if (setq entry (assoc cdv blocsParCdv)) (subst (cons cdv (cons bloc (cdr entry))) entry blocsParCdv) (cons (cons cdv (list bloc)) blocsParCdv) ) ) ) ) (setq doublons (vl-remove-if '(lambda (x) (= 1 (length (cdr x)))) blocsParCdv)) (mapcar '(lambda (x) (cons (car x) (length (cdr x)))) doublons) (vl-remove-if '(lambda (x) (= x nil)) (apply 'append (mapcar '(lambda (x) (mapcar '(lambda (y) (if (/= (car x) "") (strcat (car x) " au PK " (getpropertyvalue y "PKT"))) ) (cdr x) ) ) doublons ) ) ) ; fin vl-remove-if ) ; fin defun Le résultat final : Merci @(gile) et @Luna 🙂
  4. @Curlygoth, Les numéros de CDV ne se suivent pas forcément , il peut y avoir des trous. Le plan est déjà existant, il s'agit d'une vérification afin de voir s'il n'y a pas de doublons, et si doublons alerter toutes les équipes afin de "réparer" au mieux. Je viens de tester le code de @(gile) : (defun c:TestControle () ;; grouper les références de bloc du jeu de sélection par valeur d'attribut "NUMCDV") (setq blocsParCdv nil) (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "JOINT_VOIE*")))) (repeat (setq i (sslength ss)) (setq bloc (ssname ss (setq i (1- i))) cdv (getpropertyvalue bloc "NUMCDV") blocsParCdv (if (setq entry (assoc cdv blocsParCdv)) (subst (cons cdv (cons bloc (cdr entry))) entry blocsParCdv) (cons (cons cdv (list bloc)) blocsParCdv) ) ) ) ) (setq doublons (vl-remove-if '(lambda (x) (< 1 (length (cdr x)))) blocsParCdv)) ;;; donne le résultat suivant : ;;; ((cdv 593D <Nom d'entité: 25786140b30>) (cdv 593C <Nom d'entité: 25786140ad0>) (cdv 593B <Nom d'entité: 25786140a80>) (cdv 593A <Nom d'entité: 2578613dd50>) (cdv 468B <Nom d'entité: 257863cdad0>) ("cdv 468B" <Nom d'entité: 257863cdad0>)...) ;;; il manque les deux "cdv 468A" ainsi que les deux "cdv 505" (mapcar '(lambda (x) (cons (car x) (length (cdr x)))) doublons) ;;; donne le résultat suivant : ;;; (("cdv 593D" . 1) ("cdv 593C" . 1) ("cdv 593B" . 1) ("cdv 593A" . 1) ("cdv 468B" . 1) ...) (apply 'append (mapcar '(lambda (x) (mapcar '(lambda (y) (strcat (car x) " au PK " (getpropertyvalue y "PKT")) ) (cdr x) ) ) doublons ) ) ;;; donne le résultat suivant : ;;; ("cdv 593D au PK 0.700VE" "cdv 593C au PK 0.591VE" "cdv 593B au PK 0.511VE" "cdv 593A au PK 0.432VE" "cdv 468B au PK 5.910" ...) ) ; fin defun Je pense qu'il y a un problème car pour le "cdv 468A" j'en ai deux ("cdv 468A au PK 5.951" et "cdv 468A au PK 6.846") tout comme le "cdv 505" ("cdv 505 au PK 7.060" et "cdv 505 au PK 7.343"), mais ils n'apparaissent pas dans la liste. "Doublons" me donne 448 éléments or il y'en a 469 (length txtCDVPK) dans mon programme d'essai. Une idée du pourquoi du comment ?
  5. Je testerai prochainement ton code. Si je vois l'idée j'ai besoin de voir le résultat à chaque étape pour bien comprendre. Merci ;)
  6. Peux-tu développer ton approche ?
  7. @Luna, La finalité du programme est la suivante : faire apparaitre les doublons et dire où ils se trouvent. J'ai des blocs "JOINT_VOIE*" avec l'attribut "NUMCDV" dont la valeur est "cdv ...". Normalement cette valeur doit être unique, d'où l'idée du programme. La fonction sub permet de dire le nombre doublon pour chaque valeur. La fonction sub2 permet de garder que les doublons et d'effacer le reste c'est à dire les valeurs uniques. Comme tu as pu le remarquer la liste pour la fonction sub doit être triée. J'ai créé sub2 pour un autre programme (d'où les "IEF-01-VEI" en commentaire que j'aurais pu effacer), donc je le réutilise pour celui-ci. J'aurais pu le modifier pour ne faire apparaitre que la valeur en supprimant le nombre de doublon : (setq newlst (cons (cdr (nth toto lst)) newlst)) Mais tel quel c'est déjà pas mal et plutôt très utile si on s'arrête là. Là où j'ai voulu aider l'utilisateur c'est de donner la valeur du PK. Le plan à contrôler est un plan schématique avec une échelle de Point Kilométrique (d'où PK). Pour information PKT = Point Kilométrique Terrain. Visuellement c'est intéressant pour nous (utilisateurs AutoCAD) mais aussi pour les chargés d'affaires qui eux non pas accès à AutoCAD mais ont le plan sous format PDF. A partir de là, j'ai voulu ajouter la valeur de l'attribut "PK" à la valeur de l'attribut "NUMCDV". Plusieurs options : ("cdv 231A" "3.173A") ou ("cdv 231A" . "3.173A") ou ("cdv 231A au PK 3.173A") Bien évidement la fonction sub ne fonctionne plus avec ce type d'argument et n'a pas été conçu pour ça de toutes façons. Donc j'ai essayé de trouver une autre solution (ma fonction tri) qui consiste à récupérer la deuxième valeur de mes doublons, ici "cdv 231A" de (3 . "cdv 231A") provenant de la fonction sub2 et de la chercher dans la grande liste (valeur de l'attribut "NUMCDV" + valeur de l'attribut "PKT") afin d'afficher mes doublons avec mes PK de cette façon : ("cdv 231A au PK 3.173A" "cdv 231A au PK 3.514A" "cdv 231A au PK 5.122A"). Si ma fonction tri fonctionne plutôt bien en mode manuel en changeant la valeur de toto (setq toto 3) par exemple, ben dès que j'essaye de la mettre dans une boucle ça ne fonctionne plus. Peut-être qu'il ne faut pas utiliser un while, un repeat peut-être ? C'est là où je coince car je souhaite obtenir quelque chose comme : (("cdv 231A au PK 3.173A" "cdv 231A au PK 3.514A" "cdv 231A au PK 5.122A") ("cdv 251 au PK 4.173A" "cdv 251 au PK 3.673A") ("cdv 200B au PK 1.843" "cdv 200B au PK 3.053" "cdv 200B au PK 10.822")) Pour sub2, j'ai pas pensé à vl-remove-if donc je te fais confiance. Est-ce plus clair ? [Edit] rectification de la cohérence dans la liste de résultat finale concernant les "cdv 200B"
  8. Je beug complet sur la fin d'un programme de test/contrôle. Voici le début du programme : ;;; ;;; source : https://cadxp.com/topic/28984-trie-interrogations-vl-sort-list-compaison-function/ ;;; ;;; Affiche une liste qui contient le nombre de doublon d'une liste (defun sub (lst n) (if (cadr lst) (if (equal (car lst) (cadr lst)) (sub (cdr lst) (1+ n)) (cons (cons n (car lst)) (sub (cdr lst) 1)) ) (list (cons n (car lst))) ) ) ;;; ;;; ;;; (setq lst '("IEF-01-VEI" "IEF-01-VEI" "IEF-02-VEI" "IEF-03-VEI" "IEF-04-VEI" "IEF-04-VEI" "IEF-04-VEI" "IEF-05-VEI")) ;;; ;;; Affiche uniquement la liste des doublons du programme "sub" (defun sub2 (lst) (setq lst (sub lst 1)) (setq nblst (length lst)) (setq newlst nil) (setq toto 0) (while (> nblst toto) (if (> (car (nth toto lst)) 1) (setq newlst (cons (nth toto lst) newlst)) ) (setq toto (+ 1 toto)) ) (reverse newlst) ) ;;; ;;; ;;; (tri txtCDVPK (cdr (nth toto (sub2 txtCDV)))) ;;; (defun tri (lst arg / newlst) (setq toto 0) (while (> (length lst) toto) (if (= (substr (nth toto lst) 1 (strlen arg)) arg) (setq newlst (cons (nth toto lst) newlst)) ) ; fin if (setq toto (+ 1 toto)) ) ; fin while toto (reverse newlst) ) ;;; (defun c:TestControle () (setq toto 0) (setq ent nil) (setq nbCDV nil) (setq txtCDV nil) (setq txtCDVPK nil) (setq CaptureCDV nil) (setq CaptureCDV (ssget "_X" (list '(0 . "INSERT") (cons 2 "JOINT_VOIE*")))) (setq nbCDV (sslength CaptureCDV)) (while (> nbCDV toto) (setq ent (ssname CaptureCDV toto)) (if (= (strcase (substr (getpropertyvalue ent "NUMCDV") 1 3)) "CDV") (progn (setq txtCDV (cons (getpropertyvalue ent "NUMCDV") txtCDV)) (setq txtCDVPK (cons (strcat (getpropertyvalue ent "NUMCDV") " au PK " (getpropertyvalue ent "PKT")) txtCDVPK)) ) ) (setq toto (+ 1 toto)) ) (setq txtCDV (vl-sort txtCDV '<)) (setq txtCDVPK (vl-sort txtCDVPK '<)) ;;; Résultat d'un extrait des listes ;;; txtCDV --> ("cdv 231A" "cdv 231B" "cdv 233" "cdv 235" "cdv 237A" "cdv 237B" "...") ;;; (sub2 txtCDV) --> ((3 . "cdv 461B") (2 . "cdv 466") (2 . "cdv 468A") (2. "...")) ;;; txtCDVPK --> ("cdv 231A au PK 3.173A" "cdv 231B au PK 3.092A" "cdv 233 au PK 3.022A" "cdv 235 au PK 2.936A" "cdv 237A au PK 2.870A" "cdv 237B au PK 2.791A" "... au PK ...") ;;; cette partie que j'essaye de passer en mode totomatique ;;; (setq toto 5) ;;; (tri txtCDVPK (cdr (nth toto (sub2 txtCDV)))) ;;; fin de la partie en mode totomatique ) ; fin defun Voici la partie où je beug : (setq toto 5) (tri txtCDVPK (cdr (nth toto (sub2 txtCDV)))) En mode manuel (remplacer la valeur de toto par n'importe quel nombre) ça fonctionne super, mais en mode totomatique avec un while classique comme ça : (setq toto 0) (setq resultat nil) (while (> (length (sub2 txtCDV)) toto) (setq resultat (cons (tri txtCDVPK (cdr (nth toto (sub2 txtCDV)))) resultat)) (setq toto (+ 1 toto)) ) Chat marche pas. Je dois louper un truc. Pourtant j'suis pas loin du but. Merci d'avance pour votre aide.
  9. La programmation c'est comme un jeu. Si tu t'y intéresses t'as envie d'aller plus loin et donc d'en apprendre plus. C'est le fruit d'expérience suite à de nombreux échecs. Mais rester dans son coin c'est arriver très vite à ses limites et à la démotivation. @Luna Pour une fois que le français est doué dans un domaine on va pas se plaindre, non ? 😂
  10. J'ai un peu de mal à comprendre, tu as deux fichiers DWG avec chacun une présentation ou tu as un seul fichier DWG avec plusieurs présentations ?
  11. Est-ce que ce post un peu ancien peut aider ? Hatch Using LISP - AutoLISP, Visual LISP & DCL - AutoCAD Forums (cadtutor.net)
  12. Autre solution possible de la part d'un développeur fainéant : 1) afficher la chaine de caractère "Ma80cm" 2) demander à l'utilisateur les caractères qu'il veut isoler 3) vérifier avec wcmatch, si ok étape 4 sinon retour étape 1 4) suite du programme On a bien dit que tous les chemins mènent à Rome, non ? 😇
  13. Pas testé non plus, mais je vois plus ça : (wcmatch (substr chaîne I 1) "[a-z],ç,à,â,ä,á,ã,å,ā,ă,ą,ê,ë,é,è,ē,ė,ę,ě,ĕ,ə,î,ï,í,ì,ı,į,ī,ó,ò,ô,ö,õ,ő,ü,ú,ù,û,ų,ű,ů,ū") Fait à partir d'une tablette sous Android
  14. Pas bête (faut penser à virer itoa par contre car c'est pour les chiffres), perso j'avais en tête d'utiliser strcase afin de voir si le caractère était en majuscule ou pas, et un mélange de strcase et xstrcase pour les caractères accentués.
  15. Tous les chemins mènent à Rome ;) Aurais-tu une idée afin d'extraire uniquement les caractères minuscules de la chaîne "Ma80cm" ? Et quitte à faire l'exercice jusqu'au bout, extraire uniquement les caractères majuscules. On peut aussi rajouter en bonus le grand défis des caractères accentués.
  16. C'est dans ce genre d'exercice où l'on voit que chacun a une approche différente de la résolution du problème, et ça c'est plutôt intéressant. Et toi @DenisHen, quelle approche avais-tu en tête ?
  17. Test chaque caractère de la chaîne un par un, et si il y a un chiffre le met dans la variable strnb. (Setq chaîne "Ma80cm") (Setq I 0) (Setq strnb nil) (while (< (length chaîne) I) (if (= (wcmatch (itoa (substr chaîne I 1)) "[0-9]") T) (Setq strnb (strcat strnb (substr chaîne I 1))) ) (Setq I (+ I 1)) ) (Princ strnb) [Edit] je viens de voir qu'il manquait une parenthèse à la fin de "(setq strnb (strcat ...", erreur résolue.
  18. Tu peux t'inspirer de Christian : Post original >>> ici <<<
  19. JPhil

    Onglet qui a disparu

    Si tu es en mode télétravail, vérifie tes accès réseaux (à réactiver dans la fenêtre de l'explorateur de fichiers) et le VPN de ton entreprise. Après un redémarrage d'AutoCAD et/ou de Windows, vérifie si Autoturn est toujours installé sur ton poste.
  20. Rien à ma connaissance en français, Typing of the Dead avec le clavier QWERTY pour apprendre l'anglais et/ou japonais et un vieux logiciel orienté apprentissage scolaire (plutôt bien fait dans mon souvenir) avec clavier QWERTZ pour apprendre l'allemand (ouch! retour en arrière il y a un peu plus de 25 ans). Très intéressé si tu tombes sur ce genre de logiciel avec le clavier français.
  21. Les deux forums sont indépendants mais les membres peuvent être sur plusieurs forums (français comme anglais).
  22. Le schéma fonctionnel est bien avancé mais pas encore fini. Je viens de comprendre à l'instant comment ils ont faits (je parle du programme Lisp actuel). Ben c'est tout simple, ils ont utilisés la technique des données étendues 🥳. Et là le programme Lisp devient clair ... enfin presque 😅. Je vais pouvoir dormir sur mes deux oreilles. Bref, merci à tou(te)s [Edit] La zone dans le Lisp qui m'a aidée à la compréhension : ;; Lecture des objets (setq j (ssget "X" '((-3 . (("Toto")))))) C'est le -3 qui m'a poussé à regarder >>> ici <<< Group code // Description -5 // APP: persistent reactor chain -4 // APP: conditional operator (used only with ssget) -3 // APP: extended data (XDATA) sentinel (fixed) -2 // APP: entity name reference (fixed) -1 // APP: entity name. The name changes each time a drawing is opened. It is never saved (fixed)
  23. @Luna, J'imagine qu'il n'est pas l'auteur des noms de calques. Par contre si le but était de remplacer "AAAAA-GGGGG" par "", là ton programme est top. Ou alors il remplace tous les calques portant la mention "AAAAA-GGGGG" par le nom d'une ville, et peut ainsi regrouper tous ces fichiers (séparés) dans un seul et même fichier avec la possibilité de gérer/geler en fonction de telle ou telle ville. C'est ça @stefD ?
  24. Pour s'entrainer, rien ne vaut un bon Typing of the Dead (version JAP tant qu'à faire) 😇
  25. Sur Edge, quand je tape "aps" j'ai le mot souligné en rouge, en faisant clic droit il me propose "APS", "apes" et "apis". Ouais pas terrible, autant investir dans des nouveaux doigts 🤣
×
×
  • 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é