-
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)
-
Salut, C'est RE-INIT comme re-initialiser (il doit s'agir d'une faute de frappe)
-
Pour l'echelle dans une fenêtre, on peut aussi utiliser la barre d'otils "Fenêtres", il faut la garder horizontale pour avoir la liste déroulante des échelles. Tu sélectionnes ta fenêtre, et tu peux modifier directement l'échelle en en choisissant une dans la liste déroulante ou en spécifier une autre.
-
projection de solides 3d en 2d face caché
(gile) a répondu à un(e) sujet de franççois dans AutoCAD 2000 à 2002
Salut, La commande SOLPROF (menu Dessin -> Solides -> Configuration), à utiliser dans l'espace objet d'une fenêtre de présentation, génère sur 2 nouveaux calques, des blocs 2D correspondant aux projections des lignes visibles (calque VIS) et aux lignes cachées (calque HID) des solides 3D. Un sujet ici, sinon fais "Rechercher dans les forums" avec le mot solprof. -
Suite à ce sujet et à une autre discussion ici, j'ai un peu creusé la question des interférences (collisions) entre les objets 2D. Le LISP crée une région sur les interférences entre tous les objets 2D sélectionnés (cercles, ellipses, lwpolylignes, blocs). Le LISP utilise la commande REGION et ne fonctionne donc pas sur les polygones croisés (lwpolylignes ou composants de blocs) La région est de la couleur spécifiée (on peut aussi choisir DUCALQUE après avoir activé un calque). Seuls les objets situés sur le plan XY du SCU courant (quelque soit celui-ci) peuvent être sélectionnés. Taper INTERFERE_2D pour lancer la commande Supprimer les espaces après les " ;;; INTERFERE_2D -Gilles Chanteau- 22/06/06 ;;; Crée une région aux interférences des objets du jeu de sélection : ;;; blocs (si contour fermé), polylignes fermées, cercles, ellipses, splines. ;;; Fonctionne uniquement dans le plan du SCU courant ;;; Les objets d'interférences sont mis en "surbrillance". ;;; Lutilisateur choisit de les supprimer ou de les conserver, dans ce cas, il lui ;;; est proposé de les placer sur un calque spécifique et/ou de forcer leur couleur. ;;;*****************************************************************;;; ;; Re-définition de *error* (defun inter_err (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur : " msg)) ) (vla-EndUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) ) ;;;*****************************************************************;;; ;; Création de la région d'intersection entre deux objets (defun inter_reg (lst) ;; Transforme la liste (objet1 objet2) ;; en liste de paires pointée ((lst_composants1 . region1) (lst_composants2 . region2)) ;; lst_compsants ou nil si la décomposition est impossible (cercle, ellipse) ;; region ou "err" si la création de région est impossible (setq lst (mapcar '(lambda (x / ent reg) (if (vl-catch-all-error-p (setq ent (vl-catch-all-apply ;_ liste des composants 'vlax-invoke (list x 'explode) ) ) ) (setq ent nil) ;_ pas de décomposition ) (setq reg (vl-catch-all-apply ;_ liste des régions créées 'vlax-invoke (list ModSp 'addRegion (cond (ent) (T (list x)) ) ) ) ) (if (vl-catch-all-error-p reg) (cons ent "err") ;_ paire pointée si pas de région créée ;; union des régions (progn (while (cadr reg) (vla-boolean (car reg) acUnion (cadr reg) ) (setq reg (cons (car reg) (cddr reg))) ) (cons ent (car reg)) ;_ paire pointée si une région créée ) ) ) lst ) ) ;; suppression des composants des objets décomposés (mapcar 'vla-erase (apply 'append (mapcar 'car lst))) ;; intersection des deux régions et mise en surbrillance ;; ou suppression de l'unique région créée (cond ((and (/= (cdar lst) "err") (/= (cdadr lst) "err")) (vla-boolean (cdar lst) acIntersection (cdadr lst)) (if ( (progn (vla-Highlight (cdar lst) :vlax-True) (setq int_lst (cons (cdar lst) int_lst)) ) ) ) ((/= (cdar lst) "err") (vla-delete (cdar lst))) ((/= (cdadr lst) "err") (vla-delete (cdadr lst))) ) ) ;;;*****************************************************************;;; ;; Fonction principale (defun c:interfere_2d (/ AcDoc ModSp ucszdir ss n lst int_lst col lay) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) ModSp (vla-get-ModelSpace AcDoc) ) (setq m:err *error* *error* inter_err ucszdir (trans '(0 0 1) 1 0 T) ) (vla-StartUndoMark AcDoc) ;; Sélection des objets (prompt "\nSélectionnez les objets à traiter: ") (setq ss (ssget (list '(-4 . "[color=#CC0000] '(-4 . "[color=#CC0000] '(0 . "LWPOLYLINE") (cons 38 (caddr (trans '(0.0 0.0 0.0) 1 ucszdir))) '(-4 . "and>") '(-4 . "[color=#CC0000] '(0 . "CIRCLE,ELLIPSE,SPLINE,INSERT,") '(-4 . "*,*,=") (cons 10 (trans '(0.0 0.0 0.0) 1 ucszdir)) '(-4 . "and>") '(-4 . "or>") (cons 210 ucszdir) ) ) ) ;; liste des objets sélectionnés (if ss (progn (repeat (setq n (sslength ss)) (setq lst (cons (vlax-ename->vla-object (ssname ss (setq n (1- n)))) lst ) ) ) ;; Boucle pour rechercher les intersections entre chacun des objets ;; et chaque objet placé après lui dans la liste (while (cadr lst) (repeat (- (setq n (length lst)) 1) (inter_reg (list (car lst) (nth (setq n (1- n)) lst))) ) (setq lst (cdr lst)) ) ) ) (if int_lst (progn ;; Choix de la conservation des objets d'interférences (initget "Oui Non") (cond ((= "Non" (getkword (strcat "\n " (itoa (length int_lst)) " interférence(s) on été trouvées." "\nConserver les objets d'interférences ? [Oui/Non] : " ) ) ) ;; Suppression des objets (mapcar 'vla-delete int_lst) ) ;; choix du calque (T (initget "Oui Non") (if (= "Oui" (getkword "\nMettre les objets d'interférences sur un calque spécifique ? [Oui/Non] : " ) ) (progn (if (not *Interfere_layer*) (setq *Interfere_layer* "Interfere_2d") ) (setq lay (getstring (strcat "\nEntrez le nom du calque *Interfere_layer* ">: " ) ) ) (if (or (not lay) (= "" lay)) (setq lay *Interfere_layer*) (setq *Interfere_layer* lay) ) (vla-add (vla-get-Layers AcDoc) lay) (mapcar '(lambda (x) (vla-put-Layer x lay) ) int_lst ) ) ) ;; Choix de la couleur (initget "Oui Non") (if (= "Oui" (getkword "\nForcer la couleur des objets d'interférences ? [Oui/Non] : " ) ) (progn (prompt "\nSélectionnez la couleur pour les interférences." ) (while (not (setq col (acad_colordlg (cond ((= (getvar "CECOLOR") "BYLAYER") 256) ((= (getvar "CECOLOR") "BYBLOCK") 0) (T (getvar "CECOLOR")) ) ) ) ) ) (mapcar '(lambda (x) (vla-put-Color x col) ) int_lst ) ) ) (mapcar '(lambda (x) (vla-HighLight x :vlax-false) ) int_lst ) ) ) ) (princ "\nAucune interférence n'a été trouvée.") ) (vla-EndUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) )[Edité le 20/6/2006 par (gile)][Edité le 20/6/2006 par (gile)] [Edité le 22/6/2006 par (gile)]
-
Oh non, d'autres auraient très bien pu le faire (et le faire très bien), certains ont une bien plus grande pratique du LISP que moi. C'est, comme tu dis une question de disponibilté, ils devaient être parti en week end.
-
Dans une version 2006 ou 2007, dans la fenêtre "Personnaliser l'interface utilisateur" (commande CUI ou IUP), tu déroules l'arborescence "Barres d'outils", tu sélectionnes la barre dans laquelle tu veux mettre ton icône réroulante, tu fais clic droit -> Nouveau -> Icône déroulante, puis tu fais cliquer/déposer la barre d'outil que tu veux mettre dans ta nouvelle icône. Pas trop difficile non plus ;)
-
Salut et bravo, Faire des boites dialogues avec .lsp et .dcl est une chose fort ingrate. L'argument Dia passait bien mais je pense que la routine buggait à cause de l'appel à (getpoint ...) La réponse était dans l'aide aux développeurs ->AutoLISP Developer's Guide -> Working with Programmable Dialog Boxes -> Managing Dialog Boxes -> Controlling Dialog Boxes with AutoLISP Programs -> Functions Restricted When a Dialog Box Is Open
-
Salut, À première vue, l'erreur doit venir de l'utilsation des radio_button : la valeur -$value ou (get_tile ...)- retournée par un radio_button est "1" si le bouton est "enfoncé", sinon "0". Tu dois donc faire un truc du genre : (action_tile "dix" "(if (= \"1\" $value) (setq dia 10.0))") et ce, pour chaque bouton, ou dans le (action_tile "accept"...) "(cond " "((= (get_tile \"dix\") \"1\") (setq Dia 10.0))" "((= (get_tile \"dou\") \"1\") (setq Dia 12.0))" ... ) Note que je donne des valeurs réelles (10.0 et pas 10) pour éviter toute erreur du style : (/ 27 2) qui retournerait 13 et pas 13.5 Je te laisse chercher un peu, c'est comme çà qu'on comprend le mieux... [Edité le 18/6/2006 par (gile)]
-
Salut, L'éditeur de blocs des versions 2006 et 2007 est une fenêtre de travail spéciale qui a été créé pour y faire les blocs dynamiques. On peut aussi y modifier les définitions de blocs non-dynamiques. pour modifier une référence de bloc, c'est la commande EDITREF.
-
Salut, Suite à tes réponses Point 1 : donc on écrit (defun BlsFace (Dia / ...) ...) sans le C: Point 2 : Tu as raison, vas à ton rythme. Point 3 : Évitons de lisper trop tard le soir, on fait des bétises (voir ci-dessous) Point 4 : C'est en reproduisant ce qu'on fait à la ligne de commande qu'on trouve les syntaxes pour les commandes (des fois la syntaxe est un peu différente mais le plus souvent çà marche). Ce à quoi il faut faire attention et qui provoque souvent des erreurs, c'est la présence et le nombres de ENTER (""). L'erreur dans ton code vient de là. Je l'avais mal située hier soir, ton (command "_.hatch" ...) était juste, c'est dans (command "_.circle" ...) qu'il y a un ENTER de trop (on n'en met pas pour valider une entrée (point, distance, ...) Deuxième correction, donc : (defun BlsFace (/ Dia Axe DemAxe Cent XCent YCent PoinHa PoinBa PoinGa PoinDo ObjCer ) (setq Axe (+ Dia 20)) (setq DemAxe (/ Axe 2)) (setq Cent (getpoint "Entrer le centre du boulon : ")) (setq XCent (car Cent)) (setq YCent (cadr Cent)) (setq PoinHa (list XCent (+ YCent DemAxe))) (setq PoinBa (list XCent (- YCent DemAxe))) (setq PoinGa (list (- XCent DemAxe) YCent)) (setq PoinDo (list (+ XCent DemAxe) YCent)) (command "_.line" PoinHa PoinBa "") (command "_.line" PoinGa PoinDo "") (command "_.circle" Cent (/ Dia 2)) (setq ObjCer (entlast)) (command "_.hatch" "_s" ObjCer "") (princ) )
-
Bonsoir, Première remarque, le (defun C:BlsFace (Dia / ) ...) Ce n'est pas une erreur mais on utilise normalement (defun c:routine ...) pourdéfinir un nom de commande qu'on pourra appeler ensuite directement en tapant routine comme on le fait avec les commandes prédéfinies d'AutoCAD. Or ta fonction nécessite un argument, on ne peut donc la lancer qu'en tapant (C:BlsFace 8) par exemple. Dans ce cas on fait plutôt : (defun C:BlsFace (Dia / ) ...) ou alors on acquiert la valeur de Dia de l'utilisateur par un : (setq Dia (getdist "\spécifiez le diamètre: ")) une fois le LISP lancé. Voir ce fil Deuxième remarque, les variables locales Il est préférable de déclarer les variables pour éviter toute interaction avec d'autres LISP dans lesquels les mêmes variables ne seraient pas déclarées non plus. Voir ce message et les deux liens qui y sont donnés. À propos des (setq ..) justement, c'est surtout un affaire de style, mais tu peux définir (ou redéfinir) plusieurs variables dans le même (setq ...) : (setq ObjCer "" ObjCer (ssadd) Axe (+ Dia 20) DemAxe (/ Axe 2) Cent (getpoint "Entrer le centre du boulon : ") XCent (car Cent) YCent (cadr Cent) PoinHa (list XCent (+ YCent DemAxe)) PoinBa (list XCent (- YCent DemAxe)) PoinGa (list (- XCent DemAxe) YCent) PoinDo (list (+ XCent DemAxe) YCent)) Troisième remarque : ObjCer Tu définis inutilement cette variable 2 fois (setq ObjCer "") et (setq ObjCer (ssadd)), la première fois un "blank" (une chaine vide) puis un jeu de sélection vide pour finalement, plus loin lui attribuer un nom d'entité, et à la fin un (princ ObjCer) curieux :casstet: Quatrième remarque : les noms de commande Il est préférable de mettre les noms de commandes et d'options de commande en langage international Voir ici et là entre autre. Pour ce qu'il en est de l'erreur elle vient de la commande _hatch il faut écrire : (command "_.-hatch" "_s" ObjCer "" "" "") Le corrigé : (defun C:BlsFace (/ Dia Axe DemAxe Cent XCent YCent PoinHa PoinBa PoinGa PoinDo ObjCer ) (setq Dia (getdist "\spécifiez le diamètre: ") Axe (+ Dia 20) DemAxe (/ Axe 2) Cent (getpoint "Entrer le centre du boulon : ") XCent (car Cent) YCent (cadr Cent) PoinHa (list XCent (+ YCent DemAxe)) PoinBa (list XCent (- YCent DemAxe)) PoinGa (list (- XCent DemAxe) YCent) PoinDo (list (+ XCent DemAxe) YCent) ) (command "_line" PoinHa PoinBa "") (command "_line" PoinGa PoinDo "") (command "_circle" Cent (/ Dia 2) "") (setq ObjCer (entlast)) (command "_.-hatch" "_s" ObjCer "" "" "") (princ) )
-
En essayant de répondre à une demande un peu similaire, mais concernant les polylignes ici, j'ai un peu creusé la question. J'ai trouvé une faille concernant les blocs dont les composants ne peuvent générer de région (et le moyen d'y remédier). Je corrige le LISP.
-
Salut, Je ne suis pas sûr de bien comprendre ce que tu veux, mais pour se mettre dans l'espace objet d'une fenêtre de présentation, tu double-cliques à l'intérieur de la fenêtre, pour revenir à l'espace papier, tu double-cliques à l'extérieur.
-
Mon idée pour le débillardage est plutôt d'oublier le décalage ou la copie verticale pour les raisons évoquées plus haut. Je continuerais à chercher du côté de _loft en utilisant les "cOUpes uniquement" (pas de chemin), l'idée étant de mettre : soit une coupe par sommet de la poly et option "Réglé" si tu veux garder des "facettes". http://img99.imageshack.us/img99/8501/poly58fk.png http://img99.imageshack.us/img99/4069/poly66nl.png soit une coupe au milieu de chaque segment et option "Lissée/Ajustée" si tu veux un profil lissé http://img105.imageshack.us/img105/1811/poly70nv.png http://img76.imageshack.us/img76/8533/poly88hn.png Le résultat n'est pas très probant sur un poly à 2 segments avec un angle conséquent, mais pourrait être suffisant pour une vraie main courante ou un limon ... [Edité le 17/6/2006 par (gile)]
-
Salut, Sur quelle version d'AutoCAD, si c'est bien d'AutoCAD qu'il s'agit ?
-
Tu peux m'envoyer les images, je t'ai envoyé un courriel à l'adresse trouvée sur ton site.
-
Salut et bienvenue, Si les objets 3D sont des solides, tu peux voir du côté des commandes _solprof ou _solview et _soldraw. Pour _solprof, une explication ici. Regardes aussi dans l'aide d'AutoCAD pour ces commandes.
-
J'ai un peu réfléchi, toutes les possibilités de décalage d'un segment de poly3D sont contenues dans l'ensemble des génératrices du cylindre ayant pour axe le segment et pour rayon la distance de décalage. Les décalages d'une poly3D serait donc les génératrices jointives de tous les cylindres générés par tous les segments de la poly3D. Le plan dans lequel est choisi le décalage du premier segment (où qu'il se trouve dans la poly3D) determine donc les segments suivants. En images, à gauche : la vue isométrique sud-est, en haut à droite : la vue de face, en bas à droite : la vue de dessus. En rouge un poly3D, en gris sa projection sur le plan. http://img207.imageshack.us/img207/3535/poly18zu.png Les cylindres générés par les segments dont on récupère les arrêtes d'intersection http://img118.imageshack.us/img118/8707/poly28de.png En vert le décalge de la poly3D, choisi dans le plan vertical du premier segment (celui de gauche). On voit bien le "vrillage" dans la vue de dessus : le décalage n'est pas dans le plan vertical du segment de la poly3D. http://img146.imageshack.us/img146/5302/poly31mr.png L'extrusion d'un profil "à arrêtes" (ici un carré) suivant le chemin de la poly3D subit le même "vrillage". http://img146.imageshack.us/img146/9237/poly49zc.png Pour avoir un profil "débillardé" avec AutoCAD 2007, j'utiliserais plutôt la commande LISSAGE (_LOFT).
-
Sur AutoCAD 2007 OSNAPHATCH est obsolète. C'est OSOPTIONS qui gère l'accrochage aux hachures ainsi que l'accrochage aux objets avec des valeurs Z négatives lors de l'utilisation d'un SCU dynamique.
-
Re, Le repérége d'accrochage aux objets dépend du paramétrage des accrochages permanents, d'après ce que tu décris il faut que le mode d'accrochage "Extension" soit actif.
-
Salut, Dans la boite de dialogue Options ... (dans le menu Outils ou le Menu contextuel par défaut) à l'onglet Dessin -> Ignorer les objets de hachures.
-
Je ne vais pas te noter ;) Les erreurs : (car lst) -> premier élément (là tu as juste) (cdr lst) -> la liste privée du premier élément (cadr lst) équivaut à (car (cdr lst)) soit le premier élément de la liste privée du premier élément, donc le deuxième élément de la liste. De la même façon (caddr lst) est le troisième élément de la liste. Ceci pour les plus courament utilisé (car pt) -> X, (cadr pt) -> Y, (caddr pt) ->Z Ont peut faire d'autres combinaisons jusquà quatre niveaux d'imbrication, c'est expliqué dans l'aide aux dévellopeurs -> AutoLISP Developer's Guide -> Using the AutoLISP Language -> AutoLISP Basics -> AutoLISP Expressions -> List Handling -> Point Lists. Ces fonctions sont très utiles le LISP (LISt Processing) ets un langage de manipulation de listes. Normal, l'erreur vient de moi, j'ai copié/collé sans relire val_dxf et un (defun ...) perso, j'aurais dû écrire (cdr (assoc 38 (entget ent))) le code de groupe 38 des lwpolylines est celui de l'élévation de l'objet. Des précisions : mapcar, je te l'ai déjà expliqué, mais il faut bien retenir que mapcar retourne une liste. dans cett petite routine la listée retournée par (mapcar 'cdr ...) est l'argument pour (mapcar '(lambda ... ) ...) Translation va bien, pour son sens en français et sa traduction (justement) de l'anglais. la point pt (auquel on a précisé l'élévation) est translaté/traduit du SCO au SCG. Retourne la liste sans les éléments qui ne retournent pas T à la fonction, dans ce cas le (lambda ...) avec vl-remove-if-not, vl-remove-if, vl-every, vl-some la fonction (predicate function) doit être une fonction qui retourne T ou nil. Donc dans ce cas, enlève de la liste entget tous les élément (liste ou paires pointées) dont le premier élément n'est pas 10. La lista retournée par (vl-remove-if-not ...) est l'argument pour (mapcar 'cdr ...)
-
Ces deux patch ne semblent en fait n'en être qu'un il s'agit du même fichier acdb17.dll
-
Je viens de recevoir ce message d'Autodesk, un correctif pour les problèmes de Copier/Coller dans les dessins enregistrés au format AutoCAD 2000 à partir d'AutoCAD 2007. Ceci explique peut-être quelques messages lus ici ou là. C'est ici. [Edité le 16/6/2006 par (gile)]
-
Pour avoir les coordonnées des sommets d'une Lwpolyline, je crois que maintenant tu sais où trouver. Attention toutefois, les coordonnées retournées sont définies dans le SCO, pour les avoir dans le SCG faire : ;; Liste des sommets d'une lwpolyligne (dans le SCG) (defun lwpoly_pts (ent) (mapcar '(lambda (pt) (trans (list (car pt) (cadr pt) (val_dxf 38 ent)) ent 0) ) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent) ) ) ) ) Le vecteur de pt1 à pt2 : (mapcar '- pt2 pt1) Pour le vecteur normé (de 1 unité) et des utilisations possible des vecteurs vois ici Pour les réacteurs, je ne peux pas t'aider, je ne me suis pas encore penché sur la question.
