-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
Il y a effectivement pour certains code de groupe une différence entre les les codes de groupe selon qu'ils s'appliquent aux fichies DXF ou aux applications. Vois l'aide aux développeurs -> Référence DXF -> Format DXF -> Conventions de formatage dans ce manuel d'utilisation et toujours dans Référence DXF -> Section ENTITIES -> LWPOLYLINE.
-
À tout hasard as-tu regardé du côté des Options de mise en page (Menu Outils -> Options d'environnement -> Options de mise en page ...)
-
Salut, Je n'ai jamais eu ce genre de problème avec l'éditeur, alors je sais trop que dire, mais tu peux toujours copier ton code dans le bloc-note et l'imprimer à partir de là.
-
Toutes les lignes en polylignes
(gile) a répondu à un(e) sujet de atchoume dans Pour aller plus loin en LISP
Salut, Une fois toutes les lignes récupéres avec un (ssget "_X" '((0 . "LINE"))), tu peux faire une liste (l_lst) dont chaque élément est aussi une liste contenant le nom d'entité de la ligne et les coordonnées de ses points de départ et de fin. Ensuite faire une boucle pour tester si un autre élément a une extrémité commune avec le premier élément, et si c'est le cas créer une nouvelle liste (sub_lst) avec les coordonnées du premier élément plus la coordonnée de l'élément trouvé qui n'est pas commune au premier et reboucler avec les nouvelles extrémités de la nouvelle liste jusquà ce qu'il n'y ait plus d'autres ligne jointives. Cette liste est la liste des sommets d'une polyligne à créer (avec entmake). On suprime les éléments traités de l_lst et on reboucle avec le nouveau premier élément de l_lst. Les lignes qui ne sont jointives à aucune autre peuvent soit être laissées en l'état, soit transformées en polylignes aussi. La méthode peut sembler tortueuse, c'est celle que j'ai employée dans join_3Dpoly dont tu peux t'inspirer. -
Bravo Esbe ! J'avais mal lu la question, mais si tu t'en es aperçu, c'est que tu n'est pas la "nullisime en LISP" que tu prétend être ;)
-
Extrusion le long d\'une spline3D une arnaque ???
(gile) a répondu à un(e) sujet de culnuteurdebase dans AutoCAD 2007
La commande _SWEEP (ou BALAYAGE en français) est une nouvelle commande d'AutoCAD 2007 qui permet "d'extruder" un objet le long d'une spline 3D ou d'une hélice (novel objet AutoCAD) -
Tramber aussi a "fait l'effort", il y est déjà ceinture jaune ;)
-
Comme je suis très loin de maitriser la langue de Chandler ou Hammett (dont je n'ai lu que des traductions) je me contenterai d'intervenir sur les forums LISP où même si je ne maitrise pas complètement ce langage il pourra servir d'esperanto ;)
-
Bibliothèque de clichés...
(gile) a répondu à un(e) sujet de DenisHen dans Pour aller plus loin en LISP
Je ne me suis pas senti ni offensé ni blessé, je tenais juste à tancer un comportement que je qualifierais "d'enfant gaté", qui rale parcequ'il n'arrive pas tout de suite faire ce qu'il veut, qui attends trop des autres sans être toujours très attentif à leurs réponses. Depuis quelques temps je mets régulièrement dans mes réponses à tes questions des liens vers des réponses que je t'avais déjà données, par exemple je t'avais donné le lien vers Wikipédia ici et le lien vers Aidacd une fois indirectement ici et une autre fois directement là. Je continuerai à t'aider, si je le peux, comme j'essaye d'en aider d'autres, je ne le fais pas non plus pour avoir des remerciements (même si çà fait toujours plaisir) mais parcque çà me plait et que j'y trouve aussi mon compte : expliquer à d'autre ce que l'on a compris (ou que l'on pense avoir compris) permet de structurer sa pensée et d'affiner sa compréhension. Je continuerais à t'aider, donc, mais te recommande aussi grandement de te prendre en main pour essayer de découvrir plus par toi même, comme dit plus haut, on n'apprend jamais aussi bien que quand on comprend par soi même (parole d'autodidacte). -
Salut, Juste une ligne de LISP à copier/coller sur la ligne de commande. (command "_.-block" "MonBloc" '(0.0 0.0 0.0) (ssget "_X" '((0 . "*TEXT") (62 . 12))) "") Tu peux remplacer "MonBloc" par n'importe quel autre nom pourvu que tu le mettes entre guillemets. Tu peux remplacer '(0.0 0.0 0.0) par le point d'insertion que tu veux (respecte toujours la syntaxe : apostrophe, parenthèse ouvrante, X, espace, Y, espace, Z, espace, parenthèse fermante). Telle quelle la routine sélectionne tous les types de texte (textes simples et textes multilignes, pour ne sélectionner que les textes simples remplace "*TEXT" par "TEXT" ou "MTEXT" pour les textes multilignes uniquement. NOTA : seuls les textes sur de calques dévérouillés seront sélectionnés, il faut se mettre dans le SCG avant d lancer la routine.
-
Bibliothèque de clichés...
(gile) a répondu à un(e) sujet de DenisHen dans Pour aller plus loin en LISP
Hé ! On se calme ! Pose toi un peu, essaye de poster tes messages dans le bon sujet, et dans le bon forum ! Il n'est question ni d'égoïsme, ni de loi interdisant de commenter les LISP, il est des habitudes et des façons de faire. Bonuscad (par exemple) disais quelque part avoir du mal à insérer des commentaires dans ses programmes, peut on pour autant le taxer d'égoisme ?! De mon côté il m'arrive de glisser quelques commentaires, mais je n'imagine aucunement mettre une ligne de commentaire (ou plus) par ligne de code, un programme n'est pas une leçon pour débutants. La ligne de code (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget lwpolyline))) était postée dans le forum "Routines LISP" et il y est dit à quoi elle sert, dans un forum "Aller plus loin en LISP", il me semble qu'elle ne mérite pas d'explications outre mesure, et j'ai pris le temps de te la décortiquer ici, en un bonne douzaine de lignes ! Imagine l'allure des programmes, s'il fallait, pour les débutants comme toi, insérer entre 1 et 12 lignes de commentaires par ligne de code ! "Les égoïstes, c'est ceux qui ne pensent pas à moi." -
Salut, Mapcar retourne une liste qui est le résultat de l'exécution d'une fonction dont chaque élément d'une (ou de plusieurs, mais on verra çà plus tard) liste est l'arguments. Avec la fonction cdr, qui retourne une liste sans son premier élément : (cdr '(1 2 3)) -> (2 3) (cdr '(10 1.0 2.0) -> (1.0 2.0) (mapcar 'cdr '((10 1.0 2.0) (10 5.0 7.0) (10 -8.0 6.0))) -> ((1.0 2.0) (5.0 7.0) (-8.0 6.0)) Lambda définit une fonction anonyme (comme defun définit une fonction nommée) (lambda (x) (= (car x) 10)) pourrait être remplacé par MaFonction définie avec un defun : (defun MaFonction (x) (= (car x) 10) ) Et on pourrait écrire (vl-remove-if-not 'MaFonction (entget lwpolyline)) Lambda sert donc à eviter d'avoir à faire un defun. 10 est le code groupe DXF pour les sommets d'une lwpolyligne (pour le point départ d'une ligne, pour le centre d'un cercle ...). Chaque entité AutoCAD a ses données DXF accessibles avec la fonction LISP (entget ...) sous forme de liste dont chaque élément est lui même une liste (ou paire pointée) dont le premier terme est le code de groupe (voir ici). Essaye de faire (entget (car (entsel))) sur une lwpolyligne (ou sur d'autres entités), tu auras la "liste entget" de l'entité. Les références DXF sont détaillées dans l'aide aux dévellopeurs (en français, tu n'as plus d'excuses !)
-
Moi non plus, je ne comprends pas toujours, souvent, je constate, je teste, je tatonne et parfois je trouve sans avoir forcément vraiment compris. J'ai compris que quand on insère un bloc dans une définition de bloc on l'insère par rapport à l'origine (Origin) de cette définition (c'est pour çà qu'il est plus simple de choisir l'origine à (0 0 0)) et dans le plan du SCG. J'ai compris que lors de l'insertion le bloc "enfant" est inséré en conservant la normale (Normal) du SCU courant. C'est pour çà que la première solution proposée était de basculer en SCG pour faire ces opérations sans se poser trop de questions et de restaurer le SCU précédent ensuite. Après tu me fais noter que (vla-put-Normal ... ) modifie la position du point d'insertion par rapport à l'origine et je constate que ce n'est pas le cas si celui-ci est confondu avec l'origine (0 0 0). Là je ne comprends pas (peut-être une sorte de rotation 3D suivant un axe qui ne passerait pas par le point d'insertion ?), mais je trouve une "astuce" en insérant en (0 0 0), changeant la normale du bloc inséré, puis en le déplaçant du (0 0 0) vers le point d'insertion désiré.
-
Ben, oui ! J'apprends en même temps que toi, même si j'ai encore une petite longueur d'avance. Ta remarque est intéressante, je n'avais pas eu le temps de faire des tests approfondis. (vla-put-Normal ... ) semble déplacer le point d'insertion à l'intérieur du bloc "parent". J'ai trouvé une parade (pas très élégante, mais qui semble fonctionner) : insérer le bloc en (0 0 0) faire (vla-put-Normal ... ) puis déplacer le bloc du (0 0 0) à ptB. Sinon, deux petites remarques de "style" (ce ne sont pas des problèmes de fonctionnement) : En incluant la création du bloc "parent" dans Creat_Bloc_Imb, tu l'inclues aussi dans le (repeat ... ), il est possible de créer le bloc "parent" vide avant et de ne répéter que l'insertion/explosion des blocs. Si tu ne récupères pas la liste des entités après explosion, il n'est plus nécessaire de faire : (vlax-safearray->list(vlax-variant-value (vla-explode a))) En tenant compte des remarques ci-dessus, Creat_Bloc_Imb (l'argument Bloc est rajouté puisque défini ailleurs) : (defun Creat_Bloc_Imb (Bloc NomB pt_Base chem Rot / a b) (setq a (vla-insertblock Bloc (vlax-3d-point '(0 0 0)) chem 1 1 1 (/ (* pi Rot) 180) ) ) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vla-move a (vlax-3d-point '(0 0 0)) (vlax-3d-point ptB)) (vla-explode a) (vla-delete a) ) Pourcréer le bloc vide et le "remplir" : (setq Bloc (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point '(0 0 0)) NomB ) w 1 ) (repeat 3 (Creat_Bloc_Imb Bloc NomB ptB NomBloc Rot) (setq ptB (list (+ (car ptB) (* w 2.50)) (+ (cadr ptB) (* w 1.50)) (+ (caddr ptB) 2.00) ) Rot (+ Rot (* w 180)) w (* w -1) ) ) Pour insérer le bloc NomB : (vla-insertblock (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point (trans '(0 0 0) 1 0)) "NomB" 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)) ) )
-
Géomètre, voullez-vous des DA ?
(gile) a répondu à un(e) sujet de DenisHen dans Pour aller plus loin en LISP
Salut, Une rapide recherche dans les forums t'aurais fait voir que le premier sujet du forum "Routines LISP", posté par notre cher webmaster, concernait les sommet d'une lwpolyligne. (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent) ) ) [Edité le 30/5/2006 par (gile)] -
Détacher XREFS imbriqués et réf croisées
(gile) a répondu à un(e) sujet de sergeluc dans Pour aller plus loin en LISP
Encore une petite, pour détacher toutes les Xrefs dont le chemin n'est pas valude : (mapcar '(lambda (x) (setq path (vla-get-Path (vla-item (vla-get-blocks acdoc) x))) (if (not (open path "r")) (vla-detach (vla-item (vla-get-Blocks AcDoc) x)) ) ) lst ) -
La version 2 est ici
-
Salut, La programmation en 3D (SCU non parallèles au SCG) présente des difficultés devant lesquelles même les meilleurs butent. Il faut comprendre la notion de Normale du plan du SCU ou du SCO de certaines entités (ou direction d'extrusion). C'est la propriété Normal en vlisp, ou le code DXF 210 d'une entité, ou encore ce que l'on obtient par (trans '(0 0 1) 1 0 T) pour un SCU (voir ce sujet). C'est un peu plus complexe, avec (vla-InsertBlock ...), si le point d'insertion doit être donné dans le SCG, le bloc est inséré suivant la normale du SCU courant, c'est pourquoi je proposais la méthode consistant à passer en SCG pour l'insertion de blocs dans une définition de bloc (définie, elle, dans le SCG) puis de restaurer le SCU précédent. La méthode n'est pas très élégante, comme je le dis plus haut, mais elle a le mérite de fonctionner. Mais cette discussion m'a donné une idée, de celles dont on se dit "Bon sang, mais c'est bien sûr ! Que n'y avais-je pensé plus tôt !" : modifier ladite propriété Normal des blocs insérés pour éviter le changement de SCU :D (setq a (vla-insertblock Bloc (vlax-3d-point pt) chem 1 1 1 0 ) ) [b](vla-put-Normal a (vlax-3d-point '(0 0 1)))[/b] (foreach b (vlax-safearray->list (vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point '(0 0 0)) (/ (* pi Rot) 180)) ) (vla-delete a) Je te laisse le soin de tester plus en profondeur cette nouvelle méthode et te remercie grandement d'avoir permis à ma lanterne de s'éclairer.
-
Détacher XREFS imbriqués et réf croisées
(gile) a répondu à un(e) sujet de sergeluc dans Pour aller plus loin en LISP
Je suis content de pouvoir t'aider, j'ai ajouté des commentaires au code ci-dessus pour qu'il soit plus facile à comprendre, et, éventuellement, à modifier. -
Dessine un pilier avec ou sans croisillon
(gile) a répondu à un(e) sujet de DenisHen dans Routines LISP
Salut, Pour les variables système, c'est une façon de faire, pas celle que préfère, mais çà marche et c'est l'essentiel ;) Je ne sais pas ce que tu entends par "core", dans mes LISP les invites et les commentaires sont en français (sauf quand, exeptionnellement, je poste sur un site anglo-saxon) mais les commandes et options sont toujours en langage internationnal. Il n'est pas beaucoup plus difficile de comprendre getkword que line ou layer. Voir ce sujet -
Détacher XREFS imbriqués et réf croisées
(gile) a répondu à un(e) sujet de sergeluc dans Pour aller plus loin en LISP
Salut, je ne suis pas sûr de comprendre ce que tu veux faire, mais voici quelques lignes codes qui pourraient te servir. Pour récupérer les "noms" (vla-get-name) des Xrefs dans 3 listes lst : les noms de toutes les Xrefs du dessin lst1 : les noms des Xrefs "parents" (pouvant en contenir d'autres) lst2 : les noms des Xrefs imbriquées dans les Xrefs de lst1 ou dans celles de lst2 (imbrication double ou triple ou plus...), les Xrefs les plus "profondément imbriquées" se trouvant en fin de liste. ;; AcDoc : pointeur vers le document actif ;; ss : sélection de tous les blocs et Xrefs insérés sur les calques dévérouillés (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) ss (ssget "_X" '((0 . "INSERT"))) ) ;; On parcourt le jeu de sélection pour constituer une liste (lst) ;; avec seulement les noms des Xrefs (if ss (progn (repeat (setq n (sslength ss)) (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))) ) (if (and (not (member (vla-get-name obj) lst)) ;_ éviter les doublons (= :vlax-true ;_ uniquement les Xrefs (vla-get-isXref (vla-item (vla-get-Blocks AcDoc) (vla-get-Name obj)) ) ) ) (setq lst (cons (vla-get-name obj) lst ) ) ) ) (setq lst1 lst ;_ on conserve dans lst1 les xref "parents" n_lst 0 ) ;; On parcourt la liste lst et pour chaque Xref, on cherche si ;; dans ces composants il y a une (ou des) Xref. Si ces le cas, ;; elles sont rajoutées en fin de liste et seront traitées à leur tour. (while (setq name (nth n_lst lst)) (setq bloc (vla-item (vla-get-blocks acDoc) name)) (repeat (setq n (vla-get-count bloc)) ;_ nombre de composant du bloc (Xref) (setq ent (vla-item bloc (setq n (1- n)))) (if (and (= (vla-get-ObjectName ent) "AcDbBlockReference") ;_ si le composant est un bloc (not (member (vla-get-name ent) lst)) ;_ s'il n'est pas déjà dans la liste (= :vlax-true ;_ si c'est une Xref (vla-get-isXref (vla-item (vla-get-Blocks AcDoc) (vla-get-Name ent) ) ) ) ) (setq lst (reverse (cons (vla-get-Name ent) (reverse lst))) ;_ la Xref est ajoutée en fin de liste ) ) ) (setq n_lst (1+ n_lst)) ) ) ) ;; Constitution de lst2 : lst moins les éléments contenus dans lst1 (setq lst2 (vl-remove-if '(lambda (x) (member x lst1)) lst)) Si tu veux, par exemple, détacher toutes le Xrefs imbriquées, il faut commencer par les "plus profondément imbriquées". (mapcar '(lambda (x) (vla-detach (vla-item (vla-get-Blocks AcDoc) x)) ) (reverse lst2) ) Attention je n'ai pas testé, j'ai écrit çà à partir de la manière dont je récupère les blocs imbriqués dans Modifier des blocs [Edité le 29/5/2006 par (gile)] -
Déjà la version 2.1 Comme je n'arrive pas à faire suivre les paramètres et propriétés des blocs dynamiques en cas de changement d'échelle du bloc, j'ai ajouté une petite boite de dialogue qui demande confirmation pour les changements d'échelles de ce type de blocs. J'ai aussi réparé un problème avec les noms de certains blocs dynamiques (blocs anonymes) en cas de sélection, j'espère que cette modification ne vas pas perturber le fonctionnementavec les version antérieures aux blocs dynamiques (2006).
-
Tracer un ARC avec pt de départ, rayon et un objet pour la tangente
(gile) a répondu à un(e) sujet de bonuscad dans Routines LISP
Le test que je proposais avec (vlax-curve-getDistAtPoint (vlax-ename->vla-object (car ent)) est nul, le point pourrait être sur un autre segment de la polyligne, il vaut sûrement mieux tester la valeur de dir et la longueur de lst_int les erreurs que j'ai eu. Bonne nuit. -
Merci pour le retour ;) Dans un dessin où le style de tracé serait "nommé" (.stb) la case ne serait pas grisée et la modification accessible. [Edité le 27/5/2006 par (gile)]
-
Tracer un ARC avec pt de départ, rayon et un objet pour la tangente
(gile) a répondu à un(e) sujet de bonuscad dans Routines LISP
Ben oui, et en plus avec accrochage PRO pour être sûr :cool: Je viens d'essayer comme il faut, çà marche :D Il faudrait peut-être faire un test pour les benets comme moi qui choisissent le point de départ sur l'objet de tangence :mad2: (if (vlax-curve-getDistAtPoint (vlax-ename->vla-object (car ent))) (progn (prompt "\nLe point de départ est sur l'objet de tangence, GROS BENET !!!") (exit) )
