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, On ne peut pas récupérer directement en LISP les rotations 3D subies sur les 3 axes X Y et Z. On peut récupérer le vecteur normal du plan XY du SCO du bloc : (setq norm (cdr (assoc 210 (entget ent)))) ou (vlax-get (vlax-ename->vla-object ent) 'normal) et la rotation globale par rapport à l'axe des X du SCG : (setq norm (cdr (assoc 50 (entget ent)))) ou (vla-get-rotation (vlax-ename->vla-object ent)) Ces données, avec le point d'insertion, sont suffisantes pour replacer un bloc dans la même position.
  2. Salut, Un petit truc vite fait, avec la fonction SelByObj. Il faut d'abord lancer ss123 pour créer les 3 jeux de sélection qui seront conservés dans des variables globales (*ss1* *ss2* *ss3*). Ensuite, lancer contenu sélectionne tous les objets contenus dans les cercles et polylignes, contenant les cercles et polylignes qui contiennnent des objets, et vide les cercles et polylignes vides. Désolé, j'avais encore oublié de mettre des espaces à enlever entre ;;; SelByObj -Gilles Chanteau- 04/10/06 ;;; Crée un jeu de sélection avec tous les objets contenus ou ;;; capturés par le polygone créé à partir de l'objet sélectionné ;;; Les courbes (cercles, ellipses, arcs de polylignes) sont segmentés ;;; Arguments : ;;; - un nom d'entité (ename) -cercle, ellipse, polyligne fermée- ;;; - un mode de sélection (Cp ou Wp) ;;; - un filtre de sélection (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 (cdr (assoc 10 p_lst))))) (if (/= 0 (cdadr p_lst)) (progn (setq prec (fix (* 50 (abs (cdadr p_lst)))) dist (/ (- (if (cdaddr p_lst) (vlax-curve-getDistAtPoint obj (cdaddr p_lst) ) (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (vlax-curve-getDistAtPoint obj (cdar p_lst) ) ) prec ) n 0 ) (repeat (1- prec) (setq lst (append lst (list (trans (vlax-curve-getPointAtDist obj (+ (vlax-curve-getDistAtPoint obj (cdar p_lst) ) (* dist (setq n (1+ n))) ) ) 0 1 ) ) ) ) ) ) ) (setq p_lst (cddr p_lst)) ) (setq lst (mapcar '(lambda (x) (trans x 0 1)) lst)) ) ) (ssget (strcat "_" opt) lst fltr) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (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 (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*) ) ) ) (alert "La sélection est terminée") (princ) ) (defun c:contenu () (sssetfirst nil nil) (sssetfirst nil *ss1*) (princ) ) (defun c:contenant () (sssetfirst nil nil) (sssetfirst nil *ss2*) (princ) ) (defun c:vide () (sssetfirst nil nil) (sssetfirst nil *ss3*) (princ) ) [Edité le 5/10/2006 par (gile)]
  3. Dans la fenêtre "Membres en ligne", l'icône tout à droite en face de chaque membre. http://img226.imageshack.us/img226/7585/messagerj2.png
  4. Il me faudrait une adresse (par message privé si tu ne veux pas la publier dans le forum) et aussi préciser le format du DWG (2004 ou 2007).
  5. Bien sûr le paramètre linéaire doit faire partie du jeu de sélection de l'action de rotation (voir image). http://img219.imageshack.us/img219/1031/tele4mf4.png Avec la méthode que je propose, en spécifiant la longueur totale de la flèche, chaque élément coulisse de la même distance. http://img147.imageshack.us/img147/6823/tele5qg5.png Si tu veux, je peux t'envoyer ce que j'ai fait pour t'en inspirer.
  6. Salut, Une suggestion : Un paramètre et une action de rotation, comme tu l'as fait, et, pour la sortie de flèche, sur un même paramètre linéaire, 4 actions d'étirement avec des "Variateurs de distance" différents (1, 0.75, 0.5, 0.25) : http://img153.imageshack.us/img153/5114/tele1he3.png http://img153.imageshack.us/img153/1548/tele2tn6.png Tu peux modifier la distance avant ou après rotation. http://img180.imageshack.us/img180/5127/tele3ge2.png
  7. (gile)

    ObjectDCL

    Je n'ai pas dit que les USER* et les Xdata c'est pareil, je donne juste un moyen de faire passer une valeur d'un langage de programmation à un autre. Il y a peut-être un moyen de récupérer les Xdata en VBA, je ne le connais pas.
  8. (gile)

    ObjectDCL

    Je ne connais rien en VBA non plus, mais il me semble qu'on utilise les variables système USERSn, USERIn et USERRn pour passer des données d'un langage à l'autre. (setvar "USERR1" (vlax-ldata-get "Phalene" "AngSCU")) , pour attribuer la valeur à la variable, pour la récupérer en VBA, je te laisse faire.
  9. (gile)

    Bloc avec champ dynamique

    Une petite dernière, un seul et même point à spécifier à l'intérieur de la polyligne pour sa sélection et l'insertion du bloc. Les routines SelPlineByPoint et SelByObj doivent être chargées. (defun c:pline_block (/ AcDoc Space bloc nom ent aire ech long ins) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((tblsearch "BLOCK" (setq bloc "Pline_block"))) ((findfile (setq bloc "Pline_block.dwg"))) (T (setq bloc nil)) ) (if bloc (progn (initget 1) (setq nom (getstring T "\nNom de la pièce: ")) (initget 1) (setq ins (trans (getpoint "\nPoint d'insertion (à l'intérieur de la polyligne): ") 1 0)) (setq ent (SelPlineByPoint ins)) (if (= (type ent) 'ENAME) (progn (setq obj (vlax-ename->vla-object ent) id (vla-get-ObjectID obj) ;; Attribut périmètre (cm -> m) long (strcat "% (itoa id) ">%).Length \\f \"%lu2%pr2%ct8[0.01]\">%" ) ;; Attribut surface (cm² -> m²) aire (strcat "% (itoa id) ">%).Area \\f \"%lu2%pr2%ct8[0.0001]\">%" ) ech (getvar "DIMSCALE") ) (setq ref (vla-InsertBlock Space (vlax-3d-point ins) bloc ech ech ech 0.0 ) ) (mapcar '(lambda (x y) (vla-put-TextString x y)) (vlax-invoke ref 'GetAttributes) (list nom long aire) ) (vla-regen AcDoc acActiveViewport) ) (alert "Aucune polyligne trouvée.") ) ) (alert "Le bloc \"Pline_block\" est introuvable.") ) (princ) )
  10. (gile)

    Commucation Membres

    Salut, Il y a le salon de discussion, où on peut inviter des membres présents à discuter. Il y a aussi un nouveau salon, Chatsum, pour ceux qui utilisent Firefox.
  11. (gile)

    scu general obligatoire

    Fraid, Même s'il m'est arrivé d'utiliser la méthode donnée plus haut, je ne peux qu'être d'accord avec Didier. J'avais d'ailleurs, à propos de l'utilisation de trans en 3D, démarré ce sujet.
  12. (gile)

    Polyligne en LISP

    Re, Je donnais juste un exemple, tu peux bien sûr choisir les valeurs que tu veux. dans la liste entmake, - pour chaque sommet de la polyligne : (10 [surligneur]0.0 0.0 0.0[/surligneur]) ; les coordonnées x y z que tu veux, ou : (cons 10 [surligneur]pt[/surligneur]) ; où pt est une variable qui contient les coordonnées que tu veux. - pour l'épaisseur constante : (43 . [surligneur]3.0[/surligneur]) ; l'épaisseur que tu veux ou (cons 43 [surligneur]ep[/surligneur]) ; où ep est une variable qui contient l'épaiseur que tu veux. - pour la courbure : (40 . [surligneur]-1.0[/surligneur]) ; la courbure que tu veux, ou : (cons 42 bulge) ; où bulge est une variable qui contient la courbure que tu veux. pour la courbure, le bulge correspond à la tangente du quart de l'angle de l'arc (α sur l'image), le bulge est positif si l'angle de l'arc est décrit dans le sens trigonométrique négatif sinon. http://img55.imageshack.us/img55/5571/sanstitrets4.png
  13. ??????????????? :casstet: :casstet: :casstet: Je ne pense pas qu'il y ait de rapport entre la valeur de OSMODE et le nombre de décimales affichées par (rtos ...) Je comprends que tu aies besoin d'accrochages aux objets pour desssiner ou lors des (getpoint ...). Mais lorsqu'on utilise des (command ...) pour créer des objets graphiques il est quasi impératif de désactiver les accrochages. Tu peux stocker la valeur courante dans une variable locale, désactiver tous les accochages avant de faire les (command ...), puis restaurer la valeur initiale après : (setq os (getvar "osmode")) ; stocker (setvar "osmode" 0) ; désactiver (command ...) (command ...) (setvar "osmode" os) ; restaurer On peut aussi désactiver les accrochages en ajoutant 16384 à la valeur courante. (setvar "osmode" (+ (getvar "osmode") 16384)) ; désactiver (command ...) (command ...) (setvar "osmode" (+ (rem (getvar "osmode") 16384) 16384)) ; restaurer
  14. Des tests plus approfondis ont fait apparaître un dysfonctionnement dans des SCU différents du SCG. SelPline et SelByObj ont été corrigés en conséquence.
  15. Des tests plus poussés ont fait apparaître un dysfonctionnement avec des SCU différents du SCG, le bug est corrigé. Avec SSOC, si on veut exclure du jeu de sélection l'objet ayant servi à le faire, on peut remplacer : (sssetfirst nil (SelByObj (ssname ss 0) "Cp" nil)) par : (sssetfirst nil (ssdel (ssname ss 0) (SelByObj (ssname ss 0) "Cp" nil)))
  16. (gile)

    scu general obligatoire

    Salut, Je ne suis pas géomètre et fait parfois de la modélisation 3D et dans ce cas les changements de SCU sont quasiment incontournables, pour créer des objets 2D sur les faces d'objets 3D, pour faire une cotation lisble d'une vue isométrique ou en prespective ... D'ailleurs dans AutoCAD 2007, plus orienté 3D, il y a un SCU dynamique qui se place automatiquement sur les faces d'objets 3D. Pour faire ça, par exemple, il faut bouger son SCU. [Edité le 4/10/2006 par (gile)]
  17. (gile)

    scu general obligatoire

    Salut, Pour sauvegarder le SCU courant : (command "_.ucs" "_save" "scu_initial") Pour passer en SCG (command "_.ucs" "_world") Pour restaurer le SCU initial (command "_.ucs" "_restore" "scu_initial") Pour l'effacer de la liste des SCU nommés (command "_.ucs" "_delete" "scu_initial")
  18. (gile)

    blocs dynamiques triangle

    Re, Si tu suis la procédure indiquée plus haut, le sommet gauche ne bouge pas et le triangle reste isocèle. http://img91.imageshack.us/img91/1161/trangle1ju8.png http://img169.imageshack.us/img169/2379/trangle3cf4.png
  19. (gile)

    file txt

    Toutes mes excuses, j'avais oublié une[surligneur]ligne de code[/surligneur], j'ai modifié le code plus haut.
  20. (gile)

    file txt

    À partir de ce que tu as commencé : (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 (repeat n ; Répéter pour chaque bloc (setq EL (entget (ssname SS INDEX))) (setq nome (cdr (assoc 2 EL))) ;nom bloc (setq PX (cadr (assoc 10 EL))) ;Posizione x (setq PY (caddr (assoc 10 EL))) ;Posizione y (setq PZ (cadddr (assoc 10 EL))) ;Posizione y (setq SX (cdr (assoc 41 EL))) ; Fattore Scala x (setq SY (cdr (assoc 42 EL))) ; Fattore Scala y (setq SZ (cdr (assoc 43 EL))) ; Fattore Scala z (setq rot (cdr (assoc 50 EL))) ; rotation (setq str (strcat str ; ajout à la chaine précédente nome " " (rtos PX) " " (rtos PY) " " (rtos PZ) " " (rtos SX) " " (rtos SY) " " (rtos SZ) " " (angtos rot) "\n" ; saut de ligne ) ) [surligneur](setq INDEX (1+ INDEX)) ;pour passer au bloc suivant[/surligneur] ) ; 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 4/10/2006 par (gile)]
  21. (gile)

    file txt

    Pour formater ton texte comme tu le demandes : (setq ss (ssget '((0 . "INSERT"))) str "") (if ss (progn (repeat (setq n (sslength ss)) (setq bl (entget (ssname ss (setq n (1- n)))) str (strcat str " " (cdr (assoc 2 bl)) " " (rtos (cadr (assoc 10 bl))) " " (rtos (caddr (assoc 10 bl))) " " (rtos (cadddr (assoc 10 bl))) "\n" ) ) ) (if (setq file (getfiled "Seletionner un fichier" "" "txt" 1)) (progn (setq file (open file "a")) (princ str file) (close file) ) ) ) ) Tu peux, commme suggéré plus haut, remplacer les espaces (" ") par des point-virgules (";") ou des retours à la ligne ("\n")
  22. (gile)

    Rotation de SCU

    Salut, Si ta routine fait ce que tu désires, tu as déjà fais le plus gros. Le reste n'est qu'une question de style, et ça, c'est plus personnel. Pour faire "plus propre", j'essayerais de supprimer le plus de "command" possible, en les remplaçant par des "setvar" : pour : (command "-unites" "2" "2" "3" "2" "0,0" "@0,1" "O") vois les variables ; LUNITS,LUPREC,AUNITS,AUPREC,ANGBASE et ANGDIR. (command "-couleur" "ducalque") -> CECOLOR (command "-typeligne" "a" "ducalque" "") -> CELTYPE
  23. Si tu cheches des reponses pour ODCL tu devrais poster dans le nouveau forum ObjectDCL
  24. (gile)

    blocs dynamiques triangle

    Re, Si tu mets le point d'insertion sur le sommet de gauche, toujours avec un paramètre linéaire sur la base, une action d'étirement sur le sommet de droite et une autre sur le sommet supérieur avec un "Variateur de distance" à 0.5 (attention en spécifiant le "cadre de l'étirement" de ne prendre qu'un sommet à la fois).
  25. (gile)

    Polyligne en LISP

    Il s'agit bien de polylignes 2D (lwpolyline) Essaye ça : (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) ; nombre de sommets '(70 . 0) ; ouverte (0) ou fermée (1) '(43 . 3) ; largeur constante '(10 0.0 0.0 0.0) ; premier sommet '(42 . 0.0) ; courbure '(10 0.0 10.0 0.0) ; deuxième sommet '(42 . -1) ; courbure '(10 10.0 10.0 0.0) ; troisième sommet '(42 . 0.0) ; courbure '(10 10.0 0.0 0.0) ; quatrième sommet ) )
×
×
  • 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é