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. On ne peut pas vraiment dire que tu utilises .NET dans le code que tu montres. La méthode SendStringToExecute() ne fait qu'entrer une chaîne de caractère en ligne commande pour l'exécuter (comme une macro ou un script). Tu pourrais essayer avec SendCommand(), mais je pense que le résultat sera le même. Si tu veux que la commande puisse être rappelée avec Entrée comme une commande native, il faut que tu traduises ton code VBA en .NET pour l'inclure dans la méthode décorée avec CommandMethod (tu pourras ainsi exploiter la puissance de .NET). PS: Si tu veux te lancer dans l'aventure .NET, choisis C# comme langage plutôt que VB, tu trouveras plus d'exemples (et souvent de meilleure qualité) et, de l'aveu même de Microsoft, C# continuera à évoluer quand VB devrait juste être maintenu en l'état.
  2. (gile)

    Courbe de visibilité

    Salut, (defun c:courbeVisib (/ tan p0 p1 x y n ix iy pts a) (defun tan (a) (/ (sin a) (cos a))) (if (and (setq p1 (getpoint "\nSpécifiez le premier point de vue: ")) (setq p0 (getpoint p1 "\nSpécifiez le point cible: ")) (setq iy (getdist p1 "\nSpécifiez le décalage en hauteur (y): ")) (setq ix (getdist "\nSpécifiez la largeur des rangs (x): ")) ) (progn (or (tblsearch "LAYER" "VISIBILITE_DROITE") (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "VISIBILITE_DROITE") (70 . 0) (62 . 1) (6 . "Continuous") ) ) ) (or (tblsearch "LAYER" "VISIBILITE_COURBE") (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "VISIBILITE_COURBE") (70 . 0) (62 . 3) (6 . "Continuous") ) ) ) (initget 7) (setq n (getint "\nEntrez le nombre de rangs: ")) (setq pts (list p1)) (setq ix (if (minusp (- (car p1) (car p0))) (- (abs ix)) (abs ix) ) iy (abs iy) ) (repeat n (setq a (angle p0 (list (car p1) (+ (cadr p1) iy))) x (+ (car p1) ix) p1 (list x (+ (cadr p0) (* (tan a) (- x (car p0))))) pts (cons p1 pts) ) ) (entmakex (vl-list* (cons 0 "SPLINE") (cons 100 "AcDbEntity") (cons 8 "VISIBILITE_COURBE") (cons 100 "AcDbSpline") (cons 71 (length pts)) (mapcar '(lambda (p) (cons 11 p)) pts) ) ) (foreach p pts (entmakex (list (cons 0 "LINE") (cons 10 (trans p 1 0)) (cons 11 (trans p0 1 0)) (cons 8 "VISIBILITE_DROITE") ) ) ) ) ) (princ) )
  3. (gile)

    Lisps de gile

    Salut, J'imagine que tu veux dire restaurer le SCG. (mapcar '(lambda (f v) (eval (list 'defun f nil (list 'command "_.view" v "_.ucs" "_world") '(princ) ) ) ) '(c:0 c:1 c:2 c:3 c:4 c:5 c:6 c:7 c:8 c:9) '("_bottom" "_swiso" "_front" "_seiso" "_left" "_top" "_right" "_nwiso" "_back" "_neiso" ) )
  4. (gile)

    Lisp calcul bas ortho

    Salut, (defun c:BASE_ORTHO (/ a b x y c) (if (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) ) (while (and (setq x (getreal "\nAbscisse: ")) (setq y (getreal "\nOrdonnée: ")) ) (setq c (polar a (+ (angle a B) (atan (- y) x)) (sqrt (+ (* x x) (* y y))) ) ) (command "_point" "_non" c) ) ) (princ) ) Encore une fois, pour faire ça sans LISP, il suffit de lancer la commande SCU (_UCS) pour définir un SCU correspondant à ta base orthogonale, puis de lancer la commande point en spécifiant les points par "abscisse, ordonnée". Commande: SCU Nom du SCU courant: *GENERAL* Spécifiez l'origine du SCU ou [Face/NOMmé/OBjet/Précédent/Vue/Général/X/Y/Z/axEZ] : cliquer sur A Spécifiez un point sur l'axe X ou : cliquer sur B Spécifiez un point sur le plan XY ou : cliquer un point à droite du vecteur AB Commande: POINT Modes point courants: PDMODE=2 PDSIZE=0.0000 Spécifiez un point: entrer : abscisse,ordonnée
  5. (gile)

    Lisp calcul bas ortho

    Avec les matrices (pour le fun) ;) ;; MXV ;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky- (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) ;; TRP ;; Transpose une matrice -Doug Wilson- (defun trp (m) (apply 'mapcar (cons 'list m))) ;; ROTMAT ;; Retourne la matrice de rotation 2D (defun rotmat (ang) (list (list (cos ang) (- (sin ang))) (list (sin ang) (cos ang)) ) ) ;; Applique la matrice de transformation et le déplacement au point (defun transform (pt mat disp) (mapcar '+ (mxv mat pt) disp) ) ;; Obtenir le point dans le SCU courant (defun c:FOO (/ a b x y c) (if (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) (setq x (getreal "\nAbscisse: ")) (setq y (getreal "\nOrdonnée: ")) ) (progn (setq c (transform (list x (- y)) (rotmat (angle a B)) a)) (command "_point" "_non" c) (terpri) (princ c) ) ) (princ) ) ;; Obtenir l'abscisse et l'ordonnée du point spécifié (defun c:BAR (/ a b m v c) (if (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) ) (progn (setq m (trp (rotmat (angle a B))) v (mapcar '- (mxv m a)) ) (while (setq c (getpoint "\nPoint C: ")) (setq c (transform c m v)) (princ (strcat "\nAbscisse: " (rtos (car c)) " Ordonnée: " (rtos (- (cadr c))) ) ) ) ) ) )
  6. (gile)

    Lisp calcul bas ortho

    Ce n'est pas sûr du tout que tu te sois trompé, j'ai répondu en premier dans le même sens. Il faut dire que la demande est quelque peu confuse...
  7. (gile)

    Lisp calcul bas ortho

    Ah oui, on peut aussi le faire dans l'autre sens (comme bonuscad). Mais si, comme il semble, on est en 2D, la trigonométrie suffit, on peut se passer des matrices. (defun c:MY_REF (/ a b c d e) (if (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) (not (equal a b 1e-9)) ) (while (setq c (getpoint "\nPoint C: ")) (setq d (distance a c) e (- (angle a B) (angle a c)) ) (princ (strcat "\nAbscisse: " (rtos (* d (cos e))) " YOrdonnée: " (rtos (* d (- (sin e)))) ) ) ) ) (princ) )
  8. (gile)

    Lisp calcul bas ortho

    Je n'avais effectivement rien compris. À mon avis, le plus simple serait, sans LISP, de lancer la commande SCU (_UCS) spécifier les points A (origine) et B (point sur l'axe X) puis un point à droite du segment AB (axe X). Sinon, en LISP : (defun c:test1 (/ a b x y c) (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) (setq x (getreal "\nAbscisse: ")) (setq y (getreal "\nOrdonnée: ")) (setq c (polar (polar a (angle a B) x) (+ (angle a B) (* pi 0.5)) (- y) ) ) (command "_point" "_non" c) ) (princ) ) ou, plus directement : (defun c:test2 (/ a b x y c) (and (setq a (getpoint "\nPoint A: ")) (setq b (getpoint a "\nPoint B: ")) (setq x (getreal "\nAbscisse: ")) (setq y (getreal "\nOrdonnée: ")) (setq c (polar a (+ (angle a B) (atan (- y) x)) (sqrt (+ (* x x) (* y y))) ) ) (command "_point" "_non" c) ) (princ) )
  9. (defun c:cut ( / p cir) (command "_circle" (setq p (getpoint)) pause) (setq cir (entlast)) (command "_trim" cir "" p "") (entdel cir) )
  10. (gile)

    Lisp calcul bas ortho

    Salut, C'est pas très clair... Si tu veux un point C tel que le segment AC soit perpendiculaire au segment AB dans le plan XY, ça n'est pas trop compliqué. Pour faire faire une rotation anti-horaire de 90° à un vecteur 2D de coordonnées (X, Y) il suffit de créer un vecteur de coordonnées (-Y, X). Pour trouver le point C, on va calculer les coordonnées du vecteur de A à B, puis soustraire la coordonnées Y de ce vecteur à la coordonnées X de A et ajouter la coordonnées X du vecteur à la coordonnées Y de A. (and (setq A (getpoint "\nPoint A: ")) (setq B (getpoint A "\nPoint B: ")) (setq C (list (- (car A) (- (cadr B) (cadr A))) ; xA - yAB (+ (cadr A) (- (car B) (car A))) ; yA + xAB ) ) (command "_.line" "_non" B "_non" A "_non" C "") )
  11. (gile)

    Nouveau Site Perso

    Holà!... Il semble qu'aujourd'hui le Dieu, ce soit plutôt un célèbre chanteur de rock, qu'il repose en paix (il en a certainement bien besoin je peux en témoigner, il se donnait sans compter). Je n'ai fait qu'émettre quelques remarques que j'ai noté en parcourant le considérable travail de didier. Critiquer ce travail est une tache bien aisé surtout quand il s'agit de relever des "coquilles", mais je le fait pour "aider". J'avais apprécié les remarques de certains (je les remercie encore) quand j'ai publié "Introduction à AutoLISP". Je n'attends ni compliment (même si ça me touche), ni que ces remarques soient effectivement suivies d'effet ; didier, tu en fais absolument ce que tu veux (poubelle ou intégration dans le site), ces remarques (comme celles que je pourrais faire plus tard) sont "gratuites", free diraient les anglo-saxons.
  12. (gile)

    Nouveau Site Perso

    Salut, Tout d'abord un grand bravo pour ta constance et ta pugnacité. Juste quelques remarques. En ce qui concerne la forme, j'ai noté plusieurs petits défauts dans le formatage de la rubrique "arguments" (sauts de ligne, caractères gras). À part ça, j'ai pu noter (jusqu'à la rubrique "Les angles") quelques bourdes, imprécisions, oublis, etc. que je me permets de livrer ici avec aussi quelques suggestions. Entiers et rééls Je pense qu'il y a une erreur dans l'exemple : Remarque personnelle : Si AutoLISP convertit implicitement les entiers en réels quand la valeur doit être réelle, c'est une bonne habitude que de spécifier explicitement les nombre réels (ça évite à l'interpréteur une opération de conversion de type et ça rend le code plus explicite). Par exemple, il est préférable d'écrire : (setq normal '(0.0 0.0 1.0))ou : (setq normal '(0. 0. 1.)) ; écriture tolérée pour les réels : 1. pour 1.0plutôt que : (setq normal '(0 0 1)) LOG Astuce : logarithme décimal : (defun log10 (x) (/ (log x) (log 10.0)) EGAL Fonctionne aussi avec des arguments de type SYM (= (type "toto") 'STR) EQ Attention Pour AutoLISP, "identique" signifie : "se réfère à la même adresse en mémoire". Exemple avec une liste: (setq a '(1 2 3) b a c '(1 2 3)) (eq a B) ; => T (eq a c) ; => nil (eq b c) ; => nil EQUAL Compare le contenu des listes sans tenir compte de "l'adresse en mémoire" (setq a '(1 2 3) b a c '(1 2 3)) (equal a B) ; => T (equal a c) ; => T (equal b c) ; => T DIFFÉRENT DE Fonctionne aussi avec des arguments de type SYM (/= (type "42") 'INT) AND et OR Évaluation de "court-circuit" (short-circuit evaluation). (and a b c) retourne nil (parce que b est nil) et arrête là l'évaluation (c n'est pas évalué). TYPE Il existe aussi le type VL-CATCH-ALL-APPLY-ERROR (non-documenté). Exemple : (type (vl-catch-all-apply '/ '(1 10))) ATOF Rubrique manquante ??? DISTOF Pour les chaîne qui n'utilisent pas les symboles des pieds (') ou des pouces (\"), il n'est pas nécessaire de spécifier explicitement l'unité. (distof "1.23E01") ; => 12.3 (distof "12 1/2") ; => 12.5Ceci explique pourquoi les fractions entières sont acceptées par Autocad en réponse à une invite pour une distance. Les angles dans AutoLISP Il faut lire : PI au lieu de PI/2 en magenta dans l'image expliquant les radians ATAN Il faudrait dire : "Appelée avec un seul argument, cette fonction ne renvoie ..."Avec deux arguments, atan considère les signes des valeurs des sinus et cosinus pour déterminer la quadrant de l'angle (alors exprimé entre 0 et 2*PI). (atan 1. 1.) ; => 0.785398 comme (atan 1.) (atan -1. -1.) ; => -2.35619 pourtant -1. / -1. = 1. (atan -1. 1.) ; => -0.785398 comme (atan -1.) (atan 1. -1.) ; => 2.35619 pourtant 1. / -1. = -1.
  13. Salut, Mes préférences pour récupérer une (ou des) valeur(s) d'attribut. blk = ename d'une référence de bloc tag = étiquette de l'attribut 1. Pour la valeur d'un seul attribut Ma préférée depuis A2012, la plus concise (et la plus rapide) : (getproprtyvalue blk tag) L'utilisation d'une boucle while avec entnext permet de sortir de la boucle dès que l'étiquette est trouvée. (defun getAttrib (blk tag / elst val) (setq elst (entget (entnext blk))) (while (and (= (cdr (assoc 0 elst)) "ATTRIB") (not val)) (if (= (cdr (assoc 2 elst)) tag) (setq val (cdr (assoc 1 elst))) (setq elst (entget (entnext (cdr (assoc -1 elst))))) ) ) val ) L'utilisation de la méthode COM GetAttributes oblige à parcourir toute la collection d'attributs (defun getAttrib (blk tag / val) (foreach att (vlax-invoke (vlax-ename->vla-object blk) 'GetAttributes) (if (= (vla-get-TagString att) tag) (setq val (vla-get-TextString att)) ) ) val ) 1. Pour les valeurs de tous les attributs J'aime bien récupérer les valeurs sous la forme d'une liste de paires pointées (étiquette . valeur) qui sera facilement utilisable ensuite avec assoc. Dans ce cas, l'utilisation de Visual LISP fait gagner en concision, le choix d'utiliser AutoLISP ou Visual LISP est en général guidé par le type de l'objet bloc. Si blk est un ENAME : (defun getAttribs (blk / elst result) (setq elst (entget (entnext blk))) (while (= (cdr (assoc 0 elst)) "ATTRIB") (setq result (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst)) ) result ) elst (entget (entnext (cdr (assoc -1 elst)))) ) ) result ) Si blk est un VLA-OBJECT (defun getAttribs (blk / result) (foreach att (vlax-invoke blk 'GetAttributes) (setq result (cons (cons (vla-get-TagString att) (vla-get-TextString att) ) result ) ) ) )
  14. Pour être sûr d'être dans un onglet "présentation" et en espace papier, CVPORT = 1 suffit. Dans l'onglet Objet CVPORT est toujours supérieur à 1.
  15. Salut, Attention, TILEMODE c'est pour l'onglet Objet. Dans une présentation, c'est CVPORT qui renseigne si on est dans l'espace papier (1) ou dans l'espace objet d'une fenêtre (> 1).
  16. Salut, À tout hasard, vérifie la couleur des objets (lignes, textes) dans le style de cote (DuCalque, Dubloc ou autre).
  17. (gile)

    [Resolu] Sélection d'objets

    Salut, +1 avec didier.
  18. Tu as probablement raté mon dernier message.
  19. Avec un champ : (defun c:sef (/ ent) (vl-load-com) (if (setq ent (entsel)) (progn (command "_leader" (cadr ent) pause "" "foo" "") (vla-put-TextString (vlax-ename->vla-object (entlast)) (strcat "%<\\AcObjProp Object(%<\\_ObjId " (vla-GetObjectIdString (vla-get-Utility (vla-get-Activedocument (vlax-get-acad-object))) (vlax-ename->vla-object (car ent)) :vlax-false ) ">%).Layer>%" ) ) ) ) (princ) )
  20. Salut, Un LISP minimaliste sans champ : (defun c:sef (/ ent) (if (setq ent (entsel)) (command "_leader" (cadr ent) pause "" (cdr (assoc 8 (entget (car ent)))) "") ) (princ) )
  21. "~*|*" est un modèle utilisant les caractères génériques qui signifie : toutes les chaînes qui ne contiennent pas de barre verticale (|).
  22. (gile)

    Extraire le nom d'une XREF

    Salut, Non, pas d'Express Tools sur LT.
  23. Salut, Exceptionnellement je me permettrait de ne pas être complètement d'accord avec lecrabe ;) Si le problème c'est bien la vitesse d'exécution d'un rendu, c'est justement un des très rares cas où AutoCAD utilise le multi-core.
  24. (gile)

    POLYLINE EN LISP

    Salut, Le plus simple avec un listing de points dans Excel est de créer un script AutoCAD en utilisant la fonction CONCATENER d'Excel.
  25. Un autre LISP qui devrait être plus proche de la demande initiale : il dessine un arc parabolique d'équation réduite y=(1/2a)x² entre deux points. ;; Dessine un arc parabolique entre deux points ;; Équation réduite : y=(1/2a)x² (où a est le paramètre spécifié) (defun c:parachainette (/ p1 p2 pa) (setq pa (vlax-ldata-get "GILE_CURVE" "ParamParabole" 1000.)) (if (and (setq p1 (getpoint "\nPoint de départ: ")) (setq p2 (getpoint p1 "\nPoint de fin: ")) ) (progn (setq pa (cond ((getdist p1 (strcat "\nParamètre <" (rtos pa) ">: "))) (T pa) ) ) (vlax-ldata-put "GILE_CURVE" "ParamParabole" pa) (make_parabola p1 p2 (/ 1. (* 2 pa))) ) ) (princ) ) ;; make_parabola ;; Dessine une spline en arc parabolique entre deux points. ;; Retourne le nom d'entité de la spline. ;; ;; Arguments ;; p1 : point de départ (SCU courant) ;; p2 : point de fin (SCU courant) ;; pa : paramètre a de la parabole dans l'équation réduite : y = ax² (defun make_parabola (p1 p2 pa / x1 y1 x2 y2 dx p3) (setq x1 (car p1) y1 (cadr p1) x2 (car p2) y2 (cadr p2) dx (/ (+ y1 (- y2) (* pa (- (* x2 x2) (* x1 x1)))) (* 2. pa (- x1 x2)) ) p3 (inters p1 (mapcar '+ p1 (list 1. (* 2. pa (+ x1 dx)))) p2 (mapcar '+ p2 (list 1. (* 2. pa (+ x2 dx)))) nil ) ) (entmakex (list (cons 0 "SPLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbSpline") (cons 71 2) (cons 72 6) (cons 73 3) (cons 74 0) (cons 40 0.0) (cons 40 0.0) (cons 40 0.0) (cons 40 1.0) (cons 40 1.0) (cons 40 1.0) (cons 10 (trans p1 1 0)) (cons 10 (trans p3 1 0)) (cons 10 (trans p2 1 0)) ) ) )
×
×
  • 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é