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. J'ai amélioré les deux routines, elles fonctionnent désormais pour tous les objets (point,bloc,cercle et lignes,polylignes) contenus dans le plan XY du SCU courant quelque soit l'orientation 3D de ce SCU par rapport au SCG. Je recommande donc d'utiliser ces dernières versions plutôt que les anciennes.
  2. Sinon, en LISP, une réponse ici
  3. (gile)

    Où est mon angle ?

    Oui, si comme dit plus haut tu uilises la fonctions (command ...) pour laquelle les arguments sont les mêmes que ceux entrés au clavier.
  4. Salut lecrabe, Oui, j'ai bien compris la même chose et la routine crée une ligne depuis le point d'insertion d'un bloc, le point graphique ou le centre d'un cercle jusqu'au point le plus proche des lignes/polylignes dans le rayon donné (soit la projection perpendiculaire sur la ligne/polyligne soit son extrémité).
  5. (gile)

    Où est mon angle ?

    Salut, (vlax-ldata-put "Phalene" "AngSCU" val) stocke la valeur val que tu lui donnes , et (vlax-ldata-get "Phalene" "AngSCU") te retourne cette valeur. (angle p1 p2) retourne un angle en radian. AutoCAD fait tous les calculs en radians, c'est uniquement lors de la saisie de donnée par l'utilisateur avec (getangle ...) ou (getorient ...) et du passage d'arguments à la fonction (command ...) que sont utilisées les unités angulaires définies dans AUNITS. Si tu veux stocker un angle en grades, tu peux le convertir quand tu le passes comme argument à vlax_put_ldata : (vlax-ldata-put "Phalene" "AngSCU" [surligneur] (* 200 (/ (angle p1 p2) pi))[/surligneur]) Sinon, tu fais toutes tes opérations en radians, jusqu'à ce que tu aies besoin de convertir l'angle en grades, à savoir pour le passer comme argument de la fonction command : (command "_-mtext" "_none" p1 "j" Just "h" 1 "_r" [surligneur] (* 200 (/ rot pi))[/surligneur] "_w" "0.00" Texte "" )
  6. En l'état, les deux routines devraient fonctionner en 2D (tous les objets dans le plan du SCU courant). Pour un fonctionnement en 3D (quelque soit le SCU courant) il faut que je rajoute des tests, ce qui demande de jongler avec les système de coordonées : le SCU courant, le SCG et les SCO des objets 2D (cercle, bloc et polylignes). J'essaye de voir ça dans la journée.
  7. Salut, Si tu as une version pleine, en LISP : (startapp "C:\\Program Files\\Internet Explorer\\iexplore.exe" "http://www.cadxp.com")
  8. Avec 2 points de référence, la commande ALIGNER (_ALIGN) permet d'orienter et de mettre à l'échelle.
  9. Il me semble que la demande de fabcad n'est pas tout à fait la même. La routine ci-dessus déplace les extrémités des objets sélectionnés dans le rayon spécifié sur le point, point d'insertion ou centre, ce qui, si j'ai bien compris, répond à la première demande. S'il s'agit de raccorder les entités sélectionnées au point, point d'insertion ou centre de l'objet avec une autre ligne, c'est plutôt cela : Nouvelle version (11/10/06) ;;; RAC_OB Raccorde les objets (ligne, polyligne spline) située ;;; en deçà d'une distance spécifiée au centre, point d'insertion, ou point ;;; du cercle, bloc point sélectionné. (defun c:rac_ob (/ dist ent elst ucszdir elev cen circle ss nlst) (initget 7) (setq dist (getdist "\nSpécifiez le rayon du cercle d'accrochage: ")) (while (setq ent (car (entsel))) (setq elst (entget ent)) (if (member (cdr (assoc 0 elst)) '("CIRCLE" "POINT" "INSERT")) (progn (setq ucszdir (trans '(0 0 1) 1 0 T) elev (caddr (trans (getvar "ucsorg") 0 ucszdir)) ) (if (= (cdr (assoc 0 elst)) "POINT") (setq cen (trans (cdr (assoc 10 elst)) 0 ucszdir)) (setq cen (trans (cdr (assoc 10 elst)) ent ucszdir)) ) (if (equal (caddr cen) elev 1e-9) (progn (entmake (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 dist) (cons 210 ucszdir) ) ) (setq circle (entlast)) (setq ss (SelByObj circle "CP" '((0 . "LINE,LWPOLYLINE")) ) ) (if ss (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (setq nlst (entget n)) (if (or (and (= (cdr (assoc 0 nlst)) "LINE") (equal (caddr (trans (cdr (assoc 10 nlst)) 0 ucszdir)) elev 1e-9 ) (equal (caddr (trans (cdr (assoc 11 nlst)) 0 ucszdir)) elev 1e-9 ) ) (and (= (cdr (assoc 0 (entget n))) "LWPOLYLINE") (equal (cdr (assoc 210 nlst)) ucszdir 1e-9) (equal (cdr (assoc 38 nlst)) elev 1e-9) ) ) (entmake (list '(0 . "LINE") (cons 10 (trans cen ucszdir 0)) (cons 11 (vlax-curve-getClosestPointTo (vlax-ename->vla-object n) (trans cen ucszdir 0) ) ) ) ) ) ) ) (entdel circle) ) (alert "\nL'objet sélectionné n'est pas\ndans le plan XY du SCU." ) ) ) (alert "\nL'objet sélectionné n'est pas\nun point, un cercle ou un bloc." ) ) ) (princ) ) ;;; 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 / dist n lst prec dist p_lst) (vl-load-com) (if (= (type ent) 'ENAME) (setq ent (vlax-ename->vla-object ent)) ) (cond ((member (vla-get-ObjectName ent) '("AcDbCircle" "AcDbEllipse") ) (setq dist (/ (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent) ) 50 ) n 0 ) (repeat 50 (setq lst (cons (trans (vlax-curve-getPointAtDist ent (* 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 ent (trans (cdaddr p_lst) ent 0) ) (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent) ) ) (vlax-curve-getDistAtPoint ent (trans (cdar p_lst) ent 0) ) ) prec ) n 0 ) (repeat (1- prec) (setq lst (append lst (list (trans (vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent (trans (cdar p_lst) ent 0) ) (* dist (setq n (1+ n))) ) ) 0 1 ) ) ) ) ) ) ) (setq p_lst (cddr p_lst)) ) ) ) (ssget (strcat "_" opt) lst fltr) ) [Edité le 11/10/2006 par (gile)]
  10. Il y avait une petite erreur sur le code DXF de l'extrémité de fin des lignes, toutes mes excuses à ceux qui avaient déjà copié le code. Réparée le 10/10/06 à 22h50.
  11. (gile)

    répertoire à concerver

    Salut, Pour AutoCAD, le (ou les) fichier(s) .CUI utilisé(s) lors de personnalisations de l'interface, les fichier de gabarit .DWT que tu as créé, les fichiers .ARG si tu as créé et enregistré des profils utilisateurs, les fichiers .PGP, .LIN, .PAT, .MNL ... que tu as modifié, Les dossier que tu as rajouté dans le chemin de recherche.
  12. (gile)

    Je souhaite m\'orienter en 3D

    Pourquoi ne pas utiliser la barre d'outils "Vues" ? Pour faire agir une commande en tapant une seule lettre on utilise les "alias"m mais les alias ne peuvent comporter qu'un seul mot, donc pas d'options possibles ... Un moyen possible serait de créer un nom de commande pour chaque vue désirée en faisant une petite routine LISP. Exemple, 3 petits LISP pour les vues de gauche, face et dessus, à copier/coller dans ton fichier AutoCAD.mnl (defun c:x () (command "_.view" "_O" "_L") (princ)) (defun c:y () (command "_.view" "_O" "_F") (princ)) Mais pour Z, problème c'est l'alias de la commande ZOOM, tu peux faire ZZ (defun c:zz () (command "_.view" "_O" "_T") (princ))
  13. Voilà, je pense que ça répond à ta demande, ça fonctionne avec des lignes, des polylignes optimisées et aussi avec des splines (je n'avais pas vu ta réponse). Nouvelle version (11/10/06) ;;; AC_OB Accroche l'extémité des objets (ligne, polyligne spline) située ;;; en deçà d'une distances spécifiée au centre, point d'insertion, ou point ;;; du cercle bloc point sélectionné. (defun c:ac_ob (/ dist ent elst ucszdir elev cen circle ss nlst pt_lst) (initget 7) (setq dist (getdist "\nSpécifiez le rayon du cercle d'acrrochage: ")) (while (setq ent (car (entsel))) (setq elst (entget ent)) (if (member (cdr (assoc 0 elst)) '("CIRCLE" "POINT" "INSERT")) (progn (setq ucszdir (trans '(0 0 1) 1 0 T) elev (caddr (trans (getvar "ucsorg") 0 ucszdir)) ) (if (= (cdr (assoc 0 elst)) "POINT") (setq cen (trans (cdr (assoc 10 elst)) 0 ucszdir)) (setq cen (trans (cdr (assoc 10 elst)) ent ucszdir)) ) (if (equal (caddr cen) elev 1e-9) (progn (entmake (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 dist) (cons 210 ucszdir) ) ) (setq circle (entlast)) (setq ss (SelByObj circle "CP" '((0 . "LINE,LWPOLYLINE"))) ) (if ss (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (setq nlst (entget n)) (cond ((and (= (cdr (assoc 0 nlst)) "LINE") (equal (caddr (trans (cdr (assoc 10 nlst)) 0 ucszdir)) elev 1e-9 ) (equal (caddr (trans (cdr (assoc 11 nlst)) 0 ucszdir)) elev 1e-9 ) ) (if ( cen (trans (cdr (assoc 10 nlst)) 0 ucszdir) ) dist ) (entmod (subst (cons 10 (trans cen ucszdir 0)) (assoc 10 nlst) (entget n) ) ) ) (if ( cen (trans (cdr (assoc 11 nlst)) 0 ucszdir) ) dist ) (entmod (subst (cons 11 (trans cen ucszdir 0)) (assoc 11 nlst) (entget n) ) ) ) ) ((and (= (cdr (assoc 0 (entget n))) "LWPOLYLINE") (equal (cdr (assoc 210 nlst)) ucszdir 1e-9) (equal (cdr (assoc 38 nlst)) elev 1e-9) ) (setq pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) nlst ) ) ) (if ( (entmod (subst (cons 10 (list (car cen) (cadr cen))) (assoc 10 nlst) nlst ) ) ) (if ( (entmod (subst (cons 10 (list (car cen) (cadr cen))) (assoc 10 (reverse nlst)) nlst ) ) ) ) ) ) ) (entdel circle) ) (alert "\nL'objet sélectionné n'est pas\ndans le plan XY du SCU." ) ) ) (alert "\nL'objet sélectionné n'est pas\nun point, un cecle ou un bloc." ) ) ) (princ) ) ;;; 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 / dist n lst prec dist p_lst) (vl-load-com) (if (= (type ent) 'ENAME) (setq ent (vlax-ename->vla-object ent)) ) (cond ((member (vla-get-ObjectName ent) '("AcDbCircle" "AcDbEllipse") ) (setq dist (/ (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent) ) 50 ) n 0 ) (repeat 50 (setq lst (cons (trans (vlax-curve-getPointAtDist ent (* 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 ent (trans (cdaddr p_lst) ent 0) ) (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent) ) ) (vlax-curve-getDistAtPoint ent (trans (cdar p_lst) ent 0) ) ) prec ) n 0 ) (repeat (1- prec) (setq lst (append lst (list (trans (vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent (trans (cdar p_lst) ent 0) ) (* dist (setq n (1+ n))) ) ) 0 1 ) ) ) ) ) ) ) (setq p_lst (cddr p_lst)) ) ) ) (ssget (strcat "_" opt) lst fltr) ) [Edité le 10/10/2006 par (gile)] [Edité le 11/10/2006 par (gile)]
  14. (gile)

    Où est mon angle ?

    Salut Deleligne, ou devrais-je dire DenisH ? Debuguer un code écrit par un autre n'est pas toujours une chose agréable, le tien est particulièrement confus et tu le sais. Tu aurais pu/dû le nettoyer un minimum avant de demander à d'autres de mettre leur nez dedans. Je ne peux, en l'état comprendre, ce que tu veux faire avec ces LISP. Donc, juste en regardant de loin, j'ai remarqué l'expression : (setq AnSc (+ (* 200 (/ (angle p1 p2) pi) (/ pi 2)))) qui me semble très curieuse, la fonction + ne sert à rien, et si elle servait comme on peut l'imaginer, pour ajouter (* 200 (/ (angle p1 p2) pi)) à (/ pi 2) cela reviendrait à ajouter des grades à des radians.
  15. Salut lecrabe, Pourrais-tu préciser, le type d'entité des fils, pour simplifier le code ?
  16. (gile)

    *super purge*

    Je t'avais un peu oublié. J'ai modifié xref_purge (version 1.2) , il me semble qu'il ne plante plus s'il y a des xrefs imbriquées dans le dessin. J'espère que ça répond à ton problème.
  17. (gile)

    SCO et 3D

    La direction d'extrusion ou vecteur normal du plan XY, c'est les coordonnées du vecteur de norme (longueur) 1 perpendiculaire au plan XY : le vecteur directeur de l'axe Z. Exemple : 0,0,1 pour le SCG et tous les systèmes de coordonnées (SCU, SCO) dont le plan XY est parallèle au plan XY du SCG. http://img45.imageshack.us/img45/5272/normale2to1.png
  18. (gile)

    SCO et 3D

    La rotation dont je parle là correspond à celle retournée par l'expression (cdr (assoc 50 (entget ent))) ou (vla-get-Rotation obj) sur un bloc ou un texte par exemple. Elle est donnée par rapport à l'axe X du SCO, dans le plan XY de l'objet dont la normale ou direction d'extrusion (axe Z du SCO) est retournée par (cdr (assoc 210 (entget ent))) ou (vlax-get obj 'Normal). Ces deux données, avec le calcul du SCO par "l'algorithme d'axe arbitraire", décrivent de manière non-équivoque l'orientation du bloc dans l'espace. Cette orientation peut être décrite en terme de rotations successives sur les axes X, Y et Z du SCG (c'était la demande de ingoenius).
  19. Salut, si tu veux ganer en précision sans changer la valeur de AUPRC, et gagner aussi en précision pour le point d'insertion, tu peux remplacer : (rtos (car ins)) " " (rtos (cadr ins)) " " (rtos (caddr ins)) " " (angtos rotX) " " (angtos rotY) " " (angtos rotZ) " " par : (rtos (car ins) 2 14) " " (rtos (cadr ins) 2 14) " " (rtos (caddr ins) 2 14) " " (angtos rotX 0 14) " " (angtos rotY 0 14) " " (angtos rotZ 0 14) " " et tu auras 14 décimales.
  20. (gile)

    SCO et 3D

    Merci, Maître des réacteurs :red: Je pense être encore loin de tout maîtriser, mais, comme beaucoup, je découvre, j'apprends, je partage... Sur ce coup là, je dois à Ingoenius d'avoir posé une sacrée question et à Bonuscad d'avoir, dans le même sujet, donné une super piste.
  21. Avec la fonction (command ...), suivant les valeurs de APERTURE et de zoom, si les coordonnées d'un point se trouvent être proche d'un accrochage actif c'est l'accochage qui prime (comme quand OSNAPCOORD est à 0). C'est pourquoi l'utilisation de cette fonction pour créer des entités graphique nécessite de désactiver les accrochages.
  22. (gile)

    SCO et 3D

    Petites précisions en image sur le SCO (j'aurais peut-être du commencer par ça) Soit un bloc inséré dans un SCU 3D (non parallèle au SCG) dont le plan XY est le plan (P). Le bloc est inséré en 0,0,0 avec une rotation nulle. http://img47.imageshack.us/img47/1379/sco2qb3.png AutoCAD calcule le SCO du bloc à partir de sa direction d'extrusion (axe Z du SCU) à l'aide de l'algorithme d'axe arbitraire. - L'origine du SCO est confondue avec celle du SCG. - La rotation (code DXF 50) est l'angle que fait l'objet (bloc, texte ...) avec la parallèle à l'axe X du SCO. - La coordonnée Z du point d'insertion (code DXF 10 des blocs, cercles, textes ,...) ou l'élévation (code DXF 38 des polylignes) est la distance sur l'axe Z du SCO entre l'origine et l'intersection avec le plan de l'objet. En rouge, le SCO, en blanc l'icône du SCG. http://img116.imageshack.us/img116/2463/sco1tq4.png
  23. (gile)

    polilygne avec vb

    Tu peux utiliser Xs.to ou Imageshack. Un exemple en image avec Imageshack ici.
  24. (gile)

    SCO et 3D

    Regardons un peu plus avant, Soit un vecteur unitaire zdir, si on calcule le SCO de ce vecteur avec la fonction sco, le résultat, une liste de 3 éléments ayant chacun 3 éléments est une matrice de dimension 3 X 3. (setq mat (sco zdir)) Si maintenant on applique cette matrice à un vecteur vec quelconque, avec la fonction mxv ci-dessous, le résultat sera un vecteur qui est la transformation de vec par la matrice, le même qu'on obtient avec la fonction AutoLISP trans. ;; Applique une matrice de transformation à un vecteur by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (row) (vxv row v)) m) ) (setq vec '(10 20 30)) par exemple (mxv mat vec) retourne le même résultat que (trans vec 0 zdir) Inversement, si on transpose la matrice avec la fonction trp : ;; transpose une matrice Doug Wilson (defun trp (m) (apply 'mapcar (cons 'list m)) ) (mxv (trp mat) vec) retourne le même résultat que (trans vec zdir 0) Le propos n'est pas ici de trouver un autre moyen pour faire ce que fait très bien la fonction trans, mais de comprendre comment elle fonctionne (et par là de comprendre un petit peu mieux comment fonctionne AutoCAD). Je pense que le calcul utilisé par trans est similaire à celui fait ci-dessus, le calcul matriciel (et vectoriel) étant un moyen de ramener à des opérations sur les nombres les fonctions linéaires (déplacement, rotations ...). Edit/ajout : Inversement, on peut utiliser la fonction trans pour obtenir le même résultat qu'avec la fonction SCO : (mapcar '(lambda (v) (trans v zdir 0)) '((1 0 0) (0 1 0) (0 0 1))) [Edité le 29/3/2007 par (gile)]
  25. (gile)

    SCO et 3D

    Suite à un échange avec BonusCAD (ici) j'ai essayé de creuser un peu la question des SCO. Plusieurs entités 2D ont leurs coordonnées définies dans le SCO (Système de Coordonnées de l'Objet) telles que cercle, arc, solide, trace, texte, attribut, définition d'attribut, forme, insertion, polyligne 2D, sommet 2D, polyligne étroite, hachures, image. Le SCO ne correspond pas forcément au SCU courant lors de la création de l'objet. Ce système de coordonnées est calculé dans AutoCAD de manière "arbitraire mais homogène" à partir de la direction d'extrusion de l'objet (code DXF 210) ou vecteur normal du plan XY du système de coordonnées. Pour ce calcul, AutoCAD utilise "l'algorithme d'axe arbitraire" : Citation extraite de l'aide aux développeurs >> Référence DXF >> Concepts DXF avancés. Voici donc une petite routine, inspirée de celle donnée par Bonuscad dans le sujet cité plus haut. L'argument est un vecteur dont le vecteur unitaire sera l'axe Z du système de coordonnées calculé. La routine retourne une liste contenant les coordonnées des axes X, Y et Z. Cette liste pourra être utiliser pour l'élaboration de matrices. ;;; SCO Retourne la liste des coordonnées des vecteurs X Y et Z ;;; définis à partir d'un vecteur "zdir" par l'algorithme d'axe arbitraire (defun sco (zdir / xdir) (or (= 1.0 (distance '(0 0 0) zdir)) (setq zdir (vunit zdir)) ) (if (and ( ( ) (setq xdir (vunit (v^v '(0 1 0) zdir))) (setq xdir (vunit (v^v '(0 0 1) zdir))) ) (list xdir (vunit (v^v zdir xdir)) zdir) ) ;; V^V ;; Retourne le produit vectoriel (vecteur) de deux vecteurs ;; ;; Arguments : deux vecteurs (defun v^v (v1 v2) (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2))) (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2))) (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2))) ) ) ;; VUNIT ;; Retourne le vecteur unitaire d'un vecteur ;; ;; Argument : un vecteur (defun vunit (v) ((lambda (l) (if (/= 0 l) (mapcar (function (lambda (x) (/ x l))) v) ) ) (distance '(0 0 0) v) ) ) NOTA : cette routine utilise des routines de calculs vectoriels extraites de ce sujet que j'ai remis à jour à cette occasion.[Edité le 8/10/2006 par (gile)][Edité le 11/10/2006 par (gile)]
×
×
  • 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é