-
Compteur de contenus
1 489 -
Inscription
-
Dernière visite
-
Jours gagnés
19
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par zebulon_
-
Merci pour les éclaircissements c'est bien ce qui m'embête dans mon cas. J'ai remarqué que les attributs de type "multiligne" se mettent à jour tout seuls, contrairement aux attributs classiques. Je suppose donc que pour les premiers il y a un réacteur qui se met en route pour modifier l'affichage de l'attribut en fonction de l'expression de champ et que pour les deuxièmes il n'y en a pas. Et comme je ne sais pas de quel réacteur il s'agit, ni quelle méthode il met en branle je me retrouve le bec dans l'eau. Amicalement Vincent
-
Au fin fond... J'ai un peu du mal à suivre tant le cheminement est complexe. J'ai toutefois une question concernant la ligne (vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent) Si j'ai bien suivi, ent contient des codes de ce style En quoi c'est intéressant d'analyser la paire (1 . "_text") ? Si on peut se contenter d'analyser la paire de code 2, on pourrait éviter les boucles foreach et while et ne faire qu'un (setq ent (subst (cons 2 (vl-string-subst ...)) (assoc 2 ent) ent))) Dernière question : la valeur se met-elle à jour toute seule ou bien cela nécessite un regen ? Amicalement Vincent [Edité le 26/3/2010 par zebulon_]
-
Bonjour, rajouter la fonction (defun getPolySegs (ent / entl p1 pt bulge seg ptlst) (cond (ent (setq entl (entget ent)) ;; save start point if polyline is closed (if (= (logand (cdr (assoc 70 entl)) 1) 1) (setq p1 (cdr (assoc 10 entl))) ) ;; run thru entity list to collect list of segments (while (setq entl (member (assoc 10 entl) entl)) ;; if segment then add to list (if (and pt bulge) (setq seg (list pt bulge)) ) ;; save next point and bulge (setq pt (cdr (assoc 10 entl)) bulge (cdr (assoc 42 entl)) ) ;; if segment is build then add last point to segment ;; and add segment to list (if seg (setq seg (append seg (list pt)) ptlst (cons seg ptlst)) ) ;; reduce list and clear temporary segment (setq entl (cdr entl) seg nil ) ) ) ) ;; if polyline is closed then add closing segment to list (if p1 (setq ptlst (cons (list pt bulge p1) ptlst))) ;; reverse and return list of segments (reverse ptlst) ) qui ne marche cependant pas pour les polylignes splinées. Et changer la fin du lisp WavePline en quelque chose du style : (setq Blg 1.) (setq cnt 0) (setq pl (car (entsel))) (setq lseg (getpolysegs pl)) (foreach seg lseg (setq EntList (DivideDistance (car seg) (caddr seg) (* Dist Sc))) (setq cnt (1+ cnt)) ) (entmake (subst (cons 90 cnt) '(90 . 2) (reverse EntList))) (princ) Amicalement Vincent
-
Uniquement pour la présentation courante... Pas mieux que le (vla-regen AcDoc acAllViewports), donc. 2 remarques : - quand les attributs sont de type "multilignes", la mise à jour se fait toute seule - j'ai essayé la chose suivant, en sélectionnant un attribut simple (setq e (vlax-ename->vla-object (car (nentsel)))) (vla-put-textstring e "%<\\AcVar Filename \\f \"%tc3%fn2\">%") et j'ai droit à ####. Il y a bien une méthode update applicable à un attribut mais (vla-update e), contrairement à ce que j'espérais, ne fait rien. Amicalement Vincent
-
une solution que nous devons à bonuscad. J'y suis un tout petit peu pour quelque chose, c'est pour ça que je m'en souviens ;) Concernant les champs dans les attributs, je cherche l'équivalent de "Mettre à jour le champ" pour que la bonne valeur s'affiche et non pas ####. Pour ce qui est de FIELDEVAL, je ne connaissais pas, mais il est à la valeur 31 donc tous les bits à 1. Amicalement Vincent [Edité le 23/3/2010 par zebulon_]
-
Bonjour, C'est exactement vers quoi je voulais aller. Les soucis avec (getfieldcode) sont : - le fait que pour certains champs, il est possible de sélectionner un objet. La boite de dialogue devrait se fermer pour cliquer sur un objet. Il n'en est rien et je pense qu'une des boucle while n'a plus de condition d'arrêt - il faut que les boites de dialogue DCL soient fermées quand on exécute (getfieldcode), sinon ça part en vrille et on se retrouve gravement planté. Un autre soucis, concernant les attributs. Une fois que j'ai mis à jour l'attribut avec le code de champ, cela m'affiche une série de ####. C'est à dire que l'attribut nécessite une mise à jour préalable avant de s'afficher correctement. J'ai essayé avec un (vla-regen AcDoc acAllViewports), mais cela ne marche que sur la présentation courante. Les éventuels attributs qui ont été modifiés sur d'autres présentations ne sont pas mis à jour. J'ai déposé battval modifié au même endroit. Amicalement Vincent
-
En fait, pour ce qui concerne les champs, je pensais faire lancer la commande champ par le lisp, faire écrire le champ dans un coin du fichier, en récupérer sa définition et la coller dans l'attribut. Voilà mon idée générale. Je ne sais pas si c'est possible ... Amicalement Vincent
-
En fait, il n'y en a pas sur le fond. Seule la forme change. Battval est présenté comme Battman et présente plus d'informations à l'écran que MAT et fait suite à cette discussion. MAT et Battval permettent de "propager" une valeur d'attribut à l'ensemble des attributs de tous les blocs de même nom. Amicalement Vincent
-
Ce n'est pas parce que je n'aime pas : on ne peut pas ne pas aimer ce qu'on ne connait pas (hou là, c'est un peu lourd comme phrase). Donc, comme je ne suis pas réactionnaire, je m'y suis intéressé et, quand on utilise vlisp, c'est effectivement bien mieux d'éviter les vlax-ename->vla-object à tout bout de champ. Merci pour le tuyau. Pour les champs, c'est dommage qu'il n'y ait pas une combine ... C'était un exercice intéressant pour voir que les possibilités en DCL (Désuet Comme Langage) sont, malgré tout, importantes : tabulation dans une list_box (tabs et tabs_truncate), possibilité de double-cliquer dans la list_box (allow_accept = true qui renvoie directement sur le bouton is_default : c'est pour cette raison que mon bouton ok n'est pas is_default et que je n'ai pas pu me servir du ok_cancel; prédéfini) Cela reste ringard, quand même... et ce n'est pas Tramber qui va nous dire le contraire Amicalement Vincent [Edité le 19/3/2010 par zebulon_]
-
Bonjour, à partir du lisp MAT de Patrick_35, j'ai étudié la possibilité de modifier des valeurs d'attributs pour un ensemble de blocs avec attributs. J'ai appelé ce lisp battval. Ce que j'aimerai rajouter, c'est la possibilité de saisir un champ. Y a-t-il en lisp une fonction qui permet d'avoir la boite de dialogue de la commande CHAMP et qui renvoie le texte formaté correspondant ? Un peu comme (acad_colordlg ...) ou (acad_truecolordlg ...) qui renvoient la couleur choisie par l'utilisateur. Amicalement Vincent
-
Modifier valeurs attributs des cartouches
zebulon_ a répondu à un(e) sujet de zebulon_ dans AutoCAD 2010
Salut, avec une présentation du genre de celle de battman et en gérant les attributs multiples. Je vais voir ce que je peux faire de mon côté. Amicalement Vincent -
Bonjour, Je fais très souvent des plans de ferraillage et les fichiers dwg correspondants contiennent le plan et la nomenclature qui va avec. Le plan est sur une présentation (A0 ou A1) avec son cartouche et ses attributs. La nomenclature est sur autant de présentations A4 qu'il y a de pages de nomenclature, dont une présentation A4 pour le cartouche de la nomenclature. Donc, j'ai 2 cartouches (des blocs de même nom) sur 2 présentations différentes avec pratiquement les mêmes valeurs dans leurs attributs. Jusqu'à présent, lorsqu'un plan était indicé, j'allais dans le cartouche du plan et je changeais ses attributs (indice, nom du dessinateur ...) et, comme un bourrin, je changeais de présentation pour aller dans le cartouche de la nomenclature pour y faire les mêmes modifications. Or, tout le monde sait qu'il est très con de faire 2 fois la même chose, surtout en informatique. L'idée est simplement d'utiliser la fenêtre de propriété des blocs pour modifier tout les attributs identiques en une seule saisie. J'ai donc lancé la commande PROPRIETES, j'ai cliqué sur le bouton "sélection rapide" pour sélectionner dans le dessin entier tous les blocs dont le nom est CART. Malheureusement, la sélection rapide ne sélectionne pas dans le dessin entier mais uniquement dans la présentation courante, puisque le jeu de sélection ne contient qu'un cartouche et pas les 2. Mauvaise pioche, donc. Toujours avec la commande PROPRIETES, j'ai cliqué sur le bouton "sélection des objets" qui me permets de procéder à un "choix des objets", mais je ne peux pas changer de présentation en cours de sélection. J'ai donc utilisé le ssget du lisp et là, miracle, j'ai les 2 cartouches sélectionnés et je peux changer leurs attributs avec la fenêtre propriétés en une seule saisie... sauf les attributs multilignes (pas moyen de saisir quelque chose dans ce cas) Avez-vous une idée comment procéder ? Amicalement Vincent
-
Non ! C'est l'inverse qu'il faut faire comme je l'indique plus haut. Amicalement Vincent
-
Bonjour, en rattachant la xref 2 fois et en faisant un xdelim différent pour chaque référence. Amicalement Vincent
-
Bonjour philous2, lorsque tu écris subst c: c:\ tu essayes de substituer le nom de lecteur c: au répertoire racine de c:. Forcément, c'est le serpent qui se mange la queue et il n'y a aucune chance que cela fonctionne. Pour substituer c: à la racine de i:, il faut taper subst c: i:\ pour associer un chemin qui existe (i:\) à un lecteur qui n'existe pas (c:) Amicalement Vincent
-
(command "_-layer" "_freeze" "*" "") Amicalement Vincent
-
Si, bien sûr. La seule chose, c'est que l'utilisateur se donne du mal à définir des modes d'accrochage dont il a besoin. Puis, il lance un lisp qui lui met OSMODE à 0 et il est bon pour se retaper la définition de ses accrochages aux objets. Forcément, il ne va pas être content... Si tu veux jouer avec la variable OSMODE plutôt que les "_non" comme ci dessus, il faut le faire de la manière suivante : (defun c:mafonction () (setq OLDOS (getvar "OSMODE")) ;; mettre de côté la valeur courante (setvar "OSMODE" 0) ;; pas d'accrochage aux objets (command ...) (command ...) ... (setvar "OSMODE" OLDOS) ;; remettre comme au début ) Si tu fais une gestion d'erreur (mais je crois qu'on n'en est pas encore là), il faut aussi y rajouter le rétablissement de la variable OSMODE pour faire tout à fait propre. Amicalement Vincent
-
Bonjour Laurent, Pourquoi ne pas charger ces types de lignes une fois pour toute dans ton fichier dwt ? Du coup, tu évites de te prendre la tête avec un bouton récalcitrant. Amicalement Vincent
-
Bonjour, (setq ab(fix(/ b 20))) (setq abc(/ (- b (* ab 20)) 2 )) (if (= abc 0) ;_ expression test (progn ;; alors (command "deplacer" "106,438" "103,440" "" "0,0" "10,0" ) ;;sinon (command "deplacer" "106,438" "103,440" "" "0,0" (list abc 0)) ) ) Quand tu souhaites déposer un code, mets le entre 2 balises de code (le bouton # dans la barre d'outils), comme ci-dessus. Ce sera plus lisible. Il y a tout d'abord un soucis avec le if : malgré les commentaires que tu as rajouté les 2 (command "deplacer" ...) s'exécutent quand l'expression test est vrai. Lorsqu'elle est fausse, rien ne se passe. la syntaxe du if (if expr-test action-si-vrai [action-si-faux]) S'il y a plusieurs actions pour vrai ou pour faux, il faut mettre ces actions entre (progn ...), comme ceci (if expr-test (progn ;; alors (action-si-vrai1) (action-si-vrai2) ... ) ;; fin alors (progn ;; sinon (action-si-faux1) (action-si-faux2) ... ) ;; fin sinon ) ;; fin si Dans ton code, tu n'as mis qu'un seul (progn ...) : tout est donc regroupé dans le alors et il n'y a rien dans le sinon. Par ailleurs, pour utiliser la commande déplacer, il faut dire ce que l'on veut déplacer, ensuite indiquer un point de départ puis un point d'arrivée. Il faut préférer l'utilisation des noms de commandes internationales. (command "_move" e "" '(0 0 0) '(1 0 0)) où e est l'objet (ou le jeu de sélection) qu'on déplace de 1 unité vers la droite. Un point est une liste de 2 ou 3 réels qu'on peut construire avec la commande list. Attention aux accrochages aux objets : les ligne (command ...) y sont sensibles et il vaut mieux les inactiver pendant l'exécution du lisp. (setq ab(fix(/ b 20))) (setq abc(/ (- b (* ab 20)) 2 )) (setq e (car (entsel))) ;; sélectionne un objet ;; déplace l'objet de abc unités vers la droite, sans tenir compte des accroches objet (command "_move" e "" "_non" '(0 0) "_non" (list abc 0)) Quelques bases de syntaxe lisp utiles pour bien appréhender ce langage. Amicalement Vincent [Edité le 16/3/2010 par zebulon_]
-
Bonjour, il faut quand même faire attention avec fix et rtos. Outre le fait que le premier retourne un entier et le second un texte, il y a aussi que fix retourne la partie entière et rtos un arrondi. Commande: (fix 20.7) 20 Commande: (rtos 20.7 2 0) "21" Si on souhaite obtenir l'entier arrondi et non plus la partie entière, on peut toujours utiliser la commande fix, mais il faut rajouter 0.5 à la valeur du nombre. (setq x 20.7) (setq y 20.2) (fix (+ x 0.5)) retourne 21 (fix (+ y 0.5)) retourne 20 Amicalement Vincent
-
Bonjour, ;; Ces définitions de types de lignes utilisent LTYPESHP.SHX. ;; *DPU,cercles 0 0 0 0 0 0 A,0,[CIRC1,ltypeshp.shx,x=-2.54,s=2.54],-12.7 en s'inspirant des type de ligne LIMITE1 et LIMITE2 qu'on trouve dans acadiso.lin. Cela fait des lignes composées de cercles vides. Amicalement Vincent
-
Réptition le long d\'une ligne ou courbe
zebulon_ a répondu à un(e) sujet de Ladinde dans Visual LISP
Bonjour, Une GBA est un élément linéaire. De ce fait, je ne vois pas où il est nécessaire d'insérer des blocs le long d'un axe ? Il suffit de décaler l'axe de part et d'autre d'une demi-largeur de GBA. Si on parle de glissières métalliques, avec des montants tous les 2m ou 4m, c'est différent et la solutions de bseb67 est à utiliser. Salutations Vincent -
Si j'ai bien compris, les vlr-object-reactor sont un peu différent des autres réacteurs, puisqu'il faut "associer" un objet avec le réacteur. Quand l'objet est modifié, le réacteur se met en route. Par défaut, cette association n'est pas persistante et on la perd quand on quitte le fichier, sauf si on rend ce réacteur persistant avec la commande (vlr-pers reactor) Amicalement Vincent
-
Bonjour, je fais pas mal de béton armé et pour les plan de ferraillage, je trace des polylignes dont les épaisseurs correspondent au diamètre extérieur des aciers. Comme chaque nuance d'acier est sur un calque à part, je souhaite avoir le bon PLINEWID dès que change le calque courant. ex : le calque courant est "HA12", PLINEWID devient 0.014 ;;; Lisp à charger uniquement ... ne pas exécuter !!! (vl-load-com) (vlr-sysvar-reactor nil '((:vlr-sysvarchanged . plinewidcallback)) ) (defun plinewidcallback (event parameter / lst CLAY) (setq lst '(("HA6" 0.007) ("HA8" 0.010) ("HA10" 0.012) ("HA12" 0.014) ("HA14" 0.016) ("HA16" 0.019) ("HA20" 0.024) ("HA25" 0.030) ("HA32" 0.038) ("HA40" 0.048) ) ) (If (eq (car parameter) "CLAYER") (progn (setq CLAY (strcase (getvar "CLAYER"))) (if (member CLAY (mapcar 'car lst)) (setvar "PLINEWID" (cadr (assoc CLAY lst))) (setvar "PLINEWID" 0) ) ) ) ) Par ailleurs, quel est le réacteur que je pourrais utiliser pour modifier l'épaisseur d'une polyligne existante dont je viens de changer le calque ? Merci Salutations Vincent
-
Bonjour, elle fonctionne pour la version 2004. Que veux-tu faire ou obtenir exactement ? Amicalement Vincent
