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
-
Faire une sélection d'un bloc en fonction de deux de ses attributs
VDH-Bruno a répondu à un(e) sujet de asptt9 dans LISP et Visual LISP
Bonjour , Bon en repartant d’un code similaire de (gile) publié sur le forum, qui prend 2 minutes à adapter, je m’y colle par contre, je réponds plus à ton post publié ici: http://cadxp.com/index.php?/topic/37570-zoom-sur-un-jeu-de-selection/page__p__206824#entry206824 En te proposant de tester une fonction équivalente au zoom objet, même si je ne comprends pas pourquoi il ne fonctionne pas chez toi.. A tester ;; Zsel - VDH-Bruno ;; D'aprés le code zbbox (gile) publié sur CadXP à l'adresse suivante: ;; http://cadxp.com/index.php?/topic/14427-les-lisp-de-gile/page__view__findpost__p__74705 ;; ;; Effectue un zoom fenêtre dans la fenêtre courante, sur l'emprise des objets ;; grippées à l'écran. ;; Code lisp équivalent à la commande zoom objet d'AutoCAD (defun c:zsel (/ ss lst minpt maxpt) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (if (setq ss (ssget "_I")) (progn (vla-StartUndoMark *acdoc*) (vlax-for o (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (vla-getBoundingBox o 'minpt 'maxpt) (setq lst (cons (vlax-safearray->list minpt) (cons (vlax-safearray->list maxpt) lst))) ) (vla-ZoomWindow *acad* (vlax-3d-point (apply 'mapcar (cons 'min lst))) (vlax-3d-point (apply 'mapcar (cons 'max lst))) ) (vla-EndUndoMark *acdoc*) ) ) (princ) ) A+ -
Re, Visible bonuscad a été le plus rapide, bravo à lui. Dans ce cas pour apporter quelque chose au post, je vais essayer de compléter cette histoire de sous classes, avec ce que j’en ai compris par expérimentation. Comme l'a précisé bonuscad depuis leurs apparitions ces définitions sont nécessaires pour les entités qui leurs sont contemporaines cas des polylignes optimisées apparue depuis la version R14. Par contre pour les entités antérieures à l’apparition des sous-classes ces définitions sont facultatives dans les définitions d’entmake (certainement pour des soucis de compatibilité entre application lisp), c’est le cas des entités historique que sont les cercles, arc, lignes ect.. Ceci explique à mon avis qu’une ligne peut être définie comme ceci avec entmake sans marqueur de sous-classe contrairement à la polyligne: (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)) A+
-
Bonjour, Avec des marqueurs de sous classes, cela devrait mieux se passer… (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(8 . "005_kpanel") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) (cons 10 v1) (cons 10 v2) (cons 10 v3) (cons 10 v4) );_list );_entmake
-
C'est bien naturel, d'ailleurs c’est déjà en cours d’annotation (trois fois rien) plus du chipotage qu’autre chose, et pas sûr que tout soit opportun dans le cadre d’une introduction au Lisp, je te retourne cela une fois terminé. A+
-
Bonsoir, Merci à Gilles pour sa générosité et Patrick pour la diffusion de l’information, je vais regarder cela avec un grand intérêt et aussi avec beaucoup de plaisir :)
-
Defiler les hyperliens et le contenu
VDH-Bruno a répondu à un(e) sujet de lecrabe dans Routines LISP
Bonjour, Pour faire suite, à cette discussion http://cadxp.com/index.php?/topic/37532-hyperlien/ dans la quel je viens de découvrir l’existence des fonctions lisp geturl & seturl, la version mise à jour de ma proposition précédente. (defun c:AuditLinks (/ ss i n l txt file) ;; Selection avant/après -> "grippé (sssetfirst nil (setq ss (cond ((ssget "_I" '((-3 ("PE_URL"))))) (T (prompt "\nSélectionnez les objets graphiques ayant des hyperliens à lister...") (ssget '((-3 ("PE_URL")))) ) ) ) ) ;; Boucle sur la selection (repeat (setq i (if ss (sslength ss) 0)) (setq l (cons (cons (itoa i) (geturl (ssname ss (setq i (1- i))))) l)) ) ;; Affichage du traitement sur l'ecran texte AutoCAD (textscr) (princ (setq txt "" txt (strcat "\n\nIl y a " (itoa (length l)) " entités dans la selection ayant un Hyperlien..." "\n" (foreach x l (setq txt (strcat txt "\n" (car x) "\t" (cdr x)))) ) ) ) ;; Enregistrement des résultats dans un fichier texte (initget "Oui Non") (if (= (getkword "\nEnregistrer dans un fichier ? [Oui/Non] <Non>: ") "Oui") (and (setq file (getfiled "Créez ou sélectionnez un fichier" "" "txt" 33)) (setq file (open file "a")) (princ txt file) (close file) ) ) (graphscr) (princ) ) Sinon pour ce qui est de ma participation sur ce forum, je crois qu’il faudra me supporter encore un petit peu, les projets de développement d’un logiciel métier à l’échelle du groupe semblant sérieusement ajourné pour cause de crise mondial. Le côté positif de l’histoire c’est que cela m’avait donné suffisamment d’énergie pour commencer à m’intéresser à autre chose qu’au lisp… A+ -
Tiens donc je viens d’apprendre un truc là, geturl & seturl ces fonctions sont non documenté sous 2007 mais très bien supporté, merci beaucoup Maxence.
-
Bienvenu au petit Lucien, toutes mes félicitations aux heureux parents. Profite bien de tous les instants, une fois parents le temps file plus vite…
-
Toujours enregister un fichier dans la version d'origine
VDH-Bruno a répondu à un(e) sujet de sechanbask dans LISP et Visual LISP
Bonjour, Oui !!! Pour récupérer le numéro de version du dessin, je m’inspirerais de cette discussion et du code donné par (gile) http://cadxp.com/index.php?/topic/26817-variable-version-dwg/ Résultat à comparer avec ton numéro de version porté par la variable ACADVER Puis au moyen de la commande nondef (_undefine), je redéfinirai la commande SAUVERAP (_qsave), par la version de la commande SAUVENOM (_saveas) executé en ligne de commande (filedia 0) avec les options qui vont bien. Pour redéfinir ta commande au démarrage tu peux t’inspirer de ma réponse n°14 dans ce sujet, http://cadxp.com/index.php?/topic/34679-touche-suppr-clavier/page__view__findpost__p__188189 ou du sujet original de (gile) dans lequel j’avais puisé (plagié) mon inspiration du moment.. http://cadxp.com/index.php?/topic/23751-defun-q-sstartup/ Cordialement, -
Avec un espace après le b cela passe.. (apply '(lambda (a b c) (/ (sqrt (* (+ a b c) (- c (- a b )) (+ c (- a b )) (+ a (- b c)) ) ) 4.0)) A+
-
L’important était de voir que l’on pouvait formaliser ton énoncé du problème de la façon suivant : Soit un triangle A, B, et C. Exprimez la hauteur h issue de C connaissant les coordonnées de ses sommets. Maintenant sachant cela, on peut facilement allonger la liste des remerciements avec par exemple Héron d'Alexandrie en passant par le calcul de l’aire d’un triangle en fonction de ses 3 cotés. La formule de Héron nous donne : A = racine carré de (p (p – a)(p – b )(p – c)) avec le demi-périmètre p = (a+b+c)/2 Et sachant que l’aire d’un triangle A = (Hauteur x Largeur) / 2 On en déduit la fonction Lisp suivante (un poil plus rapide que la précédente) : ;; Hauteur issue de C dans le triangle ABC (defun HauteurC (A B C) ((lambda (a b c / p) (setq p (/ (+ a b c) 2)) ; demi perimetre (/ (* 2 (sqrt (* p (- p a) (- p b ) (- p c)))) c) ) (distance B C) (distance C A) (distance A B) ) ) A+
-
Bonjour, Dans le cas d’une sélection sur un point d’insertion d’une référence de bloc, je ne pense pas que la sélection par "Capture" soit la plus judicieuse, pour cela il suffit de penser aux blocs qui sont définit très loin de leur point d’insertion ou aux blocs circulaire dont l’origine et souvent le centre du cercle. Donc pour rebondir sur la proposition de filtre sur le code 10, et compléter les propos de BonusCAD sur l’emploie du quote et des erreurs d’arrondie. On peut également par sécurité introduire des tests relationnels dans les filtres de sélections, par exemple si on a calculé un point de sélection pins. Pour avoir ses coordonnées par excès et par défaut à 1e-8 prés, on peut faire : (setq pinSup (mapcar '(lambda (x) (+ x 1e-8)) pins) ; coordonnées par excès pinInf (mapcar '(lambda (x) (- x 1e-8)) pins) ; coordonnées par défaut ) Puis il ne reste plus qu’à sélectionner les références du bloc annotation dont le point d’insertion est compris entre ces 2 intervalles de coordonnées: (setq nom (ssget "_X" (list '(0 . "INSERT") '(2 . "annotation") '(-4 . ">,>,>") (cons 10 pinInf) '(-4 . "<,<,<") (cons 10 pinSup)))) A+
-
Re, Pendant ma pause déjeuné, je me suis amusé à générer un fichier à 246225 entités en décomposant des hachures, en réglant la variable GRIPOBJLIMIT à 0 et tester avec un (sssetfirst nil (ssget "_X")) cela fonctionne, mais c’est également très très long à toi de voir ce qui te va le mieux, je n’ai pas l’expérience suffisante des fichiers aussi lourd dans mon domaine d’activité.. A+
-
Oui Patrick_35 a naturellement raison (comme bien souvent en matière de bloc), c’est effectivement plus juste, merci. Merci de ton retour, 2 000 fichiers ça ne m’étonne pas, il faut au moins ça pour pouvoir en dégainer un pour chaque situation comme tu le fait.. Tu fais tout de même preuve d’une bonnes organisations bravo !!! A+
-
GRIPOBJLIMIT à voir en jouant avec cette variable...
-
A ce sujet j’aurais une question plus personnel pour lecrabe, car j’ai à plusieurs reprise noté l’efficacité avec laquelle tu ressortais les diverses routines postés sur ce forum de ton disque dur, alors qu’à titre personnel réécrire une fonction est parfois plus rapide pour moi que de la retrouver dans les méandres de mes fichiers, as-tu un secret ou un type de classement particulier, car je pense que un ou deux conseil en la matière me serait des plus profitable. D’avance merci, A+ Bruno
-
En repartant du code précédent la micro-modif suivante devrait solutionner le problème du point d'insertion.. (defun c:KPNT_BLOCK (/ b o) (vl-load-com) (vlax-for b (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (or (= (vla-get-IsLayout B) :vlax-true) (= (vla-get-IsXref B) :vlax-true) (vlax-for o b (and (eq (vla-get-ObjectName o) "AcDbPoint") (not (equal '(0 0 0) (vlax-get o 'Coordinates) 1e-8)) (vla-delete o) ) ) ) ) (command "regen") (princ) ) Cordialement
-
Re, Je n’ai certainement pas tout compris à ta problématique, et je risque surement de répondre à côté. Mais si il s’agit de visualiser des groupes d’objet un zoom étendu, suivie d’un (sssetfirst nil (ssget "_X")) ne serait pas plus simple. Les entités étant « grippé » (grip dont la taille est définit en pixels), on arrive à localiser même un point dans un coin de l’écran. Quitte à jouer avec la valeur des variables suivantes si nécessaire, pour plus d’efficacité visuelle. GRIPCOLOR -> Gère la couleur des poignées non sélectionnées. Les valeurs admises sont comprises entre 1 et 255. GRIPSIZE -> Définit la taille en pixels du carré représentant la poignée. Bon courage A+
-
Bonjour alala, Pour info, je me sers de la vue aérienne (VUEAER), je l’ai toujours trouvé pratique et assez efficace avec son mode dynamique pour ce type de problème, perso elle me règle 95% de mes besoins dans le genre. A+
-
Par composition de fonction prédifinie (mapcar 'cdr (vl-remove-if-not '(lambda(x)(eq (car x) 5)) (dictsearch dict "Ma_Roue_01"))) Sinon en définissant une fonction spécifique (defun lstHandent (lst) (cond ((null lst) nil) ((eq (caar lst) 5) (cons (cdar lst) (lstHandent (cdr lst)))) ((lstHandent (cdr lst))))) A+
-
Ok je comprends mieux.. Merci, pour la petite histoire c’est que tout récemment que je viens de redécouvrir (voir même découvrir dans certain cas) la résolution des trigones et tous les bénéfices que l’on peut en tirer. A+
-
Salut, Un segment de droite, et un point forme un plan, sert toi de la géométrie plane notamment de la résolution des trigones, si tu n’es pas à l’aise avec le calcul vectoriel. Avec le théorème d'Al-Kashi qui donne : b² = a² + c² - 2ac cos (alpha) Et sachant que : 1 = cos (alpha)² + sin (alpha)² On peut en déduire la fonction Lisp suivante : ;;Retourne la distance du point C par rapport a la droite A B (defun distper3d (A B C) ((lambda (a b c) (* b (sqrt (- 1 (expt (/ (- (+ (* b b ) (* c c)) (* a a)) (* 2 b c)) 2))))) (distance B C) (distance C A) (distance A B) ) ) Ou A, B, C sont respectivement tes points 1, 2, 3 par soucis de correspondance avec les notations mathématiques courantes. Rq:(gile) c’est étrange nos expressions ne donnent pas les mêmes résultats dans l’espace, j’ai testé graphiquement la mienne semble correcte… Ou alors j'ai loupé un truc.. A+
-
Prolonger une polyligne à 45° sur une autre
VDH-Bruno a répondu à un(e) sujet de ASTERIXII dans Débuter en LISP
Voilà ça devrait être réparé.. (pas testé en profondeur) (defun c:ProCham45 (/ sel1 sel2 *error* dxfpline marque) (defun *error* (msg) (ai_sysvar nil) (if msg (princ (strcat "\n*Abandon* " msg)) ) (princ) ) (or *ecart* (setq *ecart* (getvar 'CHAMFERA))) (setq *ecart* (cond ((getdist (strcat "\nSpécifiez l'écart à conserver entre les objets <" (rtos *ecart*) ">: "))) (*ecart*) ) ) (ai_sysvar (list '("CMDECHO" . 0) '("TRIMMODE" . 0) '("CHAMMODE" . 0) (cons "CHAMFERA" *ecart*) (cons "CHAMFERB" *ecart*) ) ) (if (setq sel1 (entsel "\nSélectionnez l'objet à prolonger: ")) (if (setq sel2 (entsel "\nSélectionnez le second objet: ")) ;; si le second objet est une pline => svg pline (progn (if (= "LWPOLYLINE" (cdr (assoc 0 (setq dxfpline (entget (car sel2)))))) (progn (setq marque (entlast)) (vl-cmdf "_explode" sel2 "") (setq sel2 (nentselp (osnap (cadr sel2) "_near"))) ) ) (vl-cmdf "_chamfer" sel1 sel2) (ai_sysvar '(("TRIMMODE" . 1) ("FILLETRAD" . 0))) (command "_fillet" sel1 "" (entlast)) ;; si marque => restore pline (if marque (progn ((if (= "LWPOLYLINE" (cdr (assoc 0 (entget (car sel1))))) list entdel ) (while (setq marque (entnext marque)) (entdel marque)) ) (entmake dxfpline) ) ) ) ) ) (*error* nil) ) Nota: La fonction reposant essentiellement sur les commandes natives d’AutoCAD (Chanfrein & Raccord), elle est limité au bon fonctionnement de ces dernières.. A+ -
Prolonger une polyligne à 45° sur une autre
VDH-Bruno a répondu à un(e) sujet de ASTERIXII dans Débuter en LISP
Re, A tester, c’est du dépannage, j’ai pas trop le temps en ce moment pour faire plus, cela devrait fonctionner sur des plines… (defun c:ProCham45 (/ sel1 sel2 *error* svgpline marque) (defun *error* (msg) (ai_sysvar nil) (if msg (princ (strcat "\n*Abandon* " msg)) ) (princ) ) (or *ecart* (setq *ecart* (getvar 'CHAMFERA))) (setq *ecart* (cond ((getdist (strcat "\nSpécifiez l'écart à conserver entre les objets <" (rtos *ecart*) ">: "))) (*ecart*) ) ) (ai_sysvar (list '("CMDECHO" . 0) ; 0 Désactive l'affichage à l'écran. '("TRIMMODE" . 0) ; 0 Laisse intactes les arêtes sélectionnées '("CHAMMODE" . 0) ; 0 Deux distances de chanfrein sont nécessaires (cons "CHAMFERA" *ecart*) ; Définit le premier écart de chanfrein lorsque CHAMMODE est définie sur 0. (cons "CHAMFERB" *ecart*) ; Définit le second écart de chanfrein lorsque CHAMMODE est définie sur 0. ) ) (if (setq sel1 (entsel "\nSélectionnez l'objet à prolonger: ")) (if (setq sel2 (entsel "\nSélectionnez le second objet: ")) ;; si le second objet est une pline => decompo (progn (if (= "LWPOLYLINE" (cdr (assoc 0 (entget (car sel2))))) (progn (setq marque (entlast)) (vl-cmdf "_explode" sel2 "") (setq sel2 (nentselp (osnap (cadr sel2) "_near"))) ) ) (vl-cmdf "_chamfer" sel1 sel2) (ai_sysvar '(("TRIMMODE" . 1) ("FILLETRAD" . 0))) (command "_fillet" sel1 "" (entlast) "") ;; si marque recompo => pline (if marque (progn (vl-cmdf "_pedit" (setq marque (entnext marque)) "O" "Joindre") (while (setq marque (entnext marque)) (vl-cmdf marque)) (vl-cmdf "" "") ) ) ) ) ) (*error* nil) ) A+ -
Prolonger une polyligne à 45° sur une autre
VDH-Bruno a répondu à un(e) sujet de ASTERIXII dans Débuter en LISP
Salut, Un principe de base avec les commandes natives d’Autocad (chamfrein et prolonger), donc l’ordre et la position des points de sélection ont leurs importantances. (defun c:ProCham45 (/ sel1 *error*) (defun *error* (msg) (ai_sysvar nil) (if msg (princ (strcat "\n*Abandon* " msg)) ) (princ) ) (or *ecart* (setq *ecart* (getvar 'CHAMFERA))) (setq *ecart* (cond ((getdist (strcat "\nSpécifiez l'écart à conserver entre les objets <" (rtos *ecart*) ">: "))) (*ecart*) ) ) (ai_sysvar (list '("CMDECHO" . 0) ; 0 Désactive l'affichage à l'écran. '("TRIMMODE" . 0) ; 0 Laisse intactes les arêtes sélectionnées '("CHAMMODE" . 0) ; 0 Deux distances de chanfrein sont nécessaires (cons "CHAMFERA" *ecart*) ; Définit le premier écart de chanfrein lorsque CHAMMODE est définie sur 0. (cons "CHAMFERB" *ecart*) ; Définit le second écart de chanfrein lorsque CHAMMODE est définie sur 0. ) ) (command "_chamfer" (setq sel1 (entsel "\nSélectionnez l'objet à prolonger: ")) (entsel "\nSélectionnez le second objet: ") ) (command "_extend" (entlast) "" sel1 "") (*error* nil) ) Nota: C'est dans le même esprit que ce qui était suggéré par Patrick_35 A+ - EDIT – En testant le code sur ma version 2007, je viens de découvrir avec amusement que la commande _chamfer avait un comportement différent sur des ligne et des pline (mode non-ajuster), en résumer le code fonctionne avec des lignes, mais pas avec des polylignes, sur des versions plus récente ça donne quoi ?
