Aller au contenu

Titifonky

Membres
  • Compteur de contenus

    125
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Titifonky

  1. Bonjour, J'aimerais savoir s'il existe une fonction VisualLisp qui renvoi la tangente à une courbe (cercle arc ligne splines ...) J'ai vu quelques fonctions tel que (vlax-curve-getParamAtPoint curve-obj point) qui renvoient le parametre d'une courbe en un point mais je ne comprend pas à quoi correspond ce parametre. Si quelq'un aurait une petite idée cela pourrait m'aider Merci
  2. Titifonky

    Les variants

    Bonjour J'essaye en ce moment le langage VisualLisp et j'ai quelques petits problèmes. J'obtient avec la methode IntersectWith un variant. Comment es ce que je peux transformer ce variant en une liste. Tchaoo :P
  3. Ca y est, avec du temps on arrive à tout. J'ai pu faire un petit programme qui me renvoie une liste contenant une suite de ligne et d'arc après avoir selectionné une polyligne. Je n'ai utilisé que des moyens mathématique, je trouve ça plus sur et plus rationel. J'ai regardé un peu la commande Mesurer mais suivant les cas il faut diviser la polyligne en un nombre impressionant de segment, en fonction du plus petit objet appartenant à la polyligne. Si cette routine interesse quelqu'un je l'ai mise à disposition sur le forum Routines Lisp, la routine est un peu longue et je n'ai pas fait beaucoup de commentaire. J'ai essayé la commande IntersectWith mais je ne comprend pas comment je peux extraire les données d'un objet type Variant à partir du Lisp. Si quelqu'un peut m'expliquer ca pourrait me permettre de faire un Lisp plus court. A+
  4. Une routine pour recuperer les entitées composant une polyligne sous forme d'une liste comprenant une suite de ligne et d'arc dans l'ordre de la polyligne d'origine. ;;c:trpoly ;; ;;reçoit liste de données des entites ;;renvoi une liste avec les noms et les info suivantes ;;0 10 42 70 (defun div (listent / firstpoint listpt pts lg newent) (setq listent (vl-remove-if-not '(lambda (x) (or (= 0 (car x)) (= 10 (car x)) (= 42 (car x)) (= 70 (car x)) ) ) listent ) ) (setq listent (list listent)) (setq listent (mapcar '(lambda (x) (cond ((member '(70 . 1) x) (progn (setq firstpoint (list (cadr (member '(70 . 1) x))) ) (setq x (append x firstpoint)) ) ) (t x) ) ) listent ) ) ;;transforme une polyligne en ;;arc et en ligne ;; (mapcar '(lambda (x) (cond ((member '(0 . "LWPOLYLINE") x) (progn (setq listpt (cddr x)) (setq lg (length listpt)) (setq i 0) (while (<= i lg) (setq pts (list (nth i listpt) (nth (1+ i) listpt) (nth (+ 2 i) listpt) ) ) (if (/= (car (nth 2 pts)) nil) (progn (if (= (cdr (nth 1 pts)) 0.0) (progn (setq newent (list (list (cons 0 "LINE") (nth 1 pts) (subst 11 10 (nth 2 pts)) ) ) ) (setq listent (append listent newent)) ) (progn (ptcarc pts) (setq newent (list (list (cons 0 "ARC") (cons 10 ptc) (cons 40 (distance ptc ptc1)) (cons 50 ptc1) (cons 51 ptc2) ) ) ) (setq listent (append listent newent)) ) ) ) ) (setq i (+ i 2)) ) ;;endwhile (setq listent (cdr listent)) ) ;;endprogn ) ;;end test expression (t x) ) ;;endcond ) ;;endlambda listent ) ;;endmapcar ) (defun ptcarc (pts / angl angint1 angint2 angptc listptc delta ptx pty ang dist r1 r2 r s m p a b c d a1 b1 c1 x1 x2 y1 y2 int1 int2 ang ) (setq ptc1 (nth 0 pts) ptc2 (nth 2 pts) ) (setq ptc1 (cdr ptc1) ptc2 (cdr ptc2) r1 (cdr r1) r2 (cdr r2) delta 1.0 test (rtos (abs (cdr (nth 1 pts))) 2 1) ) ;;Angle au sommet de l'arc divisé par deux (setq angl (/ (* (atan (cdr (nth 1 pts))) 4) 2 ) ) ;;Distance entre les deux points (setq dist (/ (distance ptc1 ptc2 ) 2 ) ) ;;Calcul du rayon à partir des données précédentes (setq r1 (/ dist (sin (abs angl))) r2 r1 ) (if (eq test "1") (progn (setq ptx (/ (+ (car ptc2) (car ptc1)) 2) pty (/ (+ (cadr ptc2) (cadr ptc1)) 2) ) (setq ptc (list ptx pty)) ) (progn (setq a (car ptc1) b (cadr ptc1) c (car ptc2) d (cadr ptc2) r r1 s r2 ) (if (= b d) (setq diviseur 1) (setq diviseur (- b d)) ) (setq m (/ (- (+ (expt a 2) (expt b 2)) (expt c 2) (expt d 2) ) (* 2 diviseur) ) ) (setq p (/ (- a c) diviseur)) (setq a1 (+ 1 (expt p 2))) (setq b1 (- (* 2 b p) (* 2 m p) (* 2 a)) ) (setq c1 (- (+ (expt a 2) (expt b 2) (expt m 2) ) (expt r 2) (* 2 b m) ) ) (setq delta (- (expt b1 2) (* 4 a1 c1))) (setq x1 (/ (- (* b1 -1) (sqrt delta)) (float (* 2 a1)) ) ) (setq x2 (/ (+ (* b1 -1) (sqrt delta)) (float (* 2 a1)) ) ) (setq y1 (- m (* x1 p))) (setq y2 (- m (* x2 p))) (setq int1 (list x1 y1) int2 (list x2 y2) ) (setq ang (cdr (nth 1 pts))) (setq angint1 (angle ptc1 int1) angint2 (angle ptc1 int2) angptc (angle ptc1 ptc2) ) (setq angint1 (atof (angtos (- angint1 angptc) 3 6) ) angint2 (atof (angtos (- angint2 angptc) 3 6) ) ) (if (< angint1 angint2) (setq listptc (list 'int2 'int1)) (setq listptc (list 'int1 'int2)) ) (if (> (* (abs angl) 2) pi) (setq listptc (reverse listptc)) ) (if (> ang 0) (setq ptc (eval (cadr listptc))) (setq ptc (eval (car listptc))) ) ) ) ) (defun c:trpoly () (setvar "flatland" 0) (setq nomobj (car (entsel "\nSelectionnez la Polyligne :"))) (setq entdata (div (entget nomobj))) (princ entdata) (prin1 "Nombre d'objets :") (prin1 (length entdata)) ) [Edité le 15/3/2005 par Titifonky]
  5. En fait mon probleme maintenant est de trouver le centre d'un arc à partir des données contenus dans une LWPOLYLINE, c'est à dire: -le point de depart, -le point d'arrivé, -la tangente du quart de l'angle de l'arc en radian, quand il est négatif l'arc tourne dans le sens inverse des aiguilles d'une montre quand il est positif dans le sens trigonométrique Pour le moment j'arrive à trouver par des moyens mathématiques le rayon (c'est dur mais on y arrive), je trouve les deux centres possibles de l'arc de cercle par intersection de deux cercle, mais je n'arrive pas à determiner quel point est le centre du cercle. Dans tout les cas il existe une solution mathématique au problème, il ne reste plus qu'a la trouver. Pour la commande (osnap), j'essaye de ne pas l'utiliser parcque j'ai peur qu'elle ne trouve pas tout le temps les intersections. Quand je dessine, j'ai quelques fois des problèmes avec les accrochages au objets. Par exemple, je n'arrive pas à accrocher le centre d'un arc de cercle sur un polyligne, je ne sais pas d'ou cela peut venir mais j'espere que ça n'influence pas également la commande (osnap), c'est pour ça que j'evite de l'utiliser pour une meilleur compatibilité. La solution pour transformer une polyligne en suite de lignes et d'arc serait peut-être de decomposer la polyligne au début du programme et de la recomposer à la fin mais je n'ai pas encore essayé. Pour le moment, mon programme me permet de diviser un arc, un cercle ou une ligne par ces memes objets. C'est pour ça que j'essaye de decomposer une polyligne en arc et en ligne, cela me permet d'utiliser les mêmes routines. Pour ce qui est du VLA, j'ai du mal à trouver des informations sur les différentes commandes qui existent et la commande IntersectWith n'est pas reconu sous AutoCAD 2000i, pas de chance je travail avec cette version. J'ai eu quelques aperçu par Didier du VBA sous AutoCAD et je pense que c'est un langage un peut plus compliqué quand on est pas habitué au langage orienté objet mais les possibilités sont énormes. Je ne sais pas ce que vous en pensé mais je me pose la question sur l'interêt de programmer en Lisp ou en VisualLisp vue que le VBA est universel. Sinon à pars ça tout va bien et Cadxp c'est super :D
  6. Je viens également de faire un petit programme pour nettoyer les groupes vides ou ne contenant qu'une seule entité (defun c:pgp () (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq dictgroup (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) dictgroup ) ) ) (setq i 0) (while (< i (length dictgroup)) (setq groupdf (entget (nth i dictgroup))) (if (or (= 71 (car (last groupdf))) (<= (length (member (assoc 340 groupdf) groupdf)) 1) ) (entdel (nth i dictgroup)) ) (setq i (1+ i)) ) ) J'en ai fais encore trois autres qui permettent d'enlever ou d'ajouter une entité ou de supprimer plusieurs groupes Supprime les groupes selectionnés (defun c:dg () ;;creer un jeu de selection (setq selection (ssget) i 0 ) (while (< i (sslength selection)) ;;recherche le numero du groupe (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget (ssname selection i)) ) ) ) ;;test si groupnumero n'est pas nil (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (entdel groupnumero) ) ) ) (setq i (1+ i)) ) ) Ajoute une ou plusieurs entités à un groupe (defun addgroup (group /) (princ "\nSelectionnez les objets à ajouter au groupe :") (setq selectionset (ssget) i 0 ) (while (< i (sslength selectionset)) (isgroup (ssname selectionset i)) (if (not is) (progn (setq entname (list (cons 340 (ssname selectionset i)))) (setq group (entmod (append group entname))) ) (princ "\nLes groupes selectionné ne sont pas ajouté au groupe de reference" ) ) (setq i (1+ i)) ) ) (defun isgroup (numeroent /) (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget numeroent) ) ) ) (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (setq is T) (setq is nil) ) ) (setq is nil) ) ) (defun c:ag () (setq selectiongroup (car (entsel "\nSelectionnez le groupe de reference :") ) ) (isgroup selectiongroup) (setq group groupdef) (if is (addgroup group) (progn (princ "\nCe n'est pas un groupe") ) ) ) Enleve une ou plusieurs entités aux goupes auquels elles appartienent (defun isgroup (numeroent /) (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget numeroent) ) ) ) (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (setq is T) (setq is nil) ) ) (setq is nil) ) ) (defun purggroup () (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq dictgroup (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) dictgroup ) ) ) (setq i 0) (while (< i (length dictgroup)) (setq groupdf (entget (nth i dictgroup))) (if (or (= 71 (car (last groupdf))) (<= (length (member (assoc 340 groupdf) groupdf)) 1) ) (entdel (nth i dictgroup)) ) (setq i (1+ i)) ) ) (defun c:rg () (setq pick (getvar "PICKSTYLE")) (setvar "PICKSTYLE" 0) (princ "\nSelectionnez les objets à enlever du groupe :") (setq selectionset (ssget) i 0 ) (while (< i (sslength selectionset)) (isgroup (ssname selectionset i)) (if is (progn (setq entname (cons 340 (ssname selectionset i))) (entmod (vl-remove entname groupdef)) ) ) (setq i (1+ i)) ) (purggroup) (setvar "PICKSTYLE" pick) ) Je ne sais pas si c'est le bon endroit pour les mettre à disposition mais dans tout les cas je remercie tout ceux qui on pu m'aider à les créer.
  7. Salut, C'est sympa te reponse en VBA . J'ai essayé de le faire également mais comme je suis pas un pro du VBA j'ai pas reussi. Avec cette exemple je vais pouvoir commencer. En fait je me pose la question si le Lisp est vraiment interessant par rapport au VBA . J'ai remarqué que le langage est un peu plus complexe mais les possibilités sont énormes. Et en plus c'est toujours compatible parcqu'avec le Lisp c'est pas toujours facile entre les versions. Merci
  8. :P Tu peut faire comme ça (defun c:rect () (setq ptinsertion (getpoint "\nDonner le point d'insertion :")) (setq pt (list (+ (getreal "\nDonner la largeur :") (car ptinsertion)) (+ (getreal "\nDonner la hauteur :") (cadr ptinsertion)) ) ) (command "rectangle" ptinsertion pt) ) je sais pas si c'est la meilleur façon mais ça marche Sinon tu peut utiliser la fonction @ en ligne de commande ex: tu pointe le premier point du rectangle, quand AutoCAD te demande le deuxième point tu entre au clavier @X,Y et il prend le dernier point entré comme reference. :D
  9. Je te remercie pour l'adresse de ce site, il est très interessant. J'ai essayé la commande VisualLisp "vla-IntersectWith" mais elle n'est pas detecté par ma version d'autocad, j'ai autocad 2000i. Dans l'editeur VisualLisp la fonction n'est pas en bleu mais reste en noir. :casstet: Je ne sais pas d'ou ca vient mais dans tout les cas si je pouvais utiliser cette fonction cela arrangerais tout mes problèmes.
  10. Bonjour, Es-ce que quelqu'un connait un petit programme Lisp qui permet de diviser un objet par un autre. Exemple: - Je selectionne un objet à couper, ligne, arc, cercle, polyligne - Je selectionne les objets coupants, lignes, arcs, cercles, polylignes - L'objet à couper est sectionné à chaques intersections entre l'objet à couper et les objets coupants J'ai déjà essayé de faire un petit programme mais je rame un peu (je ne suis pas un pros des algorithmes). J'ai determiné les equations pour trouver les intersections entre deux cercles, entre deux lignes, mais je n'arrive pas à transformer une LWPOLYLINE en suite d'arcs et de lignes. C'est surtout les arcs qui me posent problème. Je n'ais pas de solution simple pour trouver le centre des arc. Pour le moment je trouve le rayon et les deux positions possibles du centre de l'arc à partir des equations pour trouver les intersections entre deux cercles mais je n'arrive pas à choisir le centre de l'arc entre les deux points que je trouve. Si quelqu'un aurait une solution moins compliqué cela m'arrangerait. J'aurais également besoin d'un avis sur la structure général du programme. ;) Merci
  11. Salut, J'ai cherché encore sur l'aide et je suis tombé sur une phrase interessante qui dit: "Code 42: Courbure (facultatif ; valeur par défaut 0). La courbure est la tangente d'un quart de l'angle inclus dans un segment d'arc, rendu négatif si l'arc est dans le sens horaire, du point de départ au point final. Une courbure de 0 désigne un segment droit et une courbure de 1 désigne un demi-cercle" Traduction : Pour connaitre l'angle au centre de l'arc en radian il faut faire (* (atan (courbure)) 4) et on obtient l'angle de l'arc en radiant. Avec ça on peut tout faire. [Edité le 2/3/2005 par Titifonky]
  12. Titifonky

    format DXF

    Salut, Utilise l'outil "Coupe", tu devra spécifier le plan par 3 points et tu obtiendras la coupe de l'objet sous forme de ligne, d'arc ou de polyligne. Ne confond pas avec l'outil "Section" qui coupe un objet en deux parties.
  13. Salut, J'aimerais bien savoir comment retrouver le centre d'un arc contenu dans une LWPOLYLINE J'ai regardé la définition d'une LWPOLYLINE, on trouve les sommets (10) mais aucune donnée tel que le centre ou le rayon quand elle contient des arc. Et à quoi correspond l'indice (42), j'ai regardé dans l'aide et je trouve Courbure de la ligne. Comment est exprimé cette courbure? :casstet: Merci
  14. Salut Patrick; On va dire que c'est extra-simplifié et ca permet de comprendre très rapidement le code, le mien est un petit peu plus brouillon. En fait, si je suis passé par la fonction (dictsearch) pour trouver le nom du groupe, c'est que la première que j'ai essayé de supprimer un groupe en utilisant son nom dans la définition de l'objet, j'ai eu une reponse du style "type d'argument incorrect", allez savoir pourquoi. A partir de là, j'ai essayé de trouver une autre solution. Dans tout les cas, cette recherche m'a permis de comprendre d'autres fonctions que je ne connaissais pas et donc n'utilisais pas tel que (mapcar) (lambda) (foreach) (progn). Ton programme est super, il me permet de comprendre comment optimiser le code. Merci.
  15. J'aimerais avoir vos critiques sur ce premier Lisp que je viens de créer après quelques heures de dur labeur. Ce Lisp me permet de decomposer les groupes à partir d'une selection sur l'écran. (defun c:dg () (setq i 0) (setq nosgroup '(nil)) (setq namesel (ssget)) (setq lgsel (sslength namesel)) (while (< i lgsel) (setq entdef (entget (ssname namesel i))) (if (equal '(102 . "{ACAD_REACTORS") (assoc 102 entdef)) (progn (setq groupno (assoc 330 entdef)) (if (not (member groupno nosgroup)) (progn (setq nosgroup (subst groupno 'nil nosgroup)) (setq nosgroup (cons 'nil nosgroup)) ) ) ) ) (setq i (+ 1 i)) ) (setq nosgroup (cdr nosgroup)) (setq nosgroupc (mapcar '(lambda (x) (cons 350 (cdr x))) nosgroup)) (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq nomdic (cdar dictgroup)) (setq lgnosgroupc (length nosgroupc)) (setq lgdict (length dictgroup)) (setq i 0) (while (< i lgnosgroupc) (setq pos (- lgdict (+ 1 (length (member (nth i nosgroupc) dictgroup))))) (setq nomgroup (nth pos dictgroup)) (entdel (cdr (assoc -1 (dictsearch nomdic (cdr nomgroup))))) (setq i (+ 1 i)) ) ) A+ et j'espere aussi que patrick sera content ;)
  16. ca y est j'ai trouvé, Il faut utiliser la fonction (dictsearch ([nom du dictionnaire des entités acad_group] )) "[nom du groupe] ") pour obtenir la définition d'un groupe. Pour le supprimer, il ne reste plus qu'a utiliser (entdel ([nom du groupe indice -1] ))
  17. Bonjour, Je voudrai savoir comment il faut faire pour supprimer un groupe à partir du Lisp. Je n'arrive pas à comprendre où sont stockés les informations sur les groupes et comment les modifier. La seule commande que je connais pour récuperer les noms des groupes est (dictsearch (namedobjdict) "acad_group"). Quelles sont les autres symboles tel que "acad_group" que l'on peut utiliser et coment modifier ces noms ? Merci
  18. Je te remercie beaucoup Serge, c'est exactement le resultat que j'attendais. C'est dommage que mes connaissance ne me permettent pas de comprendre l'inrtegralité du code mais je vais me pencher dessus. J'aurai aimé savoir où tu a appris à manipuler toutes ces commandes qui ne sont pas aussi bien expliqué sur les sites internet que j'ai trouvé.
  19. Bonjour Serge, j'ai essayé d'analyser ton programme mais mes connaissances sont trop faibles pour tout comprendre. Je n'arrive pas à trouver de solutions pour modifier les propriétés d'un groupe à partir du Lisp. Existe-il un livre assez complet où le fonctionnement de la base de donnée d'un dessin est expliqué parce que je suis toujours à la recherche de ces informations. J'ai essayé d'utiliser le nom que je recupère à partir de ton programme pour l'inserer dans la commande "-groupe" avec la commande lisp "command"-groupe" " mais cela ne fonctionne pas. Acad demende de taper un nom alors que celui que je recupere s'affiche avec des parenthèses à l'écran. Je me demande si ce ne serait pas plus simple de modifier les propriétés directement dans la base de donnée du dessin mais comment ? J'ai essayé de chercher ou était stocké ces infos mais je n'ai pas trouvé. Si tu a quelques connaissances dans ce domaine, elles seraient les bienvenue Merci Titifonky
  20. Merci beaucoup pour la reponse, je vais voir ce que je peut faire avec. ;)
  21. Bonjour, Je voudrais essayer de créer un icone qui me permettrait de rendre un goupe selectionnable ou non en le selectionnant directement sur le dessin. La commande groupe ne permet pas de selectionner le groupe sur le dessin auquel on veut changer la propriété "selectionnable", il faut le nommer et les symboles de remplacement tels que "# * ? " ne fonctionnent pas. Je voudrais créer une commande Lisp qui me permettrait de retrouver le nom d'un groupe à partir de la selection d'un objet sur le dessin mais je ne sais pas comment Autocad gére les propriétés des groupes et où il les stock. Si quelqu'un aurait une petit idée sur ce sujet cela m'interesserai. Merci :)
  22. Salut, en fait je parlais de la commande "grouper" qui associe un nom au hasard. Si je passe par la commande "grouper" generale, autocad me demande toujours le nom du groupe et sa description. Je voulais savoir s'il existe toujours la commande "grouper" comme sous acadlt 2002 mais dans la version AutoCAD 2002 sans passer par le lisp. Si elle n'existe plus il ne me restera qu'a la créer. :thumbup:
  23. Bonjour, Je voudrais savoir s'il y a la possibilité de créer les commandes "grouper" "dissocier" d' autocad lt2002 dans autocad 2002. Elles sont très pratiques et la commande d'autocad 2002 avec sa fenêtre c'est trop long à utiliser. Merci :calim:
  24. Je vous remercie beaucoup pour vos reponses. Je me doutais un peu du résultat puisque j'avais déjà fais ma petite recherche, mais j'ai tout de même demander. On ne sais jamais etant donné que je ne programme pas tout les jours. :thumbup:
  25. Bonjour ,je suis un utilisateur d'autocad 2002 et j'essaye d'approfondir le langage lisp. Je voudrais savoir s'il existe une commande autre que "entget" pour connaitre toutes les propriétés d'un objet comme dans la fenêtre propriétés: le point de départ, le point d'arrivé, la longeur, le rayon, etc.. La fonction entget ne donne pas toutes les propriétés tel la longeur, etc... Merci d'avance ;)
×
×
  • 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é