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
-
C’est gentil de me citer bien qu’aujourd’hui je sois plus lecteur que contributeur, c’était vraiment peu de chose… à voir comme un retour pour service rendu à la communauté des CadXPiens ;). @+ Bruno
-
Heureux d'avoir pu aidé, et bienvenu à toi sur CADxp
-
Bonjour, Je n'ai pas d'AutoCAD sous la main pour te faire un exemple "sur mesure" mais tu devrais trouver des éléments de réponse dans ce message posté récemment sur le forum Autodesk https://forums.autodesk.com/t5/autocad-tous-produits-francais/impossible-de-selectionner-un-bloc-dynamique-via-lisp/td-p/10083959 Regarde plus précisément la réponse posté par (gile) avec une condition et l'utilisation de la propriété getpropertyvalue (= (getpropertyvalue (car rupt) "BlockTableRecord/Name") "01_BA_Rupteur") Cordialement Bruno
-
Dimension de polyligne invraisemblable
VDH-Bruno a répondu à un(e) sujet de Perline dans AutoCAD 2018
Bonjour, Regarde du coté de l'élévation sur ta capture d'écran, certainement que les polylignes ne sont pas dans le même plan. Si tu les mesures en distances planes tu auras une longueur plus en rapport avec tes attentes. -
Améliorer la commande " _HideObjects"
VDH-Bruno a répondu à un(e) sujet de Steven dans AutoCAD 2020-2024
Bonjour Steven, N'ayant pas de version récente d'AutoCAD, je n'ai jamais travaillé avec la commande _HideObjects, donc comme BonusCAD j'utilise le code DXF60 et qq ligne de lisp. La version donné par BonusCAD est bonne (comme toujours avec ses codes lisp). Peut être ici, si on travaille avec une sélection précédent Ou comme ceci si on travaille avec la commande puis la sélection: Salutations Bruno -
Validé et conservé la valeur précedente
VDH-Bruno a répondu à un(e) sujet de willy95 dans Débuter en LISP
Content d'avoir pu aidé ;) -
Validé et conservé la valeur précedente
VDH-Bruno a répondu à un(e) sujet de willy95 dans Débuter en LISP
Content d'avoir pu aidé ;) -
Validé et conservé la valeur précedente
VDH-Bruno a répondu à un(e) sujet de willy95 dans Débuter en LISP
Bonjour, Une proposition à tester: (setq Zsol (cond ((GetReal (StrCat "\nSaisir le Z du Sol : <" (Rtos Zsol 2 2) "> : ") ) ) (Zsol) ) ) A+ -
Bonne retraite Patrice ("L'homme aux 3000 lisp +1" ;) ) De la part d'un petit "jeune" qui comme Gérald en est à 3 présidentiels de la sienne.
-
Premier LISP : Rayon de l'arc reliant trois points
VDH-Bruno a répondu à un(e) sujet de crashray dans Débuter en LISP
Re, Ce qui est très gratifiant en lisp, c'est que l'on a pas forcement besoin d'être agrégé de mathématiques pour résoudre la plupart des problèmes, si des fois on est pris par le temps, ses propres lacunes ou pour faire du prototypage rapide de son code, il est toujours possible de déléguer le calcul aux outils de dessins d'AutoCAD. L'énoncé précédent aurait très bien pu être traiter de la façon suivante: (defun rayon3points (pt1 pt2 pt3 / ent rayon) ;; dessine un cercle par 3 points (command "_circle" "3P" pt1 pt2 pt3) ;; récupère le nom d'entité et extrait le rayon de la base de donné (setq ent (entlast) rayon (cdr (assoc 40 (entget ent))) ) ;; supprime le cercle dessiné (entdel ent) ;; retourne le rayon à la fonction appelante rayon ) Avec un peu d'habitude ça ne prend pas plus de 2mn à faire et ça fonctionne très bien aussi, il y a de nombreux exemple de programme lisp écrit comme cela qui rendent de grand service. Bonne soirée -
Premier LISP : Rayon de l'arc reliant trois points
VDH-Bruno a répondu à un(e) sujet de crashray dans Débuter en LISP
@(gile) Les méthodes font suite à cet ancien sujet ou nous avions échangés deux approches: pour les matheux Je m'explique pour crashray lorsqu'il sagit en géométrie de trouvez une mesure (distance), j'ai tendance à privilégier la méthode des sinus, la trigonométrie, les relations entre le cercle unitaire et résolutions des trigones, les rapports de surface ect... Disons les outils de résolutions de la "géométrie classique", c'est très facilement calculable et démontrable avec un petit dessin, les ressources sont nombreuses et facile d'accès. Ces relations reposent sur des proportions, cela fonctionne en 2D et généralement plutôt bien en 3D, sans avoir besoin de ce soucier des paramètres que sont les systèmes de coordonnées (SCO, SCG, SCU) ni des orientations et directions dans les calculs. Par contre si il faut renvoyer des points (coordonnées), j'utiliserais plus naturellement les outils des "mathématiques modernes" et je vais aller sur du calcul vectoriel et les outils de calcul matriciel comme proposé par (gile). C'est pourquoi j'avais félicité crashray sur la clarté de son message en disant qu'un énoncé bien posé c'est 80% du travail, le choix de la méthode de résolution est propre à chacun et c'est les 20% restant ;) . @crashray Pour la correction à comparer avec ce à quoi tu étais arrivé: (defun rayon3points (pt1 pt2 pt3 / a b c p S) ;; calcul des cotés a b c d'un triangle formé par 3 pts (setq a (distance pt1 pt2) b (distance pt2 pt3) c (distance pt3 pt1)) ;; calcul de la surface d'un triangle quelconque en fonction des cotés (formule de Héron) (setq p (/ (+ a b c) 2) S (sqrt (* p (- p a) (- p B) (- p c)))) ;; calcul du rayon du cercle par la relation R= (a b c)/ 4S (/ (* a b c) (* 4 S)) ) Pour tester: _$ (rayon3points (getpoint) (getpoint) (getpoint)) 473.719 En général en lisp on aime bien avoir dans un programme les fonctions d'entrée (saisie utilisateurs), les fonctions de traitements de donnée (calculs), les fonctions de sortie (restitution des résultats) dans des fonctions spécifiques. Le tout appelé et articulé dans une fonction principal en C:MaCommande exécuté sur la ligne de commande. Cela permet de pouvoir tester et déboguer les différentes fonctions (ou partie de programme) séparément, au fil du temps cela te permettra de te créer une bibliothèque de fonctions réutilisable et éprouvé (comme la librairie gc_MathGeom.lsp de gile) adapté à ton domaine d'activité, ce qui te permettra d'être beaucoup plus efficace dans tes développements futur un peu comme tu le ferais avec une bibliothèque de blocs sous AutoCAD. A+ Bruno -
Premier LISP : Rayon de l'arc reliant trois points
VDH-Bruno a répondu à un(e) sujet de crashray dans Débuter en LISP
Re, Petite précision, pour une mise en œuvre numérique de la solution précédente il est préférable d'utilisé la formule de Kahan donné plus bas dans la page, voir l'article de Wikipédia... Je me souviens maintenant pourquoi j'ai toujours préféré d'Al-Kashi à Héron et la loi des sinus sur ce genre d'exercices, ce qui permet d'avoir directement le résultat par la relation suivante: R= a / 2 sin alpha, ou l'angle alpha est formé par le sommet opposé au coté a ce qui donne: (defun rayon3points (pt1 pt2 pt3) (/ (distance pt2 pt3) (* 2 (sin (abs (- (angle pt1 pt2) (angle pt1 pt3) ) ) ) ) ) ) Ci-dessous le lien si tu es éventuellement intéressé par la démonstration: Loi des sinus -
Premier LISP : Rayon de l'arc reliant trois points
VDH-Bruno a répondu à un(e) sujet de crashray dans Débuter en LISP
Bonjour crashray Félicitation pour la qualité de ton post, poser les objectifs et les problématiques clairement, c’est 80% de la résolution du problème en programmation. Depuis hier je me fait violence (visiblement j’ai échoué :P ) pour ne pas parasiter ce post, car pour ce qui me concerne il n’y a pas meilleur pédagogue que (gile) sur ce forum pour t’aider dans l’apprentissage du lisp. Mais à titre d’exercice quand tu en auras fini avec le cheminement proposé précédemment et s’il suffit juste d’obtenir le rayon d’un cercle passant par 3 points, sans se préoccuper de son origine. Il est alors possible de passer par le rapport des Aires entre un triangle quelconque et un cercle circonscrit. Pour rappel si tu as 3 points tu connais : Les trois cotés a b c du triangles A B C Donc sa surface (S) avec les formules de Héron d’Alexandrie. Et donc le rayon R du cercle avec la relation suivante R= (a b c)/ 4S (defun rayon3points (pt1 pt2 pt3 / a b c p S) ;; calcul des cotés a b c d'un triangle formé par 3 pts ;; calcul de la surface d'un triangle quelconque en fonction des cotés (formule de Héron) ;; calcul du rayon du cercle par la relation R= (a b c)/ 4S ) Bon courage et bonne continuation dans ton apprentissage du lisp Bruno (Ps : Cette variante est plus directe car elle n’utilise que des opérateurs arithmétiques, mais moins formateur car elle n’introduit pas les éléments de langage supplémentaire que sont inters, polar, angle qui te seront essentiel pour la suite de ton apprentissage…) -
Compteur copie dans la ligne de commande
VDH-Bruno a répondu à un(e) sujet de Nicky dans LISP et Visual LISP
Oui tout a fait, après on peut toujours faire plus sophistiqué mais ce n'était pas le sujet. Salutations VDH-Bruno -
Rapidement les idées qui me viennent à l'esprit: Pour la production des polylignes la commande Autocad: contour Les surfaces TotalArea de (gile) Produire un tableau, l'extraction d'attribut d'Autocad Cdt VDH-Bruno
-
Compteur copie dans la ligne de commande
VDH-Bruno a répondu à un(e) sujet de Nicky dans LISP et Visual LISP
Bonjour, La ligne de code suivante devrait résoudre ton soucis (setvar 'CMDECHO 0) Sur le fond, il faudra accepter de ralentir le traitement pour voir cela s'afficher à l'écran.... Est-ce vraiment une bonne chose ??? (En programmation l'implémentation d'une barre de progression, ou faire défiler un compteur est à réserver aux programmes qui "mouline" pour montrer à l'utilisateur que le traitement est en cour, et qu'il ne soit pas tenté d'appuyer sur "Echap" avant que le programme ne soit arrivé à son terme.) Sur la forme voici les quelques lignes de codes commentés pour l'exemple et à adapter, pour faire ce que tu demandes: (defun c:test (/ nombreCN n del) ;; écriture des variable en "dur" pour l'exemple (setq nombreCN 91 n 1 ) ;; écriture de la partie constante de texte sur la ligne de commande (princ "\nCréation de la polyligne: ") (repeat nombreCN ;; écriture à la suite de la partie variable de texte sur la ligne de commande (setq del (princ (strcat (itoa n) " sur " (itoa nombreCN) "... "))) ;; pause pour voir la modification du texte sur la ligne de commande (repeat 100000) ;; suppression de la partie variable de texte sur la ligne de commande (repeat (strlen del) (princ (chr 8)) ) (princ) (setq n (1+ n)) ) (princ) ) En complément dans le même esprit, si tu as les Express d'installé tu peux faire une recherche sur les fonction: acet-ui-progress-done acet-ui-progress-init acet-ui-progress-safe Tu trouvera également sur le lien qui suit un exemple intéressant de Patrick_35 sur l'emploi de ces fonctions https://cadxp.com/topic/31891-barre-de-progression/ A+ VDH-Bruno -
Grand bravo pour l'adaptation :) Re grand bravo :) Le lisp peut être une idée à creuser pour la suite avenir ;) A+ Bruno
-
Si tu charges et exécutes nLw_Dim tu as une sélection plus large et tu peux traiter plusieurs polylignes en une commande, avec Lw_Dim la première version postée par Patrice tu sélectionnes et traites une unique polyligne
-
Re, Pour modifier ta seconde version c'est le même caneva.. Si tu as un soucis tu peux me MP, je te le referais l'adaptation lorsque j'aurais un petit trou dans mon emploie du temps chargé du moment A+
-
Bonjour Patrice Rapidement ceci devrait convenir: ;; 01/09/2020 variante de la Routine LW_DIM par GC ;; pour coter "plusieures" polyligne "legere" en mode ALIGNE ;; Avec le style de Cotation COURANT (defun c:nLw_Dim (/ js Lw_Dim ssmap AcDoc Space) ;; Fonctions auxiliaire (defun ssmap (fun ss / n) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (apply fun (list (ssname ss (setq n (1- n))))) ) ) ) (defun Lw_Dim (ent / dxf_ent lst_pt) (setq dxf_ent (entget ent) lst_pt (mapcar '(lambda (x) (trans x ent 0)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent) ) ) ) (if (= 1 (logand 1 (cdr (assoc 70 dxf_ent)))) (setq lst_pt (reverse (cons (car lst_pt) (reverse lst_pt)))) ) (if (equal (car lst_pt) (last lst_pt) 1e-9) (vla-addDimAngular Space (vlax-3d-point (car lst_pt)) (vlax-3d-point (cadr (reverse lst_pt))) (vlax-3d-point (cadr lst_pt)) (vlax-3d-point (polar (car lst_pt) (angle (car lst_pt) (mapcar '* (mapcar '+ (cadr (reverse lst_pt)) (cadr lst_pt)) '(0.5 0.5 0.5) ) ) (* 10 (getvar "DIMTXT")) ) ) ) ) (while (cdr lst_pt) (vla-addDimAligned Space (vlax-3d-point (car lst_pt)) (vlax-3d-point (cadr lst_pt)) (vlax-3d-point (polar (mapcar '* (mapcar '+ (car lst_pt) (cadr lst_pt)) '(0.5 0.5 0.5) ) (+ (angle (car lst_pt) (cadr lst_pt)) (* pi 0.5)) (* 10 (getvar "DIMTXT")) ) ) ) (setq lst_pt (cdr lst_pt)) ) ) ;; Programme principal (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (princ "\nSelectionner les Polylignes 2D (LWPline) a coter ... " ) (if (setq js (ssget '((0 . "LWPOLYLINE")))) (ssmap 'Lw_Dim js) ) (prin1) ) A+ VDH-Bruno
-
Bonjour (gile) Hé oui vl-filename-base ;) , comme quoi le LISP contrairement au vélo quant on pratique plus on oublie (même les fonctions les plus élémentaire...) Parfois c'est dur de s'apercevoir que l'on est passé à coté d'une évidence Salutations Bruno
-
Bonjour, Pour bien débuter avec mapcar je t’invite à lire ou à relire ce post : https://cadxp.com/topic/28642-arguments-et-variables/page__view__findpost__p__156098 Tu y trouveras une excellente et intelligible explication de (gile). Au sujet des extensions de nom de fichier, historiquement dans les premières versions de Windows elles étaient limité à 3 caractères car elles reprenaient le standard utilisé sous IBM CMS qui limitait les noms de fichiers à 8 caractères et 3 caractères pour l’extension (on parlait de "système 8+3"). Depuis les choses ont bien évoluer, suffit de penser aux fichiers .jpeg .docx .html .xlsx etc.… La suggestion de ne pas te limité à 3 caractères formulé par Luna est selon moi une bien meilleure approche. Cdt Bruno
-
Bonjour, Peut être parce que tu cherche à remplacer les variables dans le corps de la fonction, plutôt que de les passer en argumentS à l'appel de cette dernière. Pour tester: (changerPrefixeCalques "AAA" "DDD") Cdt - EDIT: Désolé pour le doublon Luna a été plus rapide dans sa réponse -
-
Bonjour, Quelque chose comme ça, peut être? (command "_BASE" pause "_UCS" "@" "") A+
-
Bonjour Zebulon, J'ai parcouru le fil de cette discutions en diagonale, bien que je ne programme plus, je pense que c'est la voie la plus directe pour identifier tes réseaux, de mémoire j'avais exploré cette voie pour retrouver les miens, en créant un nom d'application spécifique attaché à mon entité à la création, pour ajouter ce code -3 à mon filtre pour les sélectionner directement par la suite au moyen de la fonction ssget. A titre d'exemple sur ce forum, dans le code lisp pagine, c'est cette façon de faire qui a été utilisé dans le filtre de sélection ssget (discussion ou tu étais participant) https://cadxp.com/topic/38099-pagination-automatique/page__view__findpost__p__210208 Ci cela peut t'inspirer, bonne continuation à toi dans l'amélioration de tes routines de ferraillage ;) Amicalement Bruno
