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. Salut, Il n'est pas nécessaire de mettre CMDECHO à 0 si tu n'utilise pas la fonction (command ...) Il n'est pas necessaire de faire (if (condition_1) ...) (if (pas_condition_1) ... ), il suffit de faire : (if (condition_1) (action_si_condition_remplie) (action_si_condition_pas_remplie) ) ((if (/ Ech nil) ... ) est incorrect, je suppose que tu voulais écrire (if (/= ech nil) ... ) qui peut s'écrire plus simplement (if Ech ...) (strcat ... ) n'accepte comme argument que des chaines (ou des variables dont la valeur est une chaine),or la valeur de Ech est un réel (getreal) il faut donc écrire (rtos Ech) pour transformer Ech en chaine ou (itoa (fix Ech)) si tu veux un entier. J'ai rajouté un (if ...) à l'intérieur du (progn ... ) si Ech est déjà défini de façon à ce que si l'utilisateur ne veuille pas redéfinir Ech il puisse simplement taperENTER ou faire clic droit et un (princ) à la fin de la routine pour que la dernière interprétation ne se répète 2 fois sur la ligne de command. (defun c:xPhChEch (/ Ech) (setq Ech (vlax-ldata-get "Phalene" "Echel1")) (if Ech ;; si Ech est déjà défini (progn (if (setq Ech (getreal (strcat "Ancienne échelle (1/" (rtos Ech) ") - Nouvelle échelle: 1/" ) ) ) ;; Si Ech est re-défini (vlax-ldata-put "Phalene" "Echel1" Ech) ) ;_ Fin de if (princ (strcat "\nEchelle = 1/" (rtos (vlax-ldata-get "Phalene" "Echel1"))) ) ) ;_ Fin de progn ;; si Ech n'est pas encore défini (progn (setq Ech (getreal "Échelle du dessin 1/")) (vlax-ldata-put "Phalene" "Echel1" Ech) (princ (strcat "\nEchelle = 1/" (rtos (vlax-ldata-get "Phalene" "Echel1"))) ) ) ) (princ) ) [Edité le 24/5/2006 par (gile)]
  2. Re (... suite) (defun TypLign (Nom /) (if (not (tblsearch "LTYPE" [surligneur]TypLign[/surligneur])) (command "-typeligne" "ch" Nom "s:/config/Phalène/Phalène.lin" "" "" "" "" "" "" "" "") ) ) Je suppose que tu voulais écrire (tblsearch "LTYPE" Nom) ? (defun StylTxt (Nom Police Comp Inclin /) (setvar "cmdecho" 0) ) Je suppose qu'il manque des bouts ? La routine StylTxt ne fait que mettre CMDECHO à 0 (qui est déjà à 0 quand la routine est appelée par la fonction Ph_Crea_Calq). Soit tu gères les variables dans la fonction principale et elles conservent leurs valeurs lors des appels des sous routines, soit tu les gères pour chaque sous routines. NOTA : quand on modifie les valeurs des variables système juste pour l'exécution d'un LISP, il est préférable de restaurer leurs valeurs initiales aux variables en fin de routine. (defun MaRoutine (/ old_echo) (setq old_echo (getvar "CMDECHO")) (setvar old_echo 0) ... ;; Autant de lignes de codes et d'appels à des sous-routines ... ;; que tu veux, pour lesquels CMDECHO est désactivé. (setvar "CMDECHO" old_echo) ) À mon avis il est aussi préférable, quand on joue avec les variables système, de redéfinir la fonction *error* pour que les valeurs initiales des variables soient restaurées en cas d'erreur ou d'annulation. Tu peux faire une recherche dans les forums, le sujet a souvent été abordé, mais il n'y a là rien d'indispensable, c'est un plus que tu pourras étudier plus tard... [Edité le 24/5/2006 par (gile)]
  3. Salut, Encore beaucoup d'erreurs de paranthèses - Avec cond, comme je te le disais ailleurs, chaque groupe (condition/action_si_condition_remplie) doit être inclus à l'intérieur de paranthèses - La valeur affectée à une variable, si c'est un entier, un réél, une chaine ou un symbole, ne doit pas être incluse à l'intérieur de paranthèses. (defun Ph_Crea_Calq (Nom Coul Lign /) (setvar "cmdecho" 0) (cond [b]([/b](or (= Lign "Cloture-Piquet-Bois") (= Lign "Cloture-Piquet-Fer") ) ;_ fin de or (setq Nom "Cloture1") ;_ Nom de la police dans le DWG (setq Police "simplex.shx") ;_ Nom de la police windows (ttf ou shx) (setq Comp 1) ;_ facteur de compression (setq Inclin 0) ;_ Angle d'inclinaisonn (StylTxt (Nom Police Comp Inclin)) [b])[/b] ;_ fin du groupe condition/action_si_condition_remplie ) ;_ fin de cond (TypLign Lign) ) ;_ fin de defun
  4. (gile)

    Modifier des blocs

    Comme à un changement d'unité correspond un changement d'échelle, j'ai ajouté une mise à jour de l'échelle des blocs insérées si ceux-ci sont définis dans une unité différente de celle spécifiée. Nous sommes donc rendus à la version 1.6
  5. (gile)

    Didier????

    S'il est moins assidu sur les forums, Didier continue de passer par ici, il a posté deux réponses avant-hier ici et là.
  6. Tu n'est pas obligé d'utiliser systématiquement un le rapport entre échelle et hauteur de texte. Je proposais çà pour que la routine n'échoue pas, tu fais tes (cond et à la fin, pour les échelles non spécifiées tu appliques ce rapport (entre paranthèses le cond comme tu l'as écrit est faux, chaque groupe condition/action(s) doit être inclus dans un groupe de paranthèses et pour 0.5 il faut écrire le 0) : (cond ((= Ech 50) (setq HTxt 0.2)) ((= Ech 100) (setq HTxt 0.5)) ((= Ech 150) (setq HTxt 0.8)) ((= Ech 200) (setq HTxt 1.2)) ((= Ech 250) (setq HTxt 1.5)) ((= Ech 500) (setq HTxt 2)) ((= Ech 650) (setq HTxt 2.2)) (. . . . . . . . . . . . . . .) (. . . . . . . . . . . .) (T (setq HTxt (/ Ech 250))) ) Tu pourrais même, dans le même esprit appliquer un rapport pour les échelles entre 1 et 200, un autre entre 201 et 500 etc... PS : 1/33 est, pour moi beaucoup mois bizarre que 1/650, c'est une échelle courament utilisée dans mon domaine (la contruction de décors) c'est plus grand que le 1/50 et au 1/20 les maquettes des décorateurs ne passent plus dans les portes. PPS : Je suis un "novice" d'AutoCAD comparé à toi, je ne pratique que depuis 3ans.
  7. Pourquoi ne pas utiliser un rapport constant entre l'échelle et la hauteur de texte ? (setq Htxt (/ Ech 250))
  8. Tu vas devoir apprendre un autre langage, le DCL, et comprendre les interactions entre LISP et DCL (c'est parfois fastidieux). Tu peux voir quelques exemples simples dans ce sujet ou celui-là Il existe aussi un utilitaire (payant) ObjectDCL qui marche, paraît-il fort bien (pas encore essayé), fais une recherche dans les forums.
  9. Salut, Tout d'abord, bien sûr que tu as fais des progrès ! Je décortique de manière succinte la ligne de code en partant de la paranthèse la plus "à l'intérieur" (tblobjname "block" "Constante_Echelle") retourne le nom d'entité de la définition de bloc du bloc "Constante_Echelle" récupérée dans la collection/table des blocs du dessin courant. Donc l'insertion d'une référence du bloc n'influe en rien sur la possibilité d'accéder à l'attribut, elle permet juste d'éviter que cette définition de bloc ne soit purgée du dessin. (entnext ename) retourne le nom d'entité de l'entité créée juste après ename ou, si ename est une entité complexe (polyligne, bloc avec attributs), la première "sous-entité" de ename (vertex ou attribut). Dans le cas qui nous occupe (entnext ... retourne le nom d'entité de l'unique attribut du bloc "Constante_Echelle". Donc si le bloc contient plusieurs attributs il faut faire une boucle avec (entnext ...) pour les récupérer tous. (entget ename) Retourne une liste associative des données de définition de l'entité ename, autrement dit la liste des valeurs DXF de l'entité. Chaque valeur est associée à un code de groupe. Exemple (tronqué, la liste est plus longue) : ((-1 . ) (0 . "ATTDEF") ... (8 . "Calque1") (100 . "AcDbText") (10 0.0 0.0 0.0) ... (1 . "250") ... (2 . "CONSTANTE") ...) Où -1 est le code de groupe nom_d'entité, 0 celui du type d'entité, 1 celui de la valeur de l'attribut. (assoc n liste_entget) retourne l'élément de la liste dont n est est le code, cet élément est une liste, le plus souvent une "paire pointée" (dotted pair), dans notre cas (1 . "250") (cdr liste) retourne la liste privée de son premier élément, dans notre cas "250" (read "250") retourne 250. [Edité le 22/5/2006 par (gile)]
  10. (gile)

    XDATA

    Il ne me semble pas, j'ai fais des essais rapport à ce sujet je n'ai pas vu de problème ni pour créer, ni pour récupérer des Xdata. en ce qui concerne la migration depuis des versions antérieures, je ne peux rien dire.
  11. Encore une fois, je dois m'incliner devant la "simplicité" d'utilisation des fonctions vlax, et les connaissances de Patrick_35. :D Je poste quand même une autre façon de faire, avec une donnée étendue dans un point comme le suggérait aussi Bonuscad, en pur AutoLISP (ce qui n'est pas forcément le plus simple pour "Débuter en LISP") :cool: pour stocker la valeur de const dans un point créé sur le calque Defpoint : (regapp "CONSTANTE_ECHELLE") (entmake (list '(0 . "point") '(10 0.0 0.0 0.0) '(8 . "defpoint") (list -3 (list "CONSTANTE_ECHELLE" (cons 1042 const))) ) ) et pour récupérer la valeur : (cdr (assoc 1042 (cdadr (assoc -3 (entget (ssname (ssget "_X" '((-3 ("CONSTANTE_ECHELLE"))) ) 0 ) '("CONSTANTE_ECHELLE") ) ) ) ) ) PS : j'ai choisis le code 1042 parcequ'il m'a semblé comprendre qu'il s'agissait d'un facteur d'échelle, mais tu peux choisir 1040 pour un réél ou un autre (CF Référence DXF -> Format DXF -> Codes de groupe par ordre numérique dans l'aide aux développeurs) Sinon, avec un bloc, si tu veux éviter le risque d'une purge du bloc, tu peux, comme le suggère Bonuscad, rendre l'attribut invisible en ajoutant le bit 1 à la variable AFLAGS (setvar "AFLAGS" 19) et l'insérer sur le calque de ton choix.
  12. (gile)

    Demande correction....

    Essaye,avec la console VisualLISP qui sert à çà, ou directement à la ligne de commande. Tu entres (setq La (getdist "\nLargeur de la pile : ")) puis tu interroges pour avoir la valeur de La, à la ligne de commande : avec la console : http://img106.imageshack.us/img106/6808/console8qz.png Ce sachant, deux solutions, exiger une entrée valide avec (initget (+ 1 2)) ou accepter 0 ou nil comme entrée et affecter la valeur de Lo dans un cas ou dans l'autre. Je te laisse chercher. [Edité le 21/5/2006 par (gile)]
  13. (gile)

    Demande correction....

    Si tu veux qu'on ne puisse pas affecter 0 à la variable La, tu peux faire un : (initget 2) juste avant : (setq La (getdist "\nLargeur de la pile : " p1)) Voir la fonction INITGET dans l'aide, il peut être interressant de l'utiliser pour tous les (getXXX....
  14. Il n'est pas nécessaire d'insérer le bloc. Essaye de décortiquer la ligne (read (cdr (assoc 1 (entget (entnext (tblobjname "block" "Constante_Echelle")))))) avec l'aide, c'est un bon exercice. La valeur attribuée à la variable const peut être indifféremment un entier, un réel, ou une chaine (200, 200.00 ou "200").
  15. Tu peux utiliser les variables système USERR1, USERR2, USERR3, USERR4, USERR5 pour stocker des nombres réels (USERI1, USERI2,... pour des entiers). Ou encore, si tu crains que les variables ci dessus soient modifiées, tu peux créer un bloc "Constante_Echelle" ne contenant qu'un attribut constant dont la valeur serait la constante à conserver. Pour créer le bloc en LISP (const contient la vleur de la constante) : (setvar "AFLAGS" 18) (command "_.-attdef" "" "constante" const '(0 0) "" "") (command "_.-block" "Constante_Echelle" '(0 0) (entlast) "") Pour récupérer la valeur de la constante : (read (cdr (assoc 1 (entget (entnext (tblobjname "block" "Constante_Echelle"))))))
  16. (gile)

    Demande correction....

    Salut, Juste en jetant un coup d'oeil. L'argument angle pour POLAR doit être exprimé en radians (/ pi 2) et pas 100. La fonction if : (if testexpr thenexpr [elseexpr]) n'accepte que 2 ou 3 arguments : - condition - action si la condition est remplie - action si elle ne l'est pas (optionnel) Dans ton code il y a 3 (command ... après le if. Si tu veux exécuter plusieurs choses dans une même action il faut les grouper dans un (progn ...
  17. (gile)

    Impression en vue 3D

    Salut, Excuse pour la réponse tardive je n'avais pas vu ton sujet. Dans le "Tableau de bord" de l'espace Modélisation, as tu essayé de jouer avec les curseurs à coté des boutons "Saillie de l'arête" "Crénelage de l'arête" "Arêtes de silhouette" ceci répond peut-être à tes problèmes. Pour infos ce sont respectivements les nouvelles variables système : VSEDGEOVERHANG, VSEDGEJITTER et VSSILHWIDTH.
  18. (gile)

    vla-InsertBlock

    Juste deux petits détails : Tu affectes 180° à Rot et ensuite tu fais une rotation de 180° en faisant une conversion pour avoir des radians, ce faisant, tu multiplies pi par 180 pour le diviser par 180. Il serait plus élégant de travailler directement en radians et faire simplement : (vla-rotate b (vlax-3d-point pt) pi) sans avoir besoin de définir Rot. Tu pourrais aussi éviter de définir une variable pour "MonBloc" et le passer directement comme argument à InsBlocdec_calqueTempo. Ce qui pourrait faire : defun c: MONLISP (/ pt) (setq pt (getpoint "\n Point d'insertion :")) (InsBlocdec_calqueTempo (trans pt 1 0) "MonBloc") ) ;;;;;;;;; Insert bloc rotation (Rot) degré + DECOMPOSER + mise sur calqueTempo ;;;;;;;;;;;;;;;;;;;;;; (defun InsBlocdec_calqueTempo (pt chem / a b) (setq a (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point pt) chem 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T))))) (foreach b (vlax-safearray->list(vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point pt) pi) (vla-put-layer b calque_Tempo)) (vla-delete a) )
  19. C'est très étonnant, j'ai fait ce LISP et je l'ai fait tourner avec une 2006, et je ne vois vraiment pas ce qui pourrait faire que çà marche avec 2004 et pas avec 2006 !
  20. (gile)

    vla-InsertBlock

    Pour un débutant, tu as mis la barre plutôt haut ! Je pense que le VisualLISP n'est le plus facile pour commencer parcequ'il ne dispense pas de manipuler aussi AutoLISP qui reste la base. Et les problèmes en 3D (SCU non parallèles au SCG) ne sont pas toujours facile à appréhender.
  21. (gile)

    vla-InsertBlock

    C'était ici.
  22. (gile)

    vla-InsertBlock

    Çà m'est revenu, le problème avait déjà été posé je ne sais plus où. Il faut traduire UCSXDIR dans la normale du plan : (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point (trans pt 1 0)) "mon block" 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T))) )
  23. (gile)

    Polylignes VS Régions...

    Je me permet de répondre à la place de Bonuscad (il est déconnecté) Le point temporaire est une sorte de balise qui marque le départ de la boucle qui récupère les lignes issues de la région explosée. J'ai juste ajouté une ligne au LISP de Bonuscad pour le message en cas de sélection non-valide et un test sur la variable PEDITACCEPT. ((lambda (/) (command "_point" (getvar "lastpoint")) (setq e_mark (entlast)) (while (null (setq ent_sel (entsel "\nChoix de la région: "))) ) (cond ((eq (cdr (assoc 0 (entget (car ent_sel)))) "REGION") (command "_.explode" ent_sel) (setq js (ssadd)) (setq e_next (cdar (entget e_mark))) (while e_next (setq js (ssadd e_next js)) (setq e_next (entnext (cdar (entget e_next)))) ) (if (zerop (getvar "peditaccept")) (command "_.pedit" (cadr ent_sel) "_yes" "_join" js "" "") (command "_.pedit" (cadr ent_sel) "_join" js "" "") ) ) (T (prompt "\nL'entité sélectionnée n'est pas une région.")) ) (entdel e_mark) (prin1) ) )
  24. (gile)

    vla-InsertBlock

    Pour obtenir l'équivalent de UCSXDIR sur l'axe des Z du SCU courant, tu peux faire : (setq UCSZDIR (trans '(0 0 1) 1 0 T)) C'est ce qu'on appelle la direction d'extrusion ou le code 210 en dxf ou bien encore la propriété Normal en vla- Voir ce sujet. Mais il me semble que vla-insertblock insère le block dans le plan du SCU courant (à vérifier). [Edité le 19/5/2006 par (gile)]
  25. (gile)

    Polylignes VS Régions...

    Salut, si tu peux "isoler" tes régions (qu'il n'y ait pas d'interférences avec d'autres objets en vue de dessus) tu peux utiliser la commande CONTOUR (_boundary) en choisissant "Type d'objet" Polyligne, tu feras des poly par dessus les régions.
×
×
  • 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é