Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. Salut Bred, La réponse est ici, dans le fil précédent.
  2. (gile)

    MATRIX

    Suite à une réponse dans ce sujet, j'ai remarqué une erreur de signe dans la fonction YRotateMatrix. Cette erreur est maintenant corrigée.
  3. J'ai réussi à trouver un solution moins "bricolage". Les rotations du bloc subies sur les axes Y et Z sont calculées à partir des coordonnées du vecteur "rotvec". Ce vecteur est une rotation du vecteur X (1,0,0) du SCO, d'un angle égal à "rot" (code DXF 50), dans le plan du SCO. La rotation du bloc sur l'axe X est calculée à partir des rotations inverses sur les axes Y et Z du SCG, appliquées à l'aide de matrices de rotation, du vecteur norm (direction d'extrusion du SCO code DXF 210). Deux petites routines son nécéssaires au fonctionnement du LISP (asin et mxv). Les coordonnées du point d'insertion son retournées dans le SCG, les angles de rotations suivant les axes X, Y et Z du SCG au point d'insertion. Pour faire subir les mêmes rotation aux blocs dans un aure fichier il faut les appliquer dans l'ordre : rotation sur X, puis sur Y et enfin sur Z. ;;; ASIN Retourne l'arc sinus du nombre, en radians (defun ASIN (num) (if ( (atan num (sqrt (- 1 (expt num 2)))) ) ) ;;; Apply a transformation matrix to a vector by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) (defun C:Blend (/ ss n index str obj nome ins rot norm rotvec rotX rotY rotZ rotvec file) (setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome (setq N (sslength SS)) (setq INDEX 0) (setq STR "") ; chaine de caractère vide ;INIZIO DEL REPEAT ------------------------------------ (repeat n ; Répéter pour chaque bloc (setq obj (vlax-ename->vla-object (ssname SS INDEX))) (setq nome (if (vlax-property-available-p obj "EffectiveName") (setq nome (vla-get-EffectiveName obj)) (setq nome (vla-get-Name obj)) ) ) (setq ins (vlax-get obj 'InsertionPoint)) (setq rot (vla-get-Rotation obj)) (setq norm (vlax-get obj 'normal)) ;; calcul de la rotation du vecteur x dans le SCO du bloc (setq rotvec (trans (polar '(0 0 0) rot 1.0) norm 0)) ;; Calcul des rotations subie par le bloc sur Y puis sur Z (setq rotY (- (asin (caddr rotvec)))) ; rotation sur Y (setq rotZ (atan (cadr rotvec) (car rotvec))) ; rotation sur Z ;; Calcul de la rotation inverse subie par le vecteur normal sur Z (setq zvec (mxv (list (list (cos (- rotZ)) (- (sin (- rotZ))) 0) (list (sin (- rotZ)) (cos (- rotZ)) 0) '(0 0 1) ) norm ) ) ;; Calcul de la rotation inverse subie par le vecteur normal sur Y (setq zvec (mxv (list (list (cos (- rotY)) 0 (sin (- rotY))) '(0 1 0) (list (- (sin (- rotY))) 0 (cos (- rotY))) ) zvec ) ) ;; Calcul de la rotation subie par le bloc sur X (setq rotX (- (atan (cadr zvec) (caddr zvec)))) (setq str (strcat str ; ajout à la chaine précédente nome " " (rtos (car ins)) " " (rtos (cadr ins)) " " (rtos (caddr ins)) " " (angtos rotX) " " (angtos rotY) " " (angtos rotZ) " " (rtos (vla-get-XScalefactor obj)) " " (rtos (vla-get-YScalefactor obj)) " " (rtos (vla-get-ZScalefactor obj)) "\n" ; saut de ligne ) ) (setq INDEX (1+ INDEX)) ;pour passer au bloc suivant ) ; fin de repeat (if (setq file (getfiled "Seletionner un fichier" "" "txt" 1)) ;choisir ou créer un fichier (progn (setq file (open file "a")) ; ouvrir lr fichier (princ str file) ; écrire dans le fichier (close file) ; fermer le fichier ) ) (princ) ) [Edité le 7/10/2006 par (gile)]
  4. N'essaye pas de faire trop de truc nouveau à la fois. Teste les fonctions que tu ne connais pas une par une avant d'essayer de les imbriquer. (setq ent (entsel)) -> ? (car (ensel)) -> ? (type (car (ensel))) -> ? (cadr (entsel)) -> ? (type (cadr (ensel))) -> ? (caadr (entsel)) -> ? (type (caadr (ensel))) -> ? (setq ss (ssget "_:S")) -> ? (type ss) -> ? (ssname ss 0) -> ? (type (ssname ss 0)) -> ? etc ....
  5. Grace à la piste donnée par Bonuscad, on peut reconstituer le SCO d'un bloc, et il semble bien que la rotation (code DXF 50) corresponde à l'angle avec l'axe des X du SCO. Je vérifie tout ça et, si je trouve, je redonne un LISP plus "mathématique" pour extraire les rotations sur les différents axes.
  6. (gile)

    Coller en tant que bloc.....

    Salut, Si ce LISP est toujours chargé (ajouté au fichier AutoCAD.mnl par exemple), la commande REN peut être ajoutée dans les menus contextuels au Menu des objets de référence de bloc. http://img95.imageshack.us/img95/9634/blocsi0.png
  7. Attention Denis ! SELECT est une commande AutoCAD, il faut éviter de donner comme nom de fonction (defun c:...) le nom d'une commande existante.
  8. Salut, Il me semble qu'il y a confusion. SSGET est une fonction pour créer des jeux de sélection (soit un ensemble de une ou plusieurs entités). Chaque entité a un nom d'entité (ename) du type : On peut récupérer les noms d'entité des entités d'un jeu de sélection avec les fonctions SSNAME et SSNAMEX. On peut aussi récupérer le nom de la dernière entité créée avec la fonction ENTLAST. On peut sélectionner une entité unique avec la fonction ENTSEL, elle retourne une liste contenant le nom d'entité et les coordonnées du point qui a servi à la sélectionner, donc pour avoir le nom d'entité faire : (car (entsel)) Chaque entité possède des données qui sont contenues dans une liste accessible avec la fonction ENTGET (liste DXF). Cette liste est une "liste associative" dont les éléments sont des listes ou des "paires pointées" (dotted pair). Le premier élément de chacun des membres de la liste retournée par ENTGET est un "code de groupe DXF". Les groupes DXF pour les différentes entités sont décrits (en français) dans l'aide aux développeurs >> Référence DXF. La fonction ASSOC permet d'accéder directement dans une liste associative à l'élément du groupe spécifié. Les fonctions CAR, CDR et leurs combinaisons, ainsi que NTH et LAST permettent d'accéder à un élément spécifique, LENGTH retourne le nombre d'éléments. Le LISP est un langage de listes, il est, à mon avis, impératif de savoir les "lire" mais aussi les créer (LIST, CONS, APPEND) et les manipuler (APPLY, FOREACH, MAPCAR, MEMBER, REVERSE, SUBST). [Edité le 7/10/2006 par (gile)]
  9. Merci Bonus, très intéressant :D Certaines de ces lignes de code rappellent ce sujet à propos de vecteurs et calcul vectoriel. Le code que tu donnes propose de calculer le vecteur directeur d'un axe X arbitraire à partir d'un vecteur unitaire v qui serait le directeur de l'axe Z. Ce code met en oeuvre l'Algorithme d'axe arbitraire décrit dans l'aide aux développeurs >> Référence DXF >> Concepts DXF avancés (la page suivant celle citée plus haut). Il utilise le produit vectoriel de deux vecteurs (fonction VectorCrossProduct, que j'avais de mon côté appelé v^v). Le produit vectoriel de deux vecteurs de direction différentes (concourants, donc définissant un plan) est un vecteur perpendiculaire à ces deux là (normal au plan). Si ce vecteur est ramené à une unité, c'est le vecteur normal du plan, il peut être un vecteur directeur pour un axe X d'un repère (système de coordonnées) dont v serait le directeur de l'axe Z. Le vecteur utilisé pour faire le produit vectoriel avec v sera soit le vecteur Y du SCG (0,1,0) soit le vecteur Z (0,0,1). C'est l'algorithme d'axe arbitraire qui permet de déterminer lequel des deux est retenu. Si le vecteur v est proche du vecteur Z du SCG, ses coordonnées x et y sont inférieures à 1/64, le vecteur X arbitraire sera le produit du vecteur Y du SCG par v, sinon le résultat du produit vectoriel de du vecteur Z du SCG par v. En faisant le produit vectoriel de v par le vecteur X arbitraire trouvé on obtiendrait un autre vecteur, qui ramené à une unité, serait le troisième vecteur de notre repère (axe Y). Attention toutefois le produit vectoriel n'est pas une opération commutative. Si on inverse l'ordre dans lequels sont passés les arguments, le résultat sera le vecteur inverse (règle de la main droite) : (v^v '(1 0 0) '(0 1 0)) retourne (0 0 1) (v^v '(0 1 0) '(1 0 0)) retourne (0 0 -1) Dans le même esprit, on peut voir aussi ici une explication pour créer un SCU à partir de trois points. [Edité le 7/10/2006 par (gile)]
  10. J'avis bien lu, mais je vois mal comment faire, avec un attribut justifié au milieu dont la longueur est variable, pour mettre un texte à côté et que l'espace entre le texte et l'attribut reste fixe. C'est ce que j'appelais le beurre et l'argent du beurre, celà dit sans méchanceté aucune, cela va sans dire. ;) Tu disais aussi : C'est pourquoi je proposais un autre solution. [Edité le 6/10/2006 par (gile)]
  11. Là c'est pas évident, et avoir du passer par un artifice ne me satisfait à moitié. Je ne comprends pas ce qu'indique la donnée "rotation" d'un bloc en 3D. Tant qu'on est dans un plan parallèle au SCU (bloc uniquement pivoté sur Z), pas de souci, c'est l'angle par rapport à l'axe des X du SCG, mais si le bloc a subi une rotation sur un autre axe, impossible (pour moi) de comprendre à quoi il correspond ! Pourtant cette donnée plus l'angle d'extrusion doivent être suffisantes pour décrire l'orientation du bloc.
  12. (gile)

    Rotation de SCU

    Salut, La valeur retournée avec (vlax-ldata-get "Phalene" "AngSCU") devrait être toujours la même, je pense que le problème vient plutot de la manière dont elle est utlisée.
  13. Ben faut savoir ce qu'on veut, difficile d'avoir le beurre et l'argent du beurre ;)
  14. (gile)

    Séparer des solides

    Salut, Ça sert aussi quand on soustrait un solide à plusieurs autres, après la soustractions les solides restant sont unis même s'ils ne sont pas jointifs.
  15. Si le nombre de décimales est toujours le même (paramétré dans le champ), dans ton bloc, tu justifies l'attribut/champ à droite et place ton objet texte à côté de l'attribut avec l'espace qui restera constant quelque soit la valeur de l'attribut. Ça marche, j'ai fais mon Pline_block comme ça.
  16. Salut, Excuse moi pour cette réponse tardive. Ta méthode n'est pas bonne, les coordonnées retournées par (cdr (assoc 210 EL)) ou (vlax-get obj 'Normal) sont celles du vecteur de une unité dont l'origine est en 0,0,0 et qui est perpendiculaire au plan XY du SCO de l'objet (la direction d'extrusion de ce plan). J'ai trouvé un moyen, pas très orthodoxe, pour récupérer les angles de rotations suivant les axes X, Y et Z du SCG. Par le calcul trigonométrique, à partir des coordonnée de la direction d'extrusion du bloc, on peut trouver une rotation sur X, puis, une fois celle ci effectuée, une rotation sur Y pour que le bloc revienne dans un plan parallèle au plan XY. Ensuite n'ai pas su trouver le rapport entre l'angle retourné par (cdr (assoc 50 EL)) ou (vla-get-Rotation obj) et la rotation finale à effectuer sur Z. Je propose donc un artifice, je fais faire au bloc ces deux rotations pour le remettre dans le plan XY, puis je récupère l'angle de rotation sur Z, et je refais les rotaion en sens et en ordre inverse pour remettre le bloc dans sa position initiale. Attention pour remettre un bloc dans la même position, après insertion, il faut lui faire faire les rotations d'abord sur Z, puis sur Y, et enfin sur X (dans le fichier elles apparaissent dans l'ordre inverse). Voici ce que je te propose à partir de ce que tu avais fait : (defun C:Blend () (setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome (setq N (sslength SS)) (setq INDEX 0) (setq STR "") ; chaine de caractère vide ;INIZIO DEL REPEAT ------------------------------------ (repeat n ; Répéter pour chaque bloc (setq obj (vlax-ename->vla-object (ssname SS INDEX))) (setq nome (if (vlax-property-available-p obj "EffectiveName") (setq nome (vla-get-EffectiveName obj)) (setq nome (vla-get-Name obj)) ) ) (setq ins (vlax-get obj 'InsertionPoint)) (setq norm (vlax-get obj 'normal)) ;; Calcul des rotations sur X puis sur Y pour remettre le bloc dans le plan XY de SCG (setq rotX (- (atan (cadr norm) (caddr norm)))) ; rotation sur X (setq rotY (atan (car norm) (sqrt (- 1 (expt (car norm) 2))))) ; rotation sur Y ;; Replace le bloc dans le plan XY du SCG ;; Rotation du bloc sur X (vla-rotate3d obj (vlax-3d-point ins) (vlax-3d-point (mapcar '+ ins '(1 0 0))) (- rotX) ) ;; Rotation du bloc sur Y (vla-rotate3d obj (vlax-3d-point ins) (vlax-3d-point (mapcar '+ ins '(0 1 0))) (- rotY) ) ;; Récupère la rotation du bloc sur Z (setq rotZ (vla-get-Rotation obj)) ;; Replace le bloc dans sa position initiale (vla-rotate3d obj (vlax-3d-point ins) (vlax-3d-point (mapcar '+ ins '(0 1 0))) rotY ) (vla-rotate3d obj (vlax-3d-point ins) (vlax-3d-point (mapcar '+ ins '(1 0 0))) rotX ) (setq str (strcat str ; ajout à la chaine précédente nome " " (rtos (car ins)) " " (rtos (cadr ins)) " " (rtos (caddr ins)) " " (angtos rotX) " " (angtos rotY) " " (angtos rotZ) " " (rtos (vla-get-XScalefactor obj)) " " (rtos (vla-get-YScalefactor obj)) " " (rtos (vla-get-ZScalefactor obj)) "\n" ; saut de ligne ) ) (setq INDEX (1+ INDEX)) ;pour passer au bloc suivant ) ; fin de repeat (if (setq file (getfiled "Seletionner un fichier" "" "txt" 1)) ;choisir ou créer un fichier (progn (setq file (open file "a")) ; ouvrir lr fichier (princ str file) ; écrire dans le fichier (close file) ; fermer le fichier ) ) (princ) ) [Edité le 6/10/2006 par (gile)]
  17. (gile)

    point d\'insertion

    Salut, Tu ouvres ton bloc dans l'éditeur de blocs dynamiques (MODIFBLOC ou _BEDIT), là tu déplaces tous les objets de façon à mettre le nouveau point d'insertion en 0,0 du SCU de l'éditeur.
  18. (gile)

    spécial sélection

    Il y avait un bug dans SelByObj avec les polylignes en vue 3D dans un SCU différent du SCO, le LISP a été modifié.
  19. Bizarre, ça marche bien chez moi, j'ai essayé avec différents zooms, pas de problème. :casstet:
  20. Je rassemble ici des routines, dans des versions plus abouties, qui me semblent pouvoir être utiles. Elles sont issues de sujets traités ici et là. Ces routines fonctionnent désormais quelques soient le SCU courant et le SCO des objets, elle agissent suivant la vue courante comme les sélections par fenêtre ou capture. La première permet de faire un jeu de sélection avec les objets qui se trouvent à l'intérieur (ou capturés par) d'une entité fermée (cercle, ellipse, polyligne). Elle nécessite trois arguments : - le nom d'entité (ename) de l'objet servant à faire la sélection - une option "Cp" ou "Wp" (pour capture ou fenêtre) - un filtre de sélection (type liste ssget) ou nil Version du 06/10/06 (bug en 3D réparé) ;;; SelByObj -Gilles Chanteau- 06/10/06 ;;; Crée un jeu de sélection avec tous les objets contenus ou ;;; capturés, dans la vue courante, par l'objet sélectionné ;;; (cercle, ellipse, polyligne fermée). ;;; Arguments : ;;; - un nom d'entité (ename) ;;; - un mode de sélection (Cp ou Wp) ;;; - un filtre de sélection ou nil (defun SelByObj (ent opt fltr / obj dist n lst prec dist p_lst) (vl-load-com) (setq obj (vlax-ename->vla-object ent)) (cond ((member (cdr (assoc 0 (entget ent))) '("CIRCLE" "ELLIPSE")) (setq dist (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) 50 ) n 0 ) (repeat 50 (setq lst (cons (trans (vlax-curve-getPointAtDist obj (* dist (setq n (1+ n)))) 0 1 ) lst ) ) ) ) (T (setq p_lst (vl-remove-if-not '(lambda (x) (or (= (car x) 10) (= (car x) 42) ) ) (entget ent) ) ) (while p_lst (setq lst (append lst (list (trans (append (cdr (assoc 10 p_lst)) (list (cdr (assoc 38 (entget ent)))) ) ent 1 ) ) ) ) (if (/= 0 (cdadr p_lst)) (progn (setq prec (1+ (fix (* 50 (abs (cdadr p_lst))))) dist (/ (- (if (cdaddr p_lst) (vlax-curve-getDistAtPoint obj (trans (cdaddr p_lst) ent 0) ) (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (vlax-curve-getDistAtPoint obj (trans (cdar p_lst) ent 0) ) ) prec ) n 0 ) (repeat (1- prec) (setq lst (append lst (list (trans (vlax-curve-getPointAtDist obj (+ (vlax-curve-getDistAtPoint obj (trans (cdar p_lst) ent 0) ) (* dist (setq n (1+ n))) ) ) 0 1 ) ) ) ) ) ) ) (setq p_lst (cddr p_lst)) ) ) ) (ssget (strcat "_" opt) lst fltr) ) Elle peut être utilisée dans d'autre LISP ou plus directement avec ce type de fonction d'appel. (supprimer les espaces entre ;;; SSOC pour sélectionner tous les objets capturés, suivant ;;; la vue, par le cercle, l'ellipse ou la polyligne. (defun c:ssoc (/ ss opt) (sssetfirst nil nil) (if (setq ss (ssget "_:S:E" (list '(-4 . "[color=#CC0000] '(0 . "CIRCLE") '(-4 . "[color=#CC0000] '(0 . "ELLIPSE") '(41 . 0.0) (cons 42 (* 2 pi)) '(-4 . "AND>") '(-4 . "[color=#CC0000] '(0 . "LWPOLYLINE") '(-4 . "&") '(70 . 1) '(-4 . "AND>") '(-4 . "OR>") ) ) ) (sssetfirst nil (ssdel (ssname ss 0) (SelByObj (ssname ss 0) "Cp" nil)) ) ) (princ) ) ;;; SSOF pour sélectionner tous les objets contenus, suivant ;;; la vue, dans le cercle, l'ellipse ou la polyligne. (defun c:ssof (/ ss opt) (sssetfirst nil nil) (if (setq ss (ssget "_:S:E" (list '(-4 . "[color=#CC0000] '(0 . "CIRCLE") '(-4 . "[color=#CC0000] '(0 . "ELLIPSE") '(41 . 0.0) (cons 42 (* 2 pi)) '(-4 . "AND>") '(-4 . "[color=#CC0000] '(0 . "LWPOLYLINE") '(-4 . "&") '(70 . 1) '(-4 . "AND>") '(-4 . "OR>") ) ) ) (sssetfirst nil (SelByObj (ssname ss 0) "Wp" nil)) ) (princ) ) Un autre exemple d'utilisation ici. SelByObj sert aussi pour cette autre routine, qui permet de sélectionner une polyligne fermée en spécifiant un point à l'intérieur de celle-ci. ;;; SelPlineByPoint -Gilles Chanteau- 05/10/06 ;;; Sélectionne une entité fermée par un point à l'intérieur ;;; Retourne un nom d'entité (ename) ou un message d'erreur (defun SelPlineByPoint (pt / size vdir inc rad loop pick circle ss ent x_lst) (setq size (getvar "VIEWSIZE") vdir (trans (getvar "VIEWDIR") 1 0) inc (/ size 200) rad inc loop T ) (entmake (list '(0 . "LINE") (cons 10 (trans pt 1 0)) (cons 11 (trans pt 1 0)) ) ) (setq pick (entlast)) (while loop (if ( (setq loop nil) ) (entmake (list '(0 . "CIRCLE") (cons 10 (trans pt 1 vdir)) (cons 40 rad) (cons 210 vdir) ) ) (setq circle (entlast)) (if (setq ss (SelByObj circle "Cp" '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1)) ) ) (progn (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (if (member ent x_lst) (ssdel ent ss) ) ) (if (setq ent (ssname ss 0)) (if (SelByObj ent "Wp" (list '(0 . "LINE") (cons 10 (trans pt 1 0)) (cons 11 (trans pt 1 0)) ) ) (setq loop nil) (setq x_lst (cons ent x_lst)) ) ) ) ) (entdel circle) (setq rad (+ rad inc)) ) (entdel pick) ent ) Un exemple de fonction d'appel : (defun c:selp (/ pt) (sssetfirst nil nil) (initget 1) (setq pt (getpoint "\nSpécifiez un point à l'intérieur de la polyligne: " ) ) (if (setq ent (SelPlineByPoint pt)) (sssetfirst nil (ssadd ent)) (princ "\nPas polyligne trouvée.") ) (princ) ) Un autre exemple d'utilisation ici. [Edité le 6/10/2006 par (gile)]
  21. C'est pour les (command ...) qu'il faut désactiver les accrochages... On peut le faire en accrochage temporaire : "_non" pour "aucun" (command "_copy" sel "" [surligneur]"_non"[/surligneur] pA ".yz" "@" pause)
  22. Une version un peu plus concise : (defun c:ss123 (/ ss sstemp) (setq *ss1* (ssadd) *ss2* (ssadd) *ss3* (ssadd) ss (ssget "_X" '((-4 . "[color=#CC0000] (0 . "CIRCLE") (-4 . "[color=#CC0000] (0 . "LWPOLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (if ss (progn (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (if (setq sstemp (SelByObj ent "Wp" nil)) (progn (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sstemp)) ) (ssadd n *ss1*) ) (ssadd ent *ss2*) ) (ssadd ent *ss3*) ) ) (foreach ent (mapcar 'cadr (ssnamex *ss2*)) (if (member ent (mapcar 'cadr (ssnamex *ss1*))) (ssdel ent *ss2*) ) ) (foreach ent (mapcar 'cadr (ssnamex *ss3*)) (if (member ent (mapcar 'cadr (ssnamex *ss1*))) (ssdel ent *ss3*) ) ) ) ) (alert "La sélection est terminée") (princ) )
  23. Si j'ai bien compris, toujours avec SelByObj et après avoir supprimé les espaces : (defun c:ss123 (/ ss n sstemp ent n2) (setq *ss1* (ssadd) *ss2* (ssadd) *ss3* (ssadd) ss (ssget "_X" '((-4 . "[color=#CC0000] (0 . "CIRCLE") (-4 . "[color=#CC0000] (0 . "LWPOLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (if ss (progn (repeat (setq n (sslength ss)) (if (setq sstemp (SelByObj (setq ent (ssname ss (setq n (1- n)))) "Wp" nil ) ) (progn (repeat (setq n2 (sslength sstemp)) (ssadd (ssname sstemp (setq n2 (1- n2))) *ss1*) ) (ssadd ent *ss2*) ) (ssadd ent *ss3*) ) ) (repeat (setq n (sslength *ss2*)) (if (member (setq ent (ssname *ss2* (setq n (1- n)))) (mapcar 'cadr (ssnamex *ss1*)) ) (ssdel ent *ss2*) ) ) (repeat (setq n (sslength *ss3*)) (if (member (setq ent (ssname *ss3* (setq n (1- n)))) (mapcar 'cadr (ssnamex *ss1*)) ) (ssdel ent *ss3*) ) ) ) ) (alert "La sélection est terminée") (princ) )
  24. Sinon ce n'est vraiment pas grand chose à faire, SelByObj est prévue pour fonctionner avec un filtre de sélection.
  25. Re, Et si des polylignes fermées ou des cercles sont contenus dans d'autres polylignes ou cercles, faut il les écarter du jeu de sélection des objets "contenus" ?
×
×
  • 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é