-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
Çà y est, le problème soulevé par lecrabe semble résolu. Çà devrait marcher quelque soit le SCU dans lequel ont été dessiné les lwpolylignes et quelque soit le SCU courant. J'ai été obligé de mettre une tolérance pour la comparaison des points (de l'ordre du milliardième), la traduction des points du SCO vers le SCG altèrant un peu la précision d'AutoCAD. Pour Boris : Il est bien spécifié dans le premier message que les arcs des lwpolylignes ne sont pas conservés dans la polyligne 3D finale.
-
Merci à toi, cher décapode, d'avoir testé en profondeur et soulevé un problème que, dans mon enthousiasme, j'avais occulté. En effet, les sommets des lwpolylignes sont définis, en dxf, par des points 2D dans le SCO. Leurs traductions dans le LISP pour comparaison avec les autres points était incomplète. Le problème est en partie réparé (je modifie à nouveau le code ci-dessus). En partie, parceque j'ai encore un soucis si la lwpolyligne a été créée dans un SCU non parallèle au SCG, soucis que je ne desespère pas solutionner rapidement.
-
À "lecrabe" : Je t'ai envoyé le LISP. À tous : Le LISP ci-dessus fonctionne correctement si, après l'avoir collé dans le bloc-note, on supprime les espaces après les signes .
-
Mille excuses aux premiers lecteurs. :mad2: J'avais oublié de mettre des espaces après les signes (à supprimer après collage) ce qui provoque une erreur d'affichage dans CADxp.
-
Calcul d\'aire par sélection (suite)
(gile) a répondu à un(e) sujet de jalna dans Pour aller plus loin en LISP
Salut, Je m'immisce : Remplace : (alert(strcat "\nSurface totale: "(VL-PRINC-TO-STRING(/(vla-get-Area(vlax-ename->vla-object ent1))10000.0)))) par : (alert(strcat "\nSurface totale: "(rtos(/(vla-get-Area(vlax-ename->vla-object ent1))10000.0)2 2))) -
Transformer des lignes en polylignes 3D
(gile) a répondu à un(e) sujet de Marc Blancher dans AutoCAD 2006
Salut, J'ai posté ici un LISP plus abouti. Il a un fonctionnement similaire à l'option Joindre de la commande PEDIT. -
Salut, J'ai posté ici un LISP qui fonctionne comme l'option Joindre de la commande PEDIT, mais pour les polylignes 3D.
-
Suite à des sujets récents sur les modifications de polylignes 3D, ici ou là, j'ai peaufiné un LISP au fonctionnement similaire à l'option Joindre de la commande PEDIT, mais pour les polylignes 3D. Il crée est une polyligne 3D a partir des objets sélectionnés (lignes, polylignes 3D ou lwpolylignes) s'il sont jointifs. NOTA : ne conserve pas les arcs et les largeurs des lwpolylignes. Pour les utilisateurs des logiciels qui ne reconnaissent pas les fonctions vl-*, il est possible de remplacer vl-remove-if-not, vl-member-if, vl-remove, par les fonctions remove-if-not, member-if, remove, définies ici. NOUVELLE VERSION 05/05/06 La polyligne créée hérite des propriétés (calque, type de lignes, couleur) du premier objet sélectionné. On peut aussi le télécharger directement ou à partir des Téléchargements proposées par les membres. Nouvelle version : correction d'une erreur signalée par Bonuscad Une version Visual LISP existe aussi en téléchargement sur cette page ;;; Join3dPoly - 05/02/06 - ;;; Joint au premier objet sélectionné les objets suivants s'ils sont jointifs. ;;; Fonctionne avec les lignes et polylignes ouvertes (lw ou 3D). ;;; La polyligne 3D créée hérite des propriétés (calque, couleur, type de ligne) ;;; du premier objet sélectionné. ;;; ;;; NOTA : Ne conserve ni les arcs ni les largeurs des lwpolylignes d'origine. (defun c:Join3dPoly (/ ;; Fonctions val_dxf line_pts 3dpoly_pts lwpoly_pts butlast *error* ;;Variables fltr ent pts pt ss cnt e_lst l_lst sub_lst lay ) ;;************************ SOUS ROUTINES ************************;; ;; Valeur du code dxf d'une entité (ename) (defun val_dxf (code ent) (cdr (assoc code (entget ent))) ) ;; Liste des extrémités d'une ligne (defun line_pts (ent) (list (val_dxf 10 ent) (val_dxf 11 ent)) ) ;; Liste des sommets d'une polyligne 3D (defun 3dpoly_pts (ent / pt pts) (while (setq pt (val_dxf 10 (entnext ent))) (setq ent (entnext ent) pts (cons pt pts) ) ) pts ) ;; Liste des sommets d'une lwpolyligne (dans le SCG) (defun lwpoly_pts (ent) (mapcar '(lambda (pt) (trans (list (car pt) (cadr pt) (val_dxf 38 ent)) ent 0) ) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent) ) ) ) ) ;; Liste sans le dernier élément (defun butlast (lst) (reverse (cdr (reverse lst))) ) ;; Redéfinition de *error* (defun *error* (msg) (if (or (= msg "Fonction annulée") (= msg "quitter / sortir abandon") ) (princ) (princ (strcat "\nErreur: " msg)) ) (command) (princ) ) ;;********************* FONCTION PRINCIPALE *********************;; ;; Sélection du premier objet (while (not (and (setq ent (car (entsel "\nSélectionnez une ligne ou une polyligne: ") ) ) (or (= (val_dxf 0 ent) "LINE") (and (= (val_dxf 0 ent) "POLYLINE") (= (val_dxf 70 ent) 8) ) (and (= (val_dxf 0 ent) "LWPOLYLINE") (= (val_dxf 70 ent) 0) ) ) ) ) ) ;; Sélection des objets à joindre (prompt "\nSélectionnez les lignes et polylignes à joindre" ) (setq ss (ssget '((-4 . "[b] (0 . "LINE") (-4 . "[b] (0 . "POLYLINE") (70 . 8) (-4 . "and>") (-4 . "[b] (0 . "LWPOLYLINE") (70 . 0) (-4 . "and>") (-4 . "or>") ) ) ) ;; PTS : liste des sommets du premier objet sélectionné (setq pts (cond ((= (val_dxf 0 ent) "LINE") (line_pts ent)) ((= (val_dxf 0 ent) "POLYLINE") (3dpoly_pts ent)) ((= (val_dxf 0 ent) "LWPOLYLINE") (lwpoly_pts ent)) ) ) ;; L_LST : liste constiuée de listes contenant le nom d'entité et les sommets ;; pour chaque objet du jeu de sélection (exepté le premier objet sélectionné) (setq cnt 0) (while (setq ele (ssname ss cnt)) (if (not (equal ent ele)) (setq l_lst (cons (cons ele (cond ((= (val_dxf 0 ele) "LINE") (line_pts ele)) ((= (val_dxf 0 ele) "POLYLINE") (3dpoly_pts ele)) ((= (val_dxf 0 ele) "LWPOLYLINE") (lwpoly_pts ele)) ) ) l_lst ) ) ) (setq cnt (1+ cnt)) ) ;; Boucle tant qu'un objet a une extrémité commune avec celles de la liste PTS (while (setq sub_lst (vl-member-if '(lambda (x) (or (equal (cadr x) (car pts) 1e-009) (equal (last x) (car pts) 1e-009) (equal (cadr x) (last pts) 1e-009) (equal (last x) (last pts) 1e-009) ) ) l_lst ) ) ;; Ajout, dans l'ordre, des sommets de chaque objet jointif à PTS (cond ((equal (cadar sub_lst) (car pts) 1e-009) (setq pts (append (reverse (cddar sub_lst)) pts)) ) ((equal (last (car sub_lst)) (car pts) 1e-009) (setq pts (append (butlast (cdar sub_lst)) pts)) ) ((equal (cadar sub_lst) (last pts) 1e-009) (setq pts (reverse (append (reverse (cddar sub_lst)) (reverse pts)) ) ) ) ((equal (last (car sub_lst)) (last pts) 1e-009) (setq pts (reverse (append (butlast (cdar sub_lst)) (reverse pts)) ) ) ) ) ;; Suppression de l'objet traité de la liste L_LST ;; Constitution de E_LST avec les noms d'entités de ces objets. (setq l_lst (vl-remove (car sub_lst) l_lst) e_lst (cons (caar sub_lst) e_lst) ) ) ; Fin de la boucle (setq cnt (length e_lst) ; Compte des objets ajoutées e_lst (cons ent e_lst) ; Ajout de la première entité à E_LST ) ;; Créaton de la polyligne (command "_regen") (setq lay (assoc 8 (entget ent))) (entmake (list '(0 . "POLYLINE") '(70 . 8) lay (if (val_dxf 6 ent) (cons 6 (val_dxf 6 ent)) (cons 6 "BYLAYER") ) (if (val_dxf 62 ent) (cons 62 (val_dxf 62 ent)) (cons 62 256) ) ) ) (mapcar 'entmake (mapcar '(lambda (pt) (list '(0 . "VERTEX") (cons 10 pt) lay '(70 . 32))) pts ) ) (entmake '((0 . "SEQEND"))) (mapcar 'entdel e_lst) ; Suppression des objets transformés (prompt (strcat "\n" (itoa cnt) " objets ont été ajoutés à la polyligne 3D." ) ) (princ) ) [Edité le 5/2/2006 par (gile)] [Edité le 20/5/2008 par (gile)]
-
Personnellement, je préfère mettre la variable UCSORTHO à 0. En 3D, on ne fait pas que dessiner dans le plan XY du SCU, on peut avoir besoin de passer par une vue orthogonale pour modifier des objets ou tout simplement pour jeter un oeil au dessin sous cet angle, et je trouve détestable que mon SCU soit changé sans que je l'ai décidé. Astuce : avec le "Style d'icone du SCU 2D", quand on ne peut plus dessiner dans le plan XY, l'icone se transforme en "crayon cassé".
-
Transformer des lignes en polylignes 3D
(gile) a répondu à un(e) sujet de Marc Blancher dans AutoCAD 2006
Voici une nouvelle version au fonctionnement plus proche de _PEDIT. Après la sélection du premier segment (pas forcément à une extrémité de la future polyligne 3D), il est demandé à l'utilisateur de sélectionner toutes les autres lignes à ajouter. Tous les segments jointifs sont intégrés à la polyligne 3D. Nouvelle version (accepte une ligne ou une polyligne 3D comme entité de départ) (defun c:Line2Poly (/ v1 v2 ent pts pt ss cnt e_lst l_lst sub_lst) (setq v1 (getvar "osmode") v2 (getvar "cmdecho") ) (prompt "\nSélectionnez une ligne ou une polyligne 3D") (setq ent (ssname (ssget "_:S" '((0 . "LINE,POLYLINE"))) 0)) (cond ((= (cdr (assoc 0 (entget ent))) "LINE") (setq pts (list (cdr (assoc 11 (entget ent))) (cdr (assoc 10 (entget ent))) ) ) ) ((= (cdr (assoc 0 (entget ent))) "POLYLINE") (while (setq pt (cdr (assoc 10 (entget (entnext ent))))) (setq ent (entnext ent) pts (cons pt pts) ) ) (setq ent (cdr (assoc -2 (entget (entnext ent))))) ) (T (prompt "Erreur: Entité non valide") (exit)) ) (prompt "\nSélectionnez les lignes à transformer en polyligne 3D" ) (setq ss (ssget '((0 . "LINE"))) cnt 0 ) (repeat (sslength ss) (setq e_lst (cons (ssname ss cnt) e_lst)) (setq cnt (1+ cnt)) ) (setq l_lst (mapcar 'entget (vl-remove ent e_lst)) e_lst nil ) (while (setq sub_lst (vl-member-if '(lambda (x) (or (equal (cdr (assoc 10 x)) (car pts)) (equal (cdr (assoc 11 x)) (car pts)) (equal (cdr (assoc 10 x)) (car (reverse pts))) (equal (cdr (assoc 11 x)) (car (reverse pts))) ) ) l_lst ) ) (cond ((equal (cdr (assoc 10 (car sub_lst))) (car pts)) (setq pts (cons (cdr (assoc 11 (car sub_lst))) pts)) ) ((equal (cdr (assoc 11 (car sub_lst))) (car pts)) (setq pts (cons (cdr (assoc 10 (car sub_lst))) pts)) ) ((equal (cdr (assoc 11 (car sub_lst))) (car (reverse pts))) (setq pts (reverse (cons (cdr (assoc 10 (car sub_lst))) (reverse pts)) ) ) ) ((equal (cdr (assoc 10 (car sub_lst))) (car (reverse pts))) (setq pts (reverse (cons (cdr (assoc 11 (car sub_lst))) (reverse pts)) ) ) ) ) (setq l_lst (vl-remove (car sub_lst) l_lst) e_lst (cons (cdr (assoc -1 (car sub_lst))) e_lst) ) ) (setq cnt (length e_lst) e_lst (cons ent e_lst) ) (command "_undo" "_begin") (setvar "osmode" 0) (setvar "cmdecho" 0) (command "_erase") (mapcar 'command e_lst) (command "") (command "_3dpoly") (mapcar 'command pts) (command "") (command "_undo" "_end") (setvar "osmode" v1) (setvar "cmdecho" v2) (prompt (strcat "\n" (itoa cnt) " objets on été ajoutés à la polyligne 3D." ) ) (princ) ) [Edité le 1/2/2006 par (gile)] -
Les variables système sont bien renseignées dans l'aide Présentation des commandes -> Variables système Mais Rebcao (encore lui !) a fait un super boulot avec sa Liste complète des variables système d'AutoCAD et son BEST OF des variables système d'AutoCAD
-
Transformer des lignes en polylignes 3D
(gile) a répondu à un(e) sujet de Marc Blancher dans AutoCAD 2006
J'ai modifié le LISP pour qu'il fonctionne même si les lignes n'ont pas été dans le même sens (départ de l'une = fin de la précédente) -
Salut, Essaye en mettant UCSORTHO à 0.
-
Transformer des lignes en polylignes 3D
(gile) a répondu à un(e) sujet de Marc Blancher dans AutoCAD 2006
Salut, Un petit LISP vite fait, il faut sélectionner successivement chaque ligne une par une (pour un contrôle de "jointivité" des segments) et taper "Enter" (ou clic droit) pour terminer la commande. (defun c:Line->3dPoly (/ v1 v2 l1 l2 pts) (setq v1 (getvar "osmode") v2 (getvar "cmdecho") ) (while (not (setq l1 (car (entsel "\nSélectionnez le premier segment: "))) ) ) (cond ((= (cdr (assoc 0 (entget l1))) "LINE") (setq pts (list (cdr (assoc 11 (entget l1))) (cdr (assoc 10 (entget l1))) ) ) (command "_undo" "_begin") (while (setq l2 (car (entsel "\nSélectionnez le segment suivant ou : "))) (if (= (cdr (assoc 0 (entget l1))) "LINE") (cond ((equal (cdr (assoc 10 (entget l2))) (car pts)) (setq pts (cons (cdr (assoc 11 (entget l2))) pts)) (entdel l1) (setq l1 l2) ) ((equal (cdr (assoc 11 (entget l2))) (car pts)) (setq pts (cons (cdr (assoc 10 (entget l2))) pts)) (entdel l1) (setq l1 l2) ) ((equal (cdr (assoc 11 (entget l2))) (car (reverse pts))) (setq pts (reverse (cons (cdr (assoc 10 (entget l2))) (reverse pts)))) (entdel l1) (setq l1 l2) ) ((equal (cdr (assoc 10 (entget l2))) (car (reverse pts))) (setq pts (reverse (cons (cdr (assoc 11 (entget l2))) (reverse pts)))) (entdel l1) (setq l1 l2) ) (T (alert "Segment non jointif")) ) (alert "L'objet sélectionné n'est pas une ligne") ) ) (setvar "osmode" 0) (setvar "cmdecho" 0) (entdel l1) (command "_3dpoly") (mapcar 'command pts) (command "") (command "_undo" "_end") (setvar "osmode" v1) (setvar "cmdecho" v2) ) (T (alert "L'objet sélectionné n'est pas une ligne")) ) (princ) ) [Edité le 1/2/2006 par (gile)] -
J'ai ajouté au mémo un petit paragraphe sur la façon de procéder avec la "méthode de Newton" pour calculer le demi-angle à partir de la longueur de l'angle et de la corde ou de la flèche. Pour de plus amples expilcations (en français) sur la "méthode de Newton" on peut voir ici ou sur Wikipédia
-
Voici la syntaxe exacte ( pour AutoCAD 2006, sur le dique C: ) avec un espace entre le guillemet et le slash: "C:\Program Files\AutoCAD 2006\acad.exe" /nologo [Edité le 31/1/2006 par (gile)]
-
Salut, Clic droit sur l'icone de démarrage d'AutoCAD -> Propriétés, dans cible , tu rajoute /nologo après "...\acad.exe"
-
Au temps pour moi, j'ai pu tester. À la place de : j'aurais dû dire : soit tu resélectionnes la rotation dans chaque état de visibilité Encore une fois, Eric a été plus vif et moins approximatif que moi :mad2:
-
Salut, Çà me semble normal, soit tu redéfinis la rotation dans chaque état de visibilité, soit tu définis d'abord ton paramètre et ton action de rotation que tu sélectionnes ensuite dans chaque état de visibilité. Celà dit avec beaucoup de circonspection, c'est de mémoire, je n'ai pas 2006 sous la main.
-
Merci Winfield, j'avais déjà ce document en format .doc, c'est une véritable BIBLE :)
-
Et encore, pour les lispeurs, deux petites routines qui retournent l'angle (en radians) décrit par un arc en fonction de la longueur de l'arc et de la corde ou de la flèche. Les routines utilisent la "méthode de Newton". ;;; ArcCorde->Angle ;;; Retourne l'angle d'un arc d'après sa longueur et sa corde (defun ArcCorde->Angle (arc corde / k c) (setq k (/ corde arc) c (sqrt (- 6 (* 6 k))) ) (repeat 5 (setq c (- c (/ (- (sin c) (* k c)) (- (cos c) k)))) ) (* 2 c) ) ;;; ArcFleche->Angle ;;; Retourne l'angle d'un arc d'après sa longueur et sa flèche (defun ArcFleche->Angle (arc fleche / k c) (setq k (/ (* 2 fleche) arc) c (* 2 k) ) (repeat 5 (setq c (- c (/ (+ (cos c) (* k c) (- 1)) (- k (sin c))))) ) (* 2 c) )
-
Et aussi, un petit tableau Excel que je peux envoyer à ceux que çà intéresse. On rentre deux dimensions connues sur une ligne (cellules bleues), les autres dimensions sont calculées sur cette même ligne. http://img81.imageshack.us/img81/3937/gomtrie9sh.png
-
Merci à Patrick et Delicad pour ce lien fort intéressant, je vais pouvoir essayer de comprendre cette fameuse "méthode de Newton" tout en perfectionnant mon piètre anglais :) J'ai mis ici un mémo pour pouvoir jongler avec les dimensions d'un arc.
-
Voici un petit Mémo pour jongler avec les dimensions d'un arc de cercle. Je peux l'envoyer en PDF à ceux qui le désireraient. http://img360.imageshack.us/img360/3587/memoarc0rw.png [Edité le 31/1/2006 par (gile)]
-
http://img88.imageshack.us/img88/8281/memoarc5uh.png [Edité le 28/1/2006 par (gile)]
