Aller au contenu

Olivier Eckmann

Membres
  • Compteur de contenus

    2 348
  • Inscription

  • Dernière visite

  • Jours gagnés

    118

Tout ce qui a été posté par Olivier Eckmann

  1. Ca ne coutera que 2 kgs de carotte pour mon cheval 😉
  2. Remplace (setq sLayerP3D "Ptrav_ENROCHEMENTS SECS_3D") par (setq sLayerP3D "*")
  3. Bonjour, Pour la position gauche/droit/centrée, c'est dans le paramétrage du DMU. Selon le paramétrage, une largeur positive ou négative dessinera d'un côté ou de l'autre. Pour les blocs à intervalle régulier et de taille variable pour s'adapter à un paramètre, ça n'existe pas. Par contre une fois le DMU décomposé, on peut transformer les lignes en polyligne : isoler le calque, puis PEDIT MULTIPLE et sélectionner toutes les lignes, ou MAPCLEAN si vous avez AutoCAD Map 3D. S'il faut des blocs, ça passera forcément par de la programmation.
  4. De quel sujet parles-tu? Tu as ouvert cette discussion avec ta réponse en python sans poser de questions. Il y a cette astuce également que je ne connaissais pas https://www.autodesk.com/fr/support/technical/article/caas/sfdcarticles/sfdcarticles/FRA/Reset-tools-order-for-tool-palette-in-AutoCAD.html mais qui nécessite l'intervention de l'utilisateur. Ce problème n'est pas nouveau et date depuis que les palettes existent : https://www.cadtutor.net/forum/topic/47128-tool-palette-issue/ Il me semble que l'on a déjà parlé sur CadXP, mais je ne retrouve pas la discussion.
  5. Au 1er chargement d'un ATC dans AutoCAD, l'ordre est celui dans la palette original. Puis AutoCAD crée un fichier spécifique qui contient l'ID de chaque bouton pour conserver localement l'ordre que l'on souhaite au cas où on déplace des boutons. Si on met à jour l'ATC, c'est ordre est conservé par défaut et donc si on réorganise l'ATC ce nouvel ordre n'est pas conservé. C'est pourquoi lorsque l'on réordonne ou bien que l'on ajoute des boutons, il suffit de faire un Ctrl+A, Ctrl+C, puis Suppr, Ctrl+V. Ainsi chaque nouvelle commande possède un nouvel ID, et donc lorsque l'on repartage son ATC, la personnalisation locale ne retrouvant pas ses ID, AutoCAD supprime cette personnalisation et en recrée une nouvelle en respectant l'ordre initial de l'ATC. Cela plus de 12 ans que je partage un vingtaines de palettes ATC sur 45 PC, qui sont mises à jour tous les matins à l'ouverture de session depuis mon serveur, et ça a toujours fonctionné. Chaque nouvelle palette est reconstruite comme cela et chaque PC reçoit la nouvelle version de la palette avec l'ordre que j'ai décidé. Olivier
  6. Pas tout compris, c'est quoi le problème initial? Qu'est ce que ça veut dire : stabiliser une palette? Olivier
  7. Bonjour @Didj05, Voilà un code qui devrait faire l'affaire en récupérant à droite et à gauche des codes dont je me suis inspiré ; inspiré du code de DIDIER disponible : https://www.da-code.fr/polyligne-3d/ (defun lsVtxPoly3D (oPoly / n oPolyDxf lsPts) (if (= (cdr (assoc 0 (setq oPolyDxf (entget oPoly)))) "POLYLINE") (progn (setq oPoly (entnext oPoly)) (while (/= (cdr (assoc 0 (setq oPolyDxf (entget oPoly)))) "SEQEND") (setq lsPts (append lsPts (list (cdr (assoc 10 oPolyDxf))))) (setq oPoly (entnext oPoly)) ); fin du WHILE );progn (alert "le choix n'est pas une POLY 3D") );if poly3d lsPts ); fin de DEFUN ; inspiré du code de LeeMac : https://www.cadtutor.net/forum/topic/18257-entmake-functions/ (defun MakeLWPoly (lst cls dElev vDir / p) (entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 cls) (cons 38 dElev) ) (mapcar (function (lambda (p) (cons 10 p))) lst) (list (cons 210 vDir)) ) ) ) ; Transforme un point 3D en point à Z=0 (defun Point2D (PT) (list (car PT) (cadr PT) 0.) ) ; reconstruit des polylignes 2D dans un plan vertical à partir de polyligne 3D supposée être dans ce plan vertical (defun C:ProfilP3DtoP2D ( / ssP3D sLayerP3D vAUNITS vANGBASE vANGDIR I oP3D lsPts dAng PT PT1 PT2 PT2D PT1_2D PT2_2D dDist dDistMax vDir lsPts2D) (setq sLayerP3D "Ptrav_ENROCHEMENTS SECS_3D") (if (setq ssP3D (ssget (list (cons 0 "POLYLINE") (cons 8 sLayerP3D) (cons -4 "&") (cons 70 8)))) (progn (setq vAUNITS (getvar "AUNITS")) (setq vANGBASE (getvar "ANGBASE")) (setq vANGDIR (getvar "ANGDIR")) (setvar "AUNITS" 3) (setvar "ANGDIR" 0.) (setvar "ANGBASE" 0.) (setq I 0) (repeat (sslength ssP3D) (setq oP3D (ssname ssP3D I)) (setq I (1+ I)) (setq lsPts (lsVtxPoly3D oP3D)) ; recherche les 2 points les plus éloignés en 2D (setq PT1 (car lsPts)) (setq PT1_2D (Point2D PT1)) (setq iVtx 0) (setq dDistMax 0.) (while (< (setq iVtx (1+ iVtx)) (length lsPts)) (setq PT (nth iVtx lsPts)) (setq PT2D (Point2D PT)) (if (> (setq dDist (distance PT1_2D PT2D)) dDistMax) (setq PT2_2D PT2D dDistMax dDist) ) ) ; calcule l'angle entre ces 2 points (setq dAng (angle PT1_2D PT2_2D)) ; construit le SCU orienté, puis vertical (command "_UCS" "_W") (command "_UCS" "_Z" dAng) (command "_UCS" "_X" (* PI 0.5)) (setq vDir (getvar "UCSXDIR")) (setq vDir (list (cadr vDir) (* -1. (car vDir)) 0.)) ; convertit le liste des sommets 3D en sommet 2D dans le SCU vertical (setq lsPts2D nil) (foreach PT lsPts (setq lsPts2D (append lsPts2D (list (Point2D (trans PT 0 1))))) ) ; Contruit la poly2D vertical (MakeLWPoly lsPts2D (logand (cdr (assoc 70 (entget oP3D))) 1) (caddr (trans (car lsPts) 0 1)) vDir) ) (setvar "ANGDIR" vANGDIR) (setvar "ANGBASE" vANGBASE) (setvar "AUNITS" vAUNITS) (command "_UCS" "_W") ) ) ) Ce code présuppose un certain nombre d'hypothèse : - les polylignes 3D sont définies dans un plan vertical - les polylignes 3D ont une longueur 2D projetée non nulle - dessine les poly2D dans le calque courant. A tester, car aucun contrôle dans ce code, tout est supposé être bien dessiné. Ce n'est pas forcément très rapide, puisque ça passe par les commandes de création de SCU pour chaque polyligne, mais ça traduit la méthode manuelle de construction/dessin. Olivier ProfilP3DtoP2D.lsp
  8. Désolé, j'avais lu les réponses en diagonale. C'est effectivement la même réponse.
  9. Comment obtenez-vous les poly3D? Si vous utilisez le projet linéaire de Covadis, dans l'écran de calcul du projet, cliqué sur le bouton Options en bas à gauche et sélectionner "Dupliquer avec des objets AutoCAD". Ainsi chaque couche du DTY est redessinée sous forme de polyligne 2D que l'on peut lisser en sélectionnant dans l'ordre pour obtenir un solide 3D.
  10. Bonjour, Pas sûr d'avoir tout compris. Dans le DWG il y a un calque nommé : "poly2D tracée manuellement - objectif faire automatiquement", qui est vide sans aucune polyligne. Par contre il y a un calque nommé : "PROJET_enrochement_construction" qui contient des poly2D. Redessinées à la main? Le but c'est de partir du calque des poly3D "Ptrav_ENROCHEMENTS SECS_3D" pour arriver aux poly2D du calque "PROJET_enrochement_construction" ?
  11. Bonjour, Les polylignes marron ne sont pas des poly3D, mais des poly 2D avec un vecteur d'extrusion correspond à la tangente à ton axe, donc normalement, aucun souci pour faire un balayage. Est-ce que tu a un DWG avec 3 ou 4 profils que l'on puisse faire des tests? Olivier
  12. Bonjour @PATRICE69, Avec les grandes coordonnées, le zoom objet ne sait pas calculer correctement l'emprise. En partant de cette proposition de Gilles dans cette discussion : https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/zoom-object-problem/td-p/5031146, on peut proposer ce lisp qui fonctionne quelque soit le SCU et les coordonnées. ; Code de gilles Chanteau proposé dans cette discussion ; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/zoom-object-problem/td-p/5031146 (defun gc:TMatrixFromTo (from to) (append (mapcar (function (lambda (v o) (append (trans v from to T) (list o)) ) ) '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.)) (trans '(0. 0. 0.) to from) ) '((0. 0. 0. 1.)) ) ) (defun zoomObjects (ss / i obj minPt maxPt ll ur) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (setq wcs2ucs (vlax-tmatrix (gc:TMatrixFromTo 0 1)) ucs2wcs (vlax-tmatrix (gc:TMatrixFromTo 1 0)) ) (repeat (setq i (sslength ss)) (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))) (vla-TransformBy obj ucs2wcs) (vla-GetBoundingBox obj 'minPt 'maxpt ) (vla-TransformBy obj wcs2ucs) (setq ll (cons (vlax-safearray->list minPt) ll) ur (cons (vlax-safearray->list maxPt) ur) ) ) (vla-ZoomWindow (vlax-get-acad-object) (vlax-3d-point (trans (apply 'mapcar (cons 'min ll)) 1 0)) (vlax-3d-point (trans (apply 'mapcar (cons 'max ur)) 1 0)) ) ) (defun C:ZOO () (zoomObjects (ssget)) ) J'ai nommé la commande ZOO car la commande ZO existe déjà dans Covadis mais elle ne permet que de sélectionner un seul objet. Sans Covadis elle peut être renommée à volonté. Olivier
  13. Bonjour @DessProj429, Désolé, il y avait une erreur de traduction de l'option française D pour Deux, que j'ai juste ajouté un underscore, alors que l'option US est _B pour Both . Voilà la bonne syntaxe ^C^C_PEDIT;_M;\\;_J;_J;_B;(getvar "OFFSETDIST");;
  14. C'est normal, car il n'y a pas de fonction native pour faire cela, il faut passer par un développement externe : https://www.cadforum.cz/en/download.asp?fileID=390
  15. Bonjour @drault, Avez-vous réussi avec le vérificateur de norme? Lien vidéo pour sa mise en œuvre : https://youtu.be/oVuniNrLSRg Olivier
  16. Bonjour, rechercher du côté de StripMText https://github.com/Fandoozle/AutoCAD/blob/master/StripMtext v5-0c.lsp ou bien chez LeeMac : https://www.lee-mac.com/unformatstring.html
  17. Bonjour @DessProj429, Sans lisp, on peut faire plus simple avec ce genre de macro associé à un bouton (à lancer juste après le décalage, car utilise la dernière valeur de décalage pour joindre les 2 polylignes) ^C^C_PEDIT;_M;\\;_J;_J;_D;(getvar "OFFSETDIST");; Mais il n'y a pas de contrôle. Ensuite la question est : 0 en lisp, OK, mais avant de parler programmation, est-ce qu'à partir d'un code fourni en texte, vous savez en créer un fichier LSP, le charger dans AutoCAD et lancer la commande? Olivier
  18. Bonjour @Kobi66, Etant donné que le dessin est coté, c'est plus rapide et fiable de reconstruire les polylignes jaune, puis d'utiliser un programme lisp pour écrire les sommets de ces polylignes en fichier TXT comme le propose @didier sur son site : https://www.da-code.fr/poly-05/ Une petite vidéo pour reconstruire par les cotes et coordonnées : https://youtu.be/p2QnWmGMZLs Olivier
  19. Bonsoir @DessProj429, Voilà un bout de code qui devrait faire l'affaire. J'ai mis des commentaires pour clarifier ce que fait chaque ligne du lisp (vl-load-com) (defun C:Bordure ( / oPoly1 oPoly2 lsPts1 lsPts2 oLine AddLine GetListVtx) ; fonction de création d'une ligne (defun AddLine (pt1 pt2) (entmake (list (cons 0 "LINE") (cons 10 pt1) (cons 11 pt2) ) ) ) ; fonction d'extraction des sommets d'un polyligne (defun GetListVtx (oPoly / p) (repeat (setq p (1+ (fix (setq p (vlax-curve-getEndParam oPoly))))) (setq l (cons (vlax-curve-getPointAtParam oPoly (setq p (1- p))) l)) ) ) ; Sélection de la 1ère polyligne (if (and (setq oPoly1 (car (entsel "\n1ère polyligne : "))) ; vérifie que c'est une polyligne (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly1)))) ; vérifie qu'elle n'est pas close (/= 1 (logand (cdr (assoc 70 (entget oPoly1))) 1)) ;Sélection de la 2nde polyligne (setq oPoly2 (car (entsel "\n2ème polyligne : "))) ; vérifie que c'est une polyligne (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly2)))) ; vérifie qu'elle n'est pas close (/= 1 (logand (cdr (assoc 70 (entget oPoly2))) 1)) ; extrait la liste des sommets de la poly 1 (setq lsPts1 (GetListVtx oPoly1)) ; extrait la liste des sommets de la poly 2 (setq lsPts2 (GetListVtx oPoly2)) ; construit la ligne passant par le 1er sommet de chaque polyligne (addLine (car lsPts1) (car lsPts2)) ) (progn ; récupère la ligne crée (setq oLine (entlast)) ; assemble les 2 polylignes, plus la ligne et clos la polyligne résultante (command "_PEDIT" oPoly1 "_J" oPoly2 oLine "" "_C" "") ) ) ) Olivier
  20. @didier Ne t'inquiète pas, les jeunes disposent de l'IA pour résoudre les problèmes, les dinosaures peuvent disparaître tranquillement 😉
  21. Je l'utilise de temps en temps quand le zoom étendu déconne, vois s'il n'y a pas un texte ou un attribut vide ou ne contenant que des espaces qui traine quelque part. Parfois aussi pour voir s'il n'y a pas une police qui serait en cause dans des ralentissements, pour comparer un REGEN avec/sans texte, ainsi que qu'un REGEN avec/sans hachure avec le mode REMPLIR actif ou inactif.
  22. Mettre la variable QTEXTMODE à 0, puis REGEN.
  23. Si tu es plus à l'aise avec DotNet, il y a quelques très bonnes idées ici : https://www.keanw.com/2012/11/creating-the-smallest-possible-rectangle-around-2d-autocad-geometry-using-net.html
  24. Tu peux regarde ici : https://cadxp.com/topic/49825-challengequickhull/
  25. Quand tu es dans le dialogue de paramétrage, tu appuies sur F1 pour ouvrir l'aide en ligne Covadis et tout est expliqué.
×
×
  • 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é